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 <[email protected]>
...
> @@ -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;