i40e: Fix oops at i40e_rebuild()
Setup TC before the i40e_setup_pf_switch() call. Memory must be initialized for all the queues before using its resources. Previously it could be possible that a call: xdp_rxq_info_reg(&rx_ring->xdp_rxq, rx_ring->netdev, rx_ring->queue_index, rx_ring->q_vector->napi.napi_id); was made with q_vector being null. Oops could show up with the following sequence: - no driver loaded - FW LLDP agent is on (flag disable-fw-lldp:off) - link is up - DCB configured with number of Traffic Classes that will not divide completely the default number of queues (usually cpu cores) - driver load - set private flag: disable-fw-lldp:on Fixes:4b208eaa80("i40e: Add init and default config of software based DCB") Fixes:b02e5a0ebb("xsk: Propagate napi_id to XDP socket Rx path") Signed-off-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com> Signed-off-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com> Tested-by: Tony Brelinski <tonyx.brelinski@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
This commit is contained in:
committed by
Tony Nguyen
parent
347b5650cd
commit
f2916ae9a1
@@ -10573,12 +10573,6 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)
|
|||||||
goto end_core_reset;
|
goto end_core_reset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!lock_acquired)
|
|
||||||
rtnl_lock();
|
|
||||||
ret = i40e_setup_pf_switch(pf, reinit);
|
|
||||||
if (ret)
|
|
||||||
goto end_unlock;
|
|
||||||
|
|
||||||
#ifdef CONFIG_I40E_DCB
|
#ifdef CONFIG_I40E_DCB
|
||||||
/* Enable FW to write a default DCB config on link-up
|
/* Enable FW to write a default DCB config on link-up
|
||||||
* unless I40E_FLAG_TC_MQPRIO was enabled or DCB
|
* unless I40E_FLAG_TC_MQPRIO was enabled or DCB
|
||||||
@@ -10607,6 +10601,11 @@ static void i40e_rebuild(struct i40e_pf *pf, bool reinit, bool lock_acquired)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_I40E_DCB */
|
#endif /* CONFIG_I40E_DCB */
|
||||||
|
if (!lock_acquired)
|
||||||
|
rtnl_lock();
|
||||||
|
ret = i40e_setup_pf_switch(pf, reinit);
|
||||||
|
if (ret)
|
||||||
|
goto end_unlock;
|
||||||
|
|
||||||
/* The driver only wants link up/down and module qualification
|
/* The driver only wants link up/down and module qualification
|
||||||
* reports from firmware. Note the negative logic.
|
* reports from firmware. Note the negative logic.
|
||||||
|
|||||||
Reference in New Issue
Block a user