mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
i40e: initialize ITRN registers with correct values
[ Upstream commit998e5166e6] Since commit92418fb147("i40e/i40evf: Use usec value instead of reg value for ITR defines") the driver tracks the interrupt throttling intervals in single usec units, although the actual ITRN/ITR0 registers are programmed in 2 usec units. Most register programming flows in the driver correctly handle the conversion, although it is currently not applied when the registers are initialized to their default values. Most of the time this doesn't present a problem since the default values are usually immediately overwritten through the standard adaptive throttling mechanism, or updated manually by the user, but if adaptive throttling is disabled and the interval values are left alone then the incorrect value will persist. Since the intended default interval of 50 usecs (vs. 100 usecs as programmed) performs better for most traffic workloads, this can lead to performance regressions. This patch adds the correct conversion when writing the initial values to the ITRN registers. Signed-off-by: Nicholas Nunley <nicholas.d.nunley@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
12d29ebf6b
commit
00b0f7d9d4
@@ -3534,14 +3534,14 @@ static void i40e_vsi_configure_msix(struct i40e_vsi *vsi)
|
||||
q_vector->rx.target_itr =
|
||||
ITR_TO_REG(vsi->rx_rings[i]->itr_setting);
|
||||
wr32(hw, I40E_PFINT_ITRN(I40E_RX_ITR, vector - 1),
|
||||
q_vector->rx.target_itr);
|
||||
q_vector->rx.target_itr >> 1);
|
||||
q_vector->rx.current_itr = q_vector->rx.target_itr;
|
||||
|
||||
q_vector->tx.next_update = jiffies + 1;
|
||||
q_vector->tx.target_itr =
|
||||
ITR_TO_REG(vsi->tx_rings[i]->itr_setting);
|
||||
wr32(hw, I40E_PFINT_ITRN(I40E_TX_ITR, vector - 1),
|
||||
q_vector->tx.target_itr);
|
||||
q_vector->tx.target_itr >> 1);
|
||||
q_vector->tx.current_itr = q_vector->tx.target_itr;
|
||||
|
||||
wr32(hw, I40E_PFINT_RATEN(vector - 1),
|
||||
@@ -3646,11 +3646,11 @@ static void i40e_configure_msi_and_legacy(struct i40e_vsi *vsi)
|
||||
/* set the ITR configuration */
|
||||
q_vector->rx.next_update = jiffies + 1;
|
||||
q_vector->rx.target_itr = ITR_TO_REG(vsi->rx_rings[0]->itr_setting);
|
||||
wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), q_vector->rx.target_itr);
|
||||
wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), q_vector->rx.target_itr >> 1);
|
||||
q_vector->rx.current_itr = q_vector->rx.target_itr;
|
||||
q_vector->tx.next_update = jiffies + 1;
|
||||
q_vector->tx.target_itr = ITR_TO_REG(vsi->tx_rings[0]->itr_setting);
|
||||
wr32(hw, I40E_PFINT_ITR0(I40E_TX_ITR), q_vector->tx.target_itr);
|
||||
wr32(hw, I40E_PFINT_ITR0(I40E_TX_ITR), q_vector->tx.target_itr >> 1);
|
||||
q_vector->tx.current_itr = q_vector->tx.target_itr;
|
||||
|
||||
i40e_enable_misc_int_causes(pf);
|
||||
@@ -11396,7 +11396,7 @@ static int i40e_setup_misc_vector(struct i40e_pf *pf)
|
||||
|
||||
/* associate no queues to the misc vector */
|
||||
wr32(hw, I40E_PFINT_LNKLST0, I40E_QUEUE_END_OF_LIST);
|
||||
wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), I40E_ITR_8K);
|
||||
wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), I40E_ITR_8K >> 1);
|
||||
|
||||
i40e_flush(hw);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user