Message ID | 20221024081942.34809-1-kamil.maziarz@intel.com |
---|---|
State | Accepted |
Delegated to: | Anthony Nguyen |
Headers | show |
Series | [net,v1] i40e: Fix not setting default xps_cpus after reset | expand |
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of > Kamil Maziarz > Sent: Monday, October 24, 2022 1:50 PM > To: intel-wired-lan@lists.osuosl.org > Cc: Jaron, MichalX <michalx.jaron@intel.com>; Maziarz, Kamil > <kamil.maziarz@intel.com> > Subject: [Intel-wired-lan] [PATCH net v1] i40e: Fix not setting default > xps_cpus after reset > > From: Michal Jaron <michalx.jaron@intel.com> > > During tx rings configuration default XPS queue config is set and > __I40E_TX_XPS_INIT_DONE is locked. __I40E_TX_XPS_INIT_DONE state is > cleared and set again with default mapping only during queues build, it > means after first setup or reset with queues rebuild. (i.e. > ethtool -L <interface> combined <number>) After other resets (i.e. > ethtool -t <interface>) XPS_INIT_DONE is not cleared and those default > maps cannot be set again. It results in cleared xps_cpus mapping until > queues are not rebuild or mapping is not set by user. > > Add clearing __I40E_TX_XPS_INIT_DONE state during reset to let the driver > set xps_cpus to defaults again after it was cleared. > > Fixes: 6f853d4f8e93 ("i40e: allow XPS with QoS enabled") > Signed-off-by: Michal Jaron <michalx.jaron@intel.com> > Signed-off-by: Kamil Maziarz <kamil.maziarz@intel.com> > --- > drivers/net/ethernet/intel/i40e/i40e_main.c | 19 ++++++++++++++++++- > 1 file changed, 18 insertions(+), 1 deletion(-) > Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 4b3b6e5b612d..2828c3629e6b 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -10674,6 +10674,21 @@ static int i40e_rebuild_channels(struct i40e_vsi *vsi) return 0; } +/** + * i40e_clean_xps_state - clean xps state for every tx_ring + * @vsi: ptr to the VSI + **/ +static void i40e_clean_xps_state(struct i40e_vsi *vsi) +{ + int i; + + if (vsi->tx_rings) + for (i = 0; i < vsi->num_queue_pairs; i++) + if (vsi->tx_rings[i]) + clear_bit(__I40E_TX_XPS_INIT_DONE, + vsi->tx_rings[i]->state); +} + /** * i40e_prep_for_reset - prep for the core to reset * @pf: board private structure @@ -10698,8 +10713,10 @@ static void i40e_prep_for_reset(struct i40e_pf *pf) i40e_pf_quiesce_all_vsi(pf); for (v = 0; v < pf->num_alloc_vsi; v++) { - if (pf->vsi[v]) + if (pf->vsi[v]) { + i40e_clean_xps_state(pf->vsi[v]); pf->vsi[v]->seid = 0; + } } i40e_shutdown_adminq(&pf->hw);