All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, edumazet@google.com, pabeni@redhat.com,
	andrew+netdev@lunn.ch, horms@kernel.org, shuah@kernel.org,
	linux-kselftest@vger.kernel.org, Jakub Kicinski <kuba@kernel.org>
Subject: [PATCH net 04/12] net: shaper: try to avoid violating RCU
Date: Tue,  5 May 2026 17:06:20 -0700	[thread overview]
Message-ID: <20260506000628.1501691-5-kuba@kernel.org> (raw)
In-Reply-To: <20260506000628.1501691-1-kuba@kernel.org>

net_shaper_commit() overrides nodes which may be concurrently read
under RCU. This is not a huge deal since the entries only contain
config, worst case user will see inconsistent config params. But
we should try to avoid this obvious RCU violation. Try to allocate
a new node. Since commit() can't fail fall back to overriding.

Full fix is probably not worth the complexity, struct net_shaper
is around 80B, and the allocation is with GFP_KERNEL.

Fixes: 93954b40f6a4 ("net-shapers: implement NL set and delete operations")
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
---
 net/shaper/shaper.c | 28 +++++++++++++++++++++++-----
 1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/net/shaper/shaper.c b/net/shaper/shaper.c
index 692e38df42cb..a2e9adca9afc 100644
--- a/net/shaper/shaper.c
+++ b/net/shaper/shaper.c
@@ -406,18 +406,36 @@ static void net_shaper_commit(struct net_shaper_binding *binding,
 	int i;
 
 	for (i = 0; i < nr_shapers; ++i) {
+		struct net_shaper *new;
+
 		index = net_shaper_handle_to_index(&shapers[i].handle);
 
 		cur = xa_load(&hierarchy->shapers, index);
 		if (WARN_ON_ONCE(!cur))
 			continue;
 
-		/* Successful update: drop the tentative mark
-		 * and update the hierarchy container.
+		/* If the shaper is already visible try to allocate a new
+		 * entry so that we don't cause torn reads under RCU.
+		 * This tiny GFP_KERNEL alloc should never fail, really,
+		 * but if it does just override, the torn read is acceptable.
 		 */
-		*cur = shapers[i];
-		smp_wmb();
-		xa_set_mark(&hierarchy->shapers, index, NET_SHAPER_VALID);
+		new = NULL;
+		if (xa_get_mark(&hierarchy->shapers, index, NET_SHAPER_VALID))
+			new = kmalloc_obj(*new);
+
+		if (new) {
+			*new = shapers[i];
+			smp_wmb();
+			/* Replacing an entry, xa_store() can't fail */
+			WARN_ON(xa_err(xa_store(&hierarchy->shapers, index,
+						new, GFP_KERNEL)));
+			kfree_rcu(cur, rcu);
+		} else {
+			*cur = shapers[i];
+			smp_wmb();
+			xa_set_mark(&hierarchy->shapers, index,
+				    NET_SHAPER_VALID);
+		}
 	}
 }
 
-- 
2.54.0


  parent reply	other threads:[~2026-05-06  0:06 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-06  0:06 [PATCH net 00/12] net: shaper: fix various minor bugs Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 01/12] net: shaper: drop redundant xa_lock() bracketing Jakub Kicinski
2026-05-06 15:30   ` Paolo Abeni
2026-05-06 22:33     ` Jakub Kicinski
2026-05-07  7:10       ` Paolo Abeni
2026-05-06  0:06 ` [PATCH net 02/12] net: shaper: flip the polarity of the valid flag Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 03/12] net: shaper: fix trivial ordering issue in net_shaper_commit() Jakub Kicinski
2026-05-06  0:06 ` Jakub Kicinski [this message]
2026-05-06 15:22   ` [PATCH net 04/12] net: shaper: try to avoid violating RCU Paolo Abeni
2026-05-06 15:32     ` Paolo Abeni
2026-05-06 22:35       ` Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 05/12] net: shaper: reject duplicate leaves in GROUP request Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 06/12] selftests: drv-net: add shaper test for duplicate leaves Jakub Kicinski
2026-05-06 16:40   ` Breno Leitao
2026-05-06 22:35     ` Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 07/12] net: shaper: set ret to -ENOMEM when genlmsg_new() fails in group_doit Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 08/12] net: shaper: fix undersized reply skb allocation in GROUP command Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 09/12] tools: ynl: add scope qualifier for definitions Jakub Kicinski
2026-05-06  2:32   ` Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 10/12] net: shaper: reject handle IDs exceeding internal bit-width Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 11/12] net: shaper: enforce singleton NETDEV scope with id 0 Jakub Kicinski
2026-05-06  0:06 ` [PATCH net 12/12] net: shaper: reject QUEUE scope handle with missing id Jakub Kicinski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260506000628.1501691-5-kuba@kernel.org \
    --to=kuba@kernel.org \
    --cc=andrew+netdev@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=horms@kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=shuah@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.