Message ID | 20250114035118.110297-11-kuba@kernel.org (mailing list archive) |
---|---|
State | New |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: use netdev->lock to protect NAPI | expand |
On Tue, Jan 14, 2025 at 4:51 AM Jakub Kicinski <kuba@kernel.org> wrote: > > Protect the following members of netdev and napi by netdev_lock: > - defer_hard_irqs, > - gro_flush_timeout, > - irq_suspend_timeout. > > The first two are written via sysfs (which this patch switches > to new lock), and netdev genl which holds both netdev and rtnl locks. > > irq_suspend_timeout is only written by netdev genl. > > Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Eric Dumazet <edumazet@google.com>
On Mon, Jan 13, 2025 at 07:51:16PM -0800, Jakub Kicinski wrote: > Protect the following members of netdev and napi by netdev_lock: > - defer_hard_irqs, > - gro_flush_timeout, > - irq_suspend_timeout. > > The first two are written via sysfs (which this patch switches > to new lock), and netdev genl which holds both netdev and rtnl locks. > > irq_suspend_timeout is only written by netdev genl. > > Signed-off-by: Jakub Kicinski <kuba@kernel.org> > --- > include/linux/netdevice.h | 7 ++++--- > net/core/net-sysfs.c | 5 +++-- > 2 files changed, 7 insertions(+), 5 deletions(-) Reviewed-by: Joe Damato <jdamato@fastly.com>
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 03eeeac7dbdf..e16c32be0681 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -384,11 +384,11 @@ struct napi_struct { int rx_count; /* length of rx_list */ unsigned int napi_id; /* protected by netdev_lock */ struct hrtimer timer; - struct task_struct *thread; /* protected by netdev_lock */ + /* all fields past this point are write-protected by netdev_lock */ + struct task_struct *thread; unsigned long gro_flush_timeout; unsigned long irq_suspend_timeout; u32 defer_hard_irqs; - /* all fields past this point are write-protected by netdev_lock */ /* control-path-only fields follow */ struct list_head dev_list; struct hlist_node napi_hash_node; @@ -2452,7 +2452,8 @@ struct net_device { * Drivers are free to use it for other protection. * * Protects: - * @napi_list, @net_shaper_hierarchy, @reg_state, @threaded + * @gro_flush_timeout, @napi_defer_hard_irqs, @napi_list, + * @net_shaper_hierarchy, @reg_state, @threaded * Partially protects (readers hold either @lock or rtnl_lock, * writers must hold both for registered devices): * @up diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 5602a3c12e9a..173688663464 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c @@ -450,7 +450,7 @@ static ssize_t gro_flush_timeout_store(struct device *dev, if (!capable(CAP_NET_ADMIN)) return -EPERM; - return netdev_store(dev, attr, buf, len, change_gro_flush_timeout); + return netdev_lock_store(dev, attr, buf, len, change_gro_flush_timeout); } NETDEVICE_SHOW_RW(gro_flush_timeout, fmt_ulong); @@ -470,7 +470,8 @@ static ssize_t napi_defer_hard_irqs_store(struct device *dev, if (!capable(CAP_NET_ADMIN)) return -EPERM; - return netdev_store(dev, attr, buf, len, change_napi_defer_hard_irqs); + return netdev_lock_store(dev, attr, buf, len, + change_napi_defer_hard_irqs); } NETDEVICE_SHOW_RW(napi_defer_hard_irqs, fmt_uint);
Protect the following members of netdev and napi by netdev_lock: - defer_hard_irqs, - gro_flush_timeout, - irq_suspend_timeout. The first two are written via sysfs (which this patch switches to new lock), and netdev genl which holds both netdev and rtnl locks. irq_suspend_timeout is only written by netdev genl. Signed-off-by: Jakub Kicinski <kuba@kernel.org> --- include/linux/netdevice.h | 7 ++++--- net/core/net-sysfs.c | 5 +++-- 2 files changed, 7 insertions(+), 5 deletions(-)