net: rtnetlink: remove local list in __linkwatch_run_queue()
authorJohannes Berg <johannes.berg@intel.com>
Tue, 5 Dec 2023 16:00:11 +0000 (17:00 +0100)
committerJakub Kicinski <kuba@kernel.org>
Thu, 7 Dec 2023 03:25:43 +0000 (19:25 -0800)
Due to linkwatch_forget_dev() (and perhaps others?) checking for
list_empty(&dev->link_watch_list), we must have all manipulations
of even the local on-stack list 'wrk' here under spinlock, since
even that list can be reached otherwise via dev->link_watch_list.

This is already the case, but makes this a bit counter-intuitive,
often local lists are used to _not_ have to use locking for their
local use.

Remove the local list as it doesn't seem to serve any purpose.
While at it, move a variable declaration into the loop using it.

Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Link: https://lore.kernel.org/r/20231205170011.56576dcc1727.I698b72219d9f6ce789bd209b8f6dffd0ca32a8f2@changeid
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/link_watch.c

index a19f214..7be5b3a 100644 (file)
@@ -192,8 +192,6 @@ static void __linkwatch_run_queue(int urgent_only)
 #define MAX_DO_DEV_PER_LOOP    100
 
        int do_dev = MAX_DO_DEV_PER_LOOP;
-       struct net_device *dev;
-       LIST_HEAD(wrk);
 
        /* Give urgent case more budget */
        if (urgent_only)
@@ -215,11 +213,11 @@ static void __linkwatch_run_queue(int urgent_only)
        clear_bit(LW_URGENT, &linkwatch_flags);
 
        spin_lock_irq(&lweventlist_lock);
-       list_splice_init(&lweventlist, &wrk);
+       while (!list_empty(&lweventlist) && do_dev > 0) {
+               struct net_device *dev;
 
-       while (!list_empty(&wrk) && do_dev > 0) {
-
-               dev = list_first_entry(&wrk, struct net_device, link_watch_list);
+               dev = list_first_entry(&lweventlist, struct net_device,
+                                      link_watch_list);
                list_del_init(&dev->link_watch_list);
 
                if (!netif_device_present(dev) ||
@@ -237,9 +235,6 @@ static void __linkwatch_run_queue(int urgent_only)
                spin_lock_irq(&lweventlist_lock);
        }
 
-       /* Add the remaining work back to lweventlist */
-       list_splice_init(&wrk, &lweventlist);
-
        if (!list_empty(&lweventlist))
                linkwatch_schedule_work(0);
        spin_unlock_irq(&lweventlist_lock);