mirror of
https://github.com/torvalds/linux.git
synced 2024-10-23 13:40:56 +00:00
net: no longer acquire RTNL in threaded_show()
dev->threaded can be read locklessly, if we add corresponding READ_ONCE()/WRITE_ONCE() annotations. Signed-off-by: Eric Dumazet <edumazet@google.com> Link: https://lore.kernel.org/r/20240502173926.2010646-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
3e51f2cbbc
commit
c1742dcb6b
|
@ -2370,8 +2370,8 @@ struct net_device {
|
|||
struct sfp_bus *sfp_bus;
|
||||
struct lock_class_key *qdisc_tx_busylock;
|
||||
bool proto_down;
|
||||
bool threaded;
|
||||
unsigned wol_enabled:1;
|
||||
unsigned threaded:1;
|
||||
|
||||
struct list_head net_notifier_list;
|
||||
|
||||
|
|
|
@ -6531,7 +6531,7 @@ int dev_set_threaded(struct net_device *dev, bool threaded)
|
|||
}
|
||||
}
|
||||
|
||||
dev->threaded = threaded;
|
||||
WRITE_ONCE(dev->threaded, threaded);
|
||||
|
||||
/* Make sure kthread is created before THREADED bit
|
||||
* is set.
|
||||
|
@ -6622,7 +6622,7 @@ void netif_napi_add_weight(struct net_device *dev, struct napi_struct *napi,
|
|||
* threaded mode will not be enabled in napi_enable().
|
||||
*/
|
||||
if (dev->threaded && napi_kthread_create(napi))
|
||||
dev->threaded = 0;
|
||||
dev->threaded = false;
|
||||
netif_napi_set_irq(napi, -1);
|
||||
}
|
||||
EXPORT_SYMBOL(netif_napi_add_weight);
|
||||
|
|
|
@ -605,13 +605,13 @@ static ssize_t threaded_show(struct device *dev,
|
|||
struct net_device *netdev = to_net_dev(dev);
|
||||
ssize_t ret = -EINVAL;
|
||||
|
||||
if (!rtnl_trylock())
|
||||
return restart_syscall();
|
||||
rcu_read_lock();
|
||||
|
||||
if (dev_isalive(netdev))
|
||||
ret = sysfs_emit(buf, fmt_dec, netdev->threaded);
|
||||
ret = sysfs_emit(buf, fmt_dec, READ_ONCE(netdev->threaded));
|
||||
|
||||
rcu_read_unlock();
|
||||
|
||||
rtnl_unlock();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user