Message ID | 20250117141446.1076951-1-kory.maincent@bootlin.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next] net: phy: Fix suspicious rcu_dereference usage | expand |
On Fri, 17 Jan 2025 15:14:45 +0100 Kory Maincent <kory.maincent@bootlin.com> wrote: > The phy_detach function can be called with or without the rtnl lock held. > When the rtnl lock is not held, using rtnl_dereference() triggers a > warning due to the lack of lock context. > > Add an rcu_read_lock() to ensure the lock is acquired and to maintain > synchronization. Sent the wrong patch which have a ; missing. pw-bot: cr > > Tested-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com> > Reported-by: Claudiu Beznea <claudiu.beznea.uj@bp.renesas.com> > Closes: > https://lore.kernel.org/netdev/4c6419d8-c06b-495c-b987-d66c2e1ff848@tuxon.dev/ > Fixes: 35f7cad1743e ("net: Add the possibility to support a selected hwtstamp > in netdevice") Signed-off-by: Kory Maincent <kory.maincent@bootlin.com> --- > drivers/net/phy/phy_device.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c > index 5b34d39d1d52..b9b9aa16c10a 100644 > --- a/drivers/net/phy/phy_device.c > +++ b/drivers/net/phy/phy_device.c > @@ -2001,12 +2001,14 @@ void phy_detach(struct phy_device *phydev) > if (dev) { > struct hwtstamp_provider *hwprov; > > - hwprov = rtnl_dereference(dev->hwprov); > + rcu_read_lock() > + hwprov = rcu_dereference(dev->hwprov); > /* Disable timestamp if it is the one selected */ > if (hwprov && hwprov->phydev == phydev) { > rcu_assign_pointer(dev->hwprov, NULL); > kfree_rcu(hwprov, rcu_head); > } > + rcu_read_unlock(); > > phydev->attached_dev->phydev = NULL; > phydev->attached_dev = NULL;
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 5b34d39d1d52..b9b9aa16c10a 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -2001,12 +2001,14 @@ void phy_detach(struct phy_device *phydev) if (dev) { struct hwtstamp_provider *hwprov; - hwprov = rtnl_dereference(dev->hwprov); + rcu_read_lock() + hwprov = rcu_dereference(dev->hwprov); /* Disable timestamp if it is the one selected */ if (hwprov && hwprov->phydev == phydev) { rcu_assign_pointer(dev->hwprov, NULL); kfree_rcu(hwprov, rcu_head); } + rcu_read_unlock(); phydev->attached_dev->phydev = NULL; phydev->attached_dev = NULL;