diff options
author | Eric Dumazet <edumazet@google.com> | 2025-06-04 09:39:28 +0000 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2025-06-05 08:02:26 -0700 |
commit | 535caaca921c653b1f9838fbd5c4e9494cafc3d9 (patch) | |
tree | 492e601eeeec5d1a5b7ead08f628b709c49e6009 | |
parent | e6854be4d80ea266a7be64a65a0322bcdfa72807 (diff) | |
download | linux-535caaca921c653b1f9838fbd5c4e9494cafc3d9.tar.gz |
net: annotate data-races around cleanup_net_task
from_cleanup_net() reads cleanup_net_task locklessly.
Add READ_ONCE()/WRITE_ONCE() annotations to avoid
a potential KCSAN warning, even if the race is harmless.
Fixes: 0734d7c3d93c ("net: expedite synchronize_net() for cleanup_net()")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Jason Xing <kerneljasonxing@gmail.com>
Link: https://patch.msgid.link/20250604093928.1323333-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r-- | net/core/dev.c | 2 | ||||
-rw-r--r-- | net/core/net_namespace.c | 4 |
2 files changed, 3 insertions, 3 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index a388f459a3666e..be97c440ecd5f9 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -10499,7 +10499,7 @@ static void dev_index_release(struct net *net, int ifindex) static bool from_cleanup_net(void) { #ifdef CONFIG_NET_NS - return current == cleanup_net_task; + return current == READ_ONCE(cleanup_net_task); #else return false; #endif diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index 42ee7fce3d95b5..ae54f26709ca24 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c @@ -654,7 +654,7 @@ static void cleanup_net(struct work_struct *work) struct net *net, *tmp, *last; LIST_HEAD(net_exit_list); - cleanup_net_task = current; + WRITE_ONCE(cleanup_net_task, current); /* Atomically snapshot the list of namespaces to cleanup */ net_kill_list = llist_del_all(&cleanup_list); @@ -704,7 +704,7 @@ static void cleanup_net(struct work_struct *work) put_user_ns(net->user_ns); net_passive_dec(net); } - cleanup_net_task = NULL; + WRITE_ONCE(cleanup_net_task, NULL); } /** |