mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
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: 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>
This commit is contained in:
parent
3e35f26d33
commit
fac30731b9
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user