af_unix: improve STREAM behavior with fragmented memory
authorEric Dumazet <edumazet@google.com>
Thu, 8 Aug 2013 21:37:32 +0000 (14:37 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 10 Aug 2013 08:16:44 +0000 (01:16 -0700)
commite370a7236321773245c5522d8bb299380830d3b2
treee374e13b5fcccdd9aa28fcb5ab0dd3df05b4d384
parent149479d019e06df5a7f4096f95c00cfb1380309c
af_unix: improve STREAM behavior with fragmented memory

unix_stream_sendmsg() currently uses order-2 allocations,
and we had numerous reports this can fail.

The __GFP_REPEAT flag present in sock_alloc_send_pskb() is
not helping.

This patch extends the work done in commit eb6a24816b247c
("af_unix: reduce high order page allocations) for
datagram sockets.

This opens the possibility of zero copy IO (splice() and
friends)

The trick is to not use skb_pull() anymore in recvmsg() path,
and instead add a @consumed field in UNIXCB() to track amount
of already read payload in the skb.

There is a performance regression for large sends
because of extra page allocations that will be addressed
in a follow-up patch, allowing sock_alloc_send_pskb()
to attempt high order page allocations.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: David Rientjes <rientjes@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/af_unix.h
net/unix/af_unix.c