]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: shaper: drop redundant xa_lock() bracketing
authorJakub Kicinski <kuba@kernel.org>
Tue, 9 Jun 2026 18:32:21 +0000 (11:32 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 11 Jun 2026 10:55:23 +0000 (12:55 +0200)
The shaper insertion and update code takes xa_lock() explicitly.
Paolo explained that the locking was purely to avoid re-taking
the lock in loops. But it may be mis-read as if it was expecting
readers to be fenced off by xa_lock. Readers of XArray are purely
under RCU. Remove explicit taking of xa_lock().

All writers to hierarchy->shapers are serialized by the netdev
instance lock (or run after netdev is made inaccessible to readers).

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Link: https://patch.msgid.link/20260609183224.1108521-2-kuba@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/shaper/shaper.c

index dea9270f3e57dfc2db7e31cf402ed25fbd337477..a5b42b697a9327a512900d9d620b5d3ff4bcfb22 100644 (file)
@@ -429,7 +429,6 @@ static void net_shaper_commit(struct net_shaper_binding *binding,
        int index;
        int i;
 
-       xa_lock(&hierarchy->shapers);
        for (i = 0; i < nr_shapers; ++i) {
                index = net_shaper_handle_to_index(&shapers[i].handle);
 
@@ -442,7 +441,6 @@ static void net_shaper_commit(struct net_shaper_binding *binding,
                /* ... publish to lockless readers. */
                smp_store_release(&cur->valid, true);
        }
-       xa_unlock(&hierarchy->shapers);
 }
 
 /* Rollback all the tentative inserts from the hierarchy. */
@@ -455,14 +453,12 @@ static void net_shaper_rollback(struct net_shaper_binding *binding)
        if (!hierarchy)
                return;
 
-       xa_lock(&hierarchy->shapers);
        xa_for_each(&hierarchy->shapers, index, cur) {
                if (cur->valid)
                        continue;
-               __xa_erase(&hierarchy->shapers, index);
+               xa_erase(&hierarchy->shapers, index);
                kfree_rcu(cur, rcu);
        }
-       xa_unlock(&hierarchy->shapers);
 }
 
 static int net_shaper_parse_handle(const struct nlattr *attr,
@@ -1472,12 +1468,10 @@ static void net_shaper_flush(struct net_shaper_binding *binding)
        if (!hierarchy)
                return;
 
-       xa_lock(&hierarchy->shapers);
        xa_for_each(&hierarchy->shapers, index, cur) {
-               __xa_erase(&hierarchy->shapers, index);
+               xa_erase(&hierarchy->shapers, index);
                kfree(cur);
        }
-       xa_unlock(&hierarchy->shapers);
 
        kfree(hierarchy);
 }