Message ID | 20231204211952.01b2d4ff587d.I698b72219d9f6ce789bd209b8f6dffd0ca32a8f2@changeid (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [RFC] net: rtnetlink: remove local list in __linkwatch_run_queue() | expand |
Mon, Dec 04, 2023 at 09:19:53PM CET, johannes@sipsolutions.net wrote: >From: Johannes Berg <johannes.berg@intel.com> Why rfc? > >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. > >Signed-off-by: Johannes Berg <johannes.berg@intel.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com>
On Tue, 2023-12-05 at 12:22 +0100, Jiri Pirko wrote: > Mon, Dec 04, 2023 at 09:19:53PM CET, johannes@sipsolutions.net wrote: > > From: Johannes Berg <johannes.berg@intel.com> > > Why rfc? I thought maybe someone could come up with a reason it actually makes sense? :) johannes
diff --git a/net/core/link_watch.c b/net/core/link_watch.c index c469d1c4db5d..ed3e5391fa79 100644 --- a/net/core/link_watch.c +++ b/net/core/link_watch.c @@ -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);