]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: protect NAPI config fields with netdev_lock()
authorJakub Kicinski <kuba@kernel.org>
Wed, 15 Jan 2025 03:53:18 +0000 (19:53 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 16 Jan 2025 03:13:34 +0000 (19:13 -0800)
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.

Reviewed-by: Joe Damato <jdamato@fastly.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250115035319.559603-11-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/netdevice.h
net/core/net-sysfs.c

index a47ff20365f928b837e91eccea4507c1ee85bba1..8308d9c75918f08ca669dd36044ff4b154869312 100644 (file)
@@ -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 (writers must hold both @lock and rtnl_lock):
         *      @up
index 9365a7185a1d11f4e799bb88110cdb5ea2c008ab..07cb99b114bdd770d93a08088d6b3738776a86a2 100644 (file)
@@ -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);