* [PATCH net] kcm: use WRITE_ONCE() when changing lower socket callbacks
@ 2026-06-11 5:35 Runyu Xiao
2026-06-14 8:30 ` patchwork-bot+netdevbpf
0 siblings, 1 reply; 2+ messages in thread
From: Runyu Xiao @ 2026-06-11 5:35 UTC (permalink / raw)
To: davem, edumazet, kuba, pabeni, netdev
Cc: horms, linux-kernel, jianhao.xu, runyu.xiao
kcm_attach() replaces a live lower TCP socket's sk_data_ready and
sk_write_space callbacks with KCM handlers, and kcm_unattach() restores
them later. Those callback-pointer updates are still plain stores even
though the same fields can be read and invoked concurrently on other
CPUs.
If another CPU observes an older callback snapshot after the live field
has already been restored, callback execution can run with a mismatched
target and sk_user_data state, leading to stale or misdirected wakeups.
Use WRITE_ONCE() for the callback replacement and restore operations so
these shared callback fields follow the same visibility contract already
established by the earlier 4022 fixes.
Fixes: ab7ac4eb9832 ("kcm: Kernel Connection Multiplexor module")
Signed-off-by: Runyu Xiao <runyu.xiao@seu.edu.cn>
---
net/kcm/kcmsock.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
index f6d44481954c..dc126f7f030c 100644
--- a/net/kcm/kcmsock.c
+++ b/net/kcm/kcmsock.c
@@ -1304,8 +1304,8 @@ static int kcm_attach(struct socket *sock, struct socket *csock,
psock->save_write_space = csk->sk_write_space;
psock->save_state_change = csk->sk_state_change;
csk->sk_user_data = psock;
- csk->sk_data_ready = psock_data_ready;
- csk->sk_write_space = psock_write_space;
+ WRITE_ONCE(csk->sk_data_ready, psock_data_ready);
+ WRITE_ONCE(csk->sk_write_space, psock_write_space);
csk->sk_state_change = psock_state_change;
write_unlock_bh(&csk->sk_callback_lock);
@@ -1381,8 +1381,8 @@ static void kcm_unattach(struct kcm_psock *psock)
*/
write_lock_bh(&csk->sk_callback_lock);
csk->sk_user_data = NULL;
- csk->sk_data_ready = psock->save_data_ready;
- csk->sk_write_space = psock->save_write_space;
+ WRITE_ONCE(csk->sk_data_ready, psock->save_data_ready);
+ WRITE_ONCE(csk->sk_write_space, psock->save_write_space);
csk->sk_state_change = psock->save_state_change;
strp_stop(&psock->strp);
--
2.34.1
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH net] kcm: use WRITE_ONCE() when changing lower socket callbacks
2026-06-11 5:35 [PATCH net] kcm: use WRITE_ONCE() when changing lower socket callbacks Runyu Xiao
@ 2026-06-14 8:30 ` patchwork-bot+netdevbpf
0 siblings, 0 replies; 2+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-06-14 8:30 UTC (permalink / raw)
To: Runyu Xiao
Cc: davem, edumazet, kuba, pabeni, netdev, horms, linux-kernel,
jianhao.xu
Hello:
This patch was applied to netdev/net.git (main)
by Paolo Abeni <pabeni@redhat.com>:
On Thu, 11 Jun 2026 13:35:43 +0800 you wrote:
> kcm_attach() replaces a live lower TCP socket's sk_data_ready and
> sk_write_space callbacks with KCM handlers, and kcm_unattach() restores
> them later. Those callback-pointer updates are still plain stores even
> though the same fields can be read and invoked concurrently on other
> CPUs.
>
> If another CPU observes an older callback snapshot after the live field
> has already been restored, callback execution can run with a mismatched
> target and sk_user_data state, leading to stale or misdirected wakeups.
>
> [...]
Here is the summary with links:
- [net] kcm: use WRITE_ONCE() when changing lower socket callbacks
https://git.kernel.org/netdev/net/c/47186409c092
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-06-14 8:30 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-06-11 5:35 [PATCH net] kcm: use WRITE_ONCE() when changing lower socket callbacks Runyu Xiao
2026-06-14 8:30 ` patchwork-bot+netdevbpf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox