mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
net: enetc: fix destroyed phylink dereference during unbind
[ Upstream commit3af409ca27
] The following call path suggests that calling unregister_netdev on an interface that is up will first bring it down. enetc_pf_remove -> unregister_netdev -> unregister_netdevice_queue -> unregister_netdevice_many -> dev_close_many -> __dev_close_many -> enetc_close -> enetc_stop -> phylink_stop However, enetc first destroys the phylink instance, then calls unregister_netdev. This is already dissimilar to the setup (and error path teardown path) from enetc_pf_probe, but more than that, it is buggy because it is invalid to call phylink_stop after phylink_destroy. So let's first unregister the netdev (and let the .ndo_stop events consume themselves), then destroy the phylink instance, then free the netdev. Fixes:71b77a7a27
("enetc: Migrate to PHYLINK and PCS_LYNX") Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
79234cb9aa
commit
65a10cb163
1 changed files with 3 additions and 2 deletions
|
@ -1164,14 +1164,15 @@ static void enetc_pf_remove(struct pci_dev *pdev)
|
|||
struct enetc_ndev_priv *priv;
|
||||
|
||||
priv = netdev_priv(si->ndev);
|
||||
enetc_phylink_destroy(priv);
|
||||
enetc_mdiobus_destroy(pf);
|
||||
|
||||
if (pf->num_vfs)
|
||||
enetc_sriov_configure(pdev, 0);
|
||||
|
||||
unregister_netdev(si->ndev);
|
||||
|
||||
enetc_phylink_destroy(priv);
|
||||
enetc_mdiobus_destroy(pf);
|
||||
|
||||
enetc_free_msix(priv);
|
||||
|
||||
enetc_free_si_resources(priv);
|
||||
|
|
Loading…
Reference in a new issue