Skip to content

Commit b548b17

Browse files
edumazetkuba-moo
authored andcommitted
tcp: tcp_wfree() refactoring
Use try_cmpxchg() (instead of cmpxchg()) in a more readable way. oval = smp_load_acquire(&sk->sk_tsq_flags); do { ... } while (!try_cmpxchg(&sk->sk_tsq_flags, &oval, nval)); Reduce indentation level. Signed-off-by: Eric Dumazet <edumazet@google.com> Link: https://lore.kernel.org/r/20221110190239.3531280-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent fac3073 commit b548b17

File tree

1 file changed

+14
-17
lines changed

1 file changed

+14
-17
lines changed

net/ipv4/tcp_output.c

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,6 +1139,8 @@ void tcp_wfree(struct sk_buff *skb)
11391139
struct sock *sk = skb->sk;
11401140
struct tcp_sock *tp = tcp_sk(sk);
11411141
unsigned long flags, nval, oval;
1142+
struct tsq_tasklet *tsq;
1143+
bool empty;
11421144

11431145
/* Keep one reference on sk_wmem_alloc.
11441146
* Will be released by sk_free() from here or tcp_tasklet_func()
@@ -1155,28 +1157,23 @@ void tcp_wfree(struct sk_buff *skb)
11551157
if (refcount_read(&sk->sk_wmem_alloc) >= SKB_TRUESIZE(1) && this_cpu_ksoftirqd() == current)
11561158
goto out;
11571159

1158-
for (oval = READ_ONCE(sk->sk_tsq_flags);; oval = nval) {
1159-
struct tsq_tasklet *tsq;
1160-
bool empty;
1161-
1160+
oval = smp_load_acquire(&sk->sk_tsq_flags);
1161+
do {
11621162
if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED))
11631163
goto out;
11641164

11651165
nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED;
1166-
nval = cmpxchg(&sk->sk_tsq_flags, oval, nval);
1167-
if (nval != oval)
1168-
continue;
1166+
} while (!try_cmpxchg(&sk->sk_tsq_flags, &oval, nval));
11691167

1170-
/* queue this socket to tasklet queue */
1171-
local_irq_save(flags);
1172-
tsq = this_cpu_ptr(&tsq_tasklet);
1173-
empty = list_empty(&tsq->head);
1174-
list_add(&tp->tsq_node, &tsq->head);
1175-
if (empty)
1176-
tasklet_schedule(&tsq->tasklet);
1177-
local_irq_restore(flags);
1178-
return;
1179-
}
1168+
/* queue this socket to tasklet queue */
1169+
local_irq_save(flags);
1170+
tsq = this_cpu_ptr(&tsq_tasklet);
1171+
empty = list_empty(&tsq->head);
1172+
list_add(&tp->tsq_node, &tsq->head);
1173+
if (empty)
1174+
tasklet_schedule(&tsq->tasklet);
1175+
local_irq_restore(flags);
1176+
return;
11801177
out:
11811178
sk_free(sk);
11821179
}

0 commit comments

Comments
 (0)