tcp: adopt try_cmpxchg() in tcp_release_cb()
authorEric Dumazet <edumazet@google.com>
Thu, 10 Nov 2022 17:48:29 +0000 (17:48 +0000)
committerJakub Kicinski <kuba@kernel.org>
Sat, 12 Nov 2022 05:37:49 +0000 (21:37 -0800)
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: Eric Dumazet <edumazet@google.com>
Link: https://lore.kernel.org/r/20221110174829.3403442-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/tcp_output.c

index c69f4d9..d1cb1ec 100644 (file)
@@ -1077,15 +1077,15 @@ static void tcp_tasklet_func(struct tasklet_struct *t)
  */
 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 */
        do {
-               flags = sk->sk_tsq_flags;
                if (!(flags & TCP_DEFERRED_ALL))
                        return;
                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) {
                tcp_tsq_write(sk);