mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
dpaa2-switch: fix handling of NAPI on the remove path
All the NAPI instances for a DPSW device are attached to the first switch port's net_device but shared by all ports. The NAPI instances get disabled only once the last port goes down. This causes an issue on the .remove() path where each port is unregistered and freed one at a time, causing the NAPI instances to be deleted even though they are not disabled. In order to avoid this, split up the unregister_netdev() calls from the free_netdev() so that we make sure all ports go down before we attempt a deletion of NAPI instances. Also, make the netif_napi_del() explicit as it is on the .probe() path. Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com> Link: https://patch.msgid.link/20260528173452.1953102-6-ioana.ciornei@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
9111f02861
commit
e23d7c8c1d
|
|
@ -3304,7 +3304,6 @@ static void dpaa2_switch_teardown(struct fsl_mc_device *sw_dev)
|
|||
|
||||
static void dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
|
||||
{
|
||||
struct ethsw_port_priv *port_priv;
|
||||
struct ethsw_core *ethsw;
|
||||
struct device *dev;
|
||||
int i;
|
||||
|
|
@ -3316,11 +3315,17 @@ static void dpaa2_switch_remove(struct fsl_mc_device *sw_dev)
|
|||
|
||||
dpsw_disable(ethsw->mc_io, 0, ethsw->dpsw_handle);
|
||||
|
||||
for (i = 0; i < ethsw->sw_attr.num_ifs; i++) {
|
||||
port_priv = ethsw->ports[i];
|
||||
unregister_netdev(port_priv->netdev);
|
||||
/* Unregister all the netdevs so that they are brought down and the
|
||||
* shared NAPI instances gets disabled.
|
||||
*/
|
||||
for (i = 0; i < ethsw->sw_attr.num_ifs; i++)
|
||||
unregister_netdev(ethsw->ports[i]->netdev);
|
||||
|
||||
for (i = 0; i < DPAA2_SWITCH_RX_NUM_FQS; i++)
|
||||
netif_napi_del(ðsw->fq[i].napi);
|
||||
|
||||
for (i = 0; i < ethsw->sw_attr.num_ifs; i++)
|
||||
dpaa2_switch_remove_port(ethsw, i);
|
||||
}
|
||||
|
||||
kfree(ethsw->fdbs);
|
||||
kfree(ethsw->filter_blocks);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user