aboutsummaryrefslogtreecommitdiffstats
path: root/net/unix/af_unix.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2013-08-08 17:38:47 -0400
committerDavid S. Miller <davem@davemloft.net>2013-08-10 04:16:44 -0400
commit28d6427109d13b0f447cba5761f88d3548e83605 (patch)
tree5f463fa756d508625e8cea1da31406e66a0b263e /net/unix/af_unix.c
parente370a7236321773245c5522d8bb299380830d3b2 (diff)
net: attempt high order allocations in sock_alloc_send_pskb()
Adding paged frags skbs to af_unix sockets introduced a performance regression on large sends because of additional page allocations, even if each skb could carry at least 100% more payload than before. We can instruct sock_alloc_send_pskb() to attempt high order allocations. Most of the time, it does a single page allocation instead of 8. I added an additional parameter to sock_alloc_send_pskb() to let other users to opt-in for this new feature on followup patches. Tested: Before patch : $ netperf -t STREAM_STREAM STREAM STREAM TEST Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 2304 212992 212992 10.00 46861.15 After patch : $ netperf -t STREAM_STREAM STREAM STREAM TEST Recv Send Send Socket Socket Message Elapsed Size Size Size Time Throughput bytes bytes bytes secs. 10^6bits/sec 2304 212992 212992 10.00 57981.11 Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: David Rientjes <rientjes@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/unix/af_unix.c')
-rw-r--r--net/unix/af_unix.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 99dc760cdd95..fee9e3397cd1 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -1479,7 +1479,8 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
1479 MAX_SKB_FRAGS * PAGE_SIZE); 1479 MAX_SKB_FRAGS * PAGE_SIZE);
1480 1480
1481 skb = sock_alloc_send_pskb(sk, len - data_len, data_len, 1481 skb = sock_alloc_send_pskb(sk, len - data_len, data_len,
1482 msg->msg_flags & MSG_DONTWAIT, &err); 1482 msg->msg_flags & MSG_DONTWAIT, &err,
1483 PAGE_ALLOC_COSTLY_ORDER);
1483 if (skb == NULL) 1484 if (skb == NULL)
1484 goto out; 1485 goto out;
1485 1486
@@ -1651,7 +1652,8 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
1651 data_len = max_t(int, 0, size - SKB_MAX_HEAD(0)); 1652 data_len = max_t(int, 0, size - SKB_MAX_HEAD(0));
1652 1653
1653 skb = sock_alloc_send_pskb(sk, size - data_len, data_len, 1654 skb = sock_alloc_send_pskb(sk, size - data_len, data_len,
1654 msg->msg_flags & MSG_DONTWAIT, &err); 1655 msg->msg_flags & MSG_DONTWAIT, &err,
1656 get_order(UNIX_SKB_FRAGS_SZ));
1655 if (!skb) 1657 if (!skb)
1656 goto out_err; 1658 goto out_err;
1657 1659