On Fri, 2016-12-02 at 10:25 -0800, Eric Dumazet wrote: > Under high stress, I've seen tcp_tasklet_func() consuming > ~700 usec, handling ~150 tcp sockets. > > By setting TCP_TSQ_DEFERRED in tcp_wfree(), we give a chance > for other cpus/threads entering tcp_write_xmit() to grab it, > allowing tcp_tasklet_func() to skip sockets that already did > an xmit cycle. > > Signed-off-by: Eric Dumazet <eduma...@google.com>
... > @@ -884,7 +884,7 @@ void tcp_wfree(struct sk_buff *skb) > if (!(oval & TSQF_THROTTLED) || (oval & TSQF_QUEUED)) > goto out; > > - nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED; > + nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED | > TCP_TSQ_DEFERRED; Typo here... Should be : nval = (oval & ~TSQF_THROTTLED) | TSQF_QUEUED | TCPF_TSQ_DEFERRED; > nval = cmpxchg(&tp->tsq_flags, oval, nval); > if (nval != oval) > continue;