Commit fac30731 authored by Eric Dumazet's avatar Eric Dumazet Committed by Jakub Kicinski

tcp: adopt try_cmpxchg() in tcp_release_cb()

try_cmpxchg() is slighly more efficient (at least on x86),
and smp_load_acquire(&sk->sk_tsq_flags) could avoid a KCSAN report.
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20221110174829.3403442-1-edumazet@google.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 3e35f26d
...@@ -1077,15 +1077,15 @@ static void tcp_tasklet_func(struct tasklet_struct *t) ...@@ -1077,15 +1077,15 @@ static void tcp_tasklet_func(struct tasklet_struct *t)
*/ */
void tcp_release_cb(struct sock *sk) void tcp_release_cb(struct sock *sk)
{ {
unsigned long flags, nflags; unsigned long flags = smp_load_acquire(&sk->sk_tsq_flags);
unsigned long nflags;
/* perform an atomic operation only if at least one flag is set */ /* perform an atomic operation only if at least one flag is set */
do { do {
flags = sk->sk_tsq_flags;
if (!(flags & TCP_DEFERRED_ALL)) if (!(flags & TCP_DEFERRED_ALL))
return; return;
nflags = flags & ~TCP_DEFERRED_ALL; nflags = flags & ~TCP_DEFERRED_ALL;
} while (cmpxchg(&sk->sk_tsq_flags, flags, nflags) != flags); } while (!try_cmpxchg(&sk->sk_tsq_flags, &flags, nflags));
if (flags & TCPF_TSQ_DEFERRED) { if (flags & TCPF_TSQ_DEFERRED) {
tcp_tsq_write(sk); tcp_tsq_write(sk);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment