[PATCH 08/11] soreuseport: publish num_socks with acquire/release
From: Jinjie Ruan
Date: Tue Aug 25 2026 - 06:00:27 EST
Replace the smp_wmb()/smp_rmb() barrier pair with
smp_store_release()/smp_load_acquire() on reuse->num_socks.
Writers publish socks[] updates via release before incrementing
or decrementing the count; readers acquire the count before
accessing socks[], ensuring they observe a consistent view.
The detach path gains proper ordering between the socks[] write and
the decrement, which was previously unordered.
No functional change intended.
Assisted-by: DeepSeek:DeepSeek-V3
Signed-off-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx>
---
net/core/sock_reuseport.c | 20 ++++++++------------
1 file changed, 8 insertions(+), 12 deletions(-)
diff --git a/net/core/sock_reuseport.c b/net/core/sock_reuseport.c
index 29948cb44b7d..6d3c511d1def 100644
--- a/net/core/sock_reuseport.c
+++ b/net/core/sock_reuseport.c
@@ -125,9 +125,8 @@ static void __reuseport_add_sock(struct sock *sk,
struct sock_reuseport *reuse)
{
reuse->socks[reuse->num_socks] = sk;
- /* paired with smp_rmb() in reuseport_(select|migrate)_sock() */
- smp_wmb();
- reuse->num_socks++;
+ /* paired with smp_load_acquire() in reuseport_(select|migrate)_sock() */
+ smp_store_release(&reuse->num_socks, reuse->num_socks + 1);
reuseport_get_incoming_cpu(sk, reuse);
}
@@ -140,7 +139,8 @@ static bool __reuseport_detach_sock(struct sock *sk,
return false;
reuse->socks[i] = reuse->socks[reuse->num_socks - 1];
- reuse->num_socks--;
+ /* paired with smp_load_acquire() in reuseport_(select|migrate)_sock() */
+ smp_store_release(&reuse->num_socks, reuse->num_socks - 1);
reuseport_put_incoming_cpu(sk, reuse);
return true;
@@ -583,11 +583,9 @@ struct sock *reuseport_select_sock(struct sock *sk,
goto out;
prog = rcu_dereference(reuse->prog);
- socks = READ_ONCE(reuse->num_socks);
+ /* paired with smp_store_release() in __reuseport_add_sock() */
+ socks = smp_load_acquire(&reuse->num_socks);
if (likely(socks)) {
- /* paired with smp_wmb() in __reuseport_add_sock() */
- smp_rmb();
-
if (!prog || !skb)
goto select_by_hash;
@@ -634,13 +632,11 @@ struct sock *reuseport_migrate_sock(struct sock *sk,
if (!reuse)
goto out;
- socks = READ_ONCE(reuse->num_socks);
+ /* paired with smp_store_release() in __reuseport_add_sock() */
+ socks = smp_load_acquire(&reuse->num_socks);
if (unlikely(!socks))
goto failure;
- /* paired with smp_wmb() in __reuseport_add_sock() */
- smp_rmb();
-
hash = migrating_sk->sk_hash;
prog = rcu_dereference(reuse->prog);
if (!prog || prog->expected_attach_type != BPF_SK_REUSEPORT_SELECT_OR_MIGRATE) {
--
2.34.1