On Wed, 2016-12-07 at 06:29 -0800, Eric Dumazet wrote: > Keeping frag_list means you keep one sk_buff per segment, so this really > looks like a legacy UDP server (like a DNS server) wont benefit from > this anyway.
I played with the idea of preparing the skb for minimal overhead for the process doing udp_recvmsg(). If socket is under pressure, softirq handler(s) can try to pull in skb->head the payload of the packet if it fits. Meaning the softirq handler can free/reuse the page fragment immediately, instead of letting udp_recvmsg() do this hundreds of usec later. ( Sort of copybreak, but without reallocating skb->head ) Gains : - We reduce skb->truesize and thus can store more packets per SO_RCVBUF KB - We avoid a cache line misses at copyout() time and consume_skb() time, and avoid one put_page() with potential alien freeing on NUMA hosts.