diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2010-10-29 16:44:44 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-11-08 16:50:08 -0500 |
commit | 67426b756c4d52c511c4b22b269accea171692a8 (patch) | |
tree | 60c640a4b103946d706671ccc2d12fc0d23ed544 /net | |
parent | fc766e4c4965915ab52a1d1fa3c7a7b3e7bc07f0 (diff) |
af_unix: use keyed wakeups
Instead of wakeup all sleepers, use wake_up_interruptible_sync_poll() to
wakeup only ones interested into writing the socket.
This patch is a specialization of commit 37e5540b3c9d (epoll keyed
wakeups: make sockets use keyed wakeups).
On a test program provided by Alan Crequy :
Before:
real 0m3.101s
user 0m0.000s
sys 0m6.104s
After:
real 0m0.211s
user 0m0.000s
sys 0m0.208s
Reported-by: Alban Crequy <alban.crequy@collabora.co.uk>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Davide Libenzi <davidel@xmailserver.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/unix/af_unix.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 3c95304a0817..f33c5958dbb2 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -316,7 +316,8 @@ static void unix_write_space(struct sock *sk) | |||
316 | if (unix_writable(sk)) { | 316 | if (unix_writable(sk)) { |
317 | wq = rcu_dereference(sk->sk_wq); | 317 | wq = rcu_dereference(sk->sk_wq); |
318 | if (wq_has_sleeper(wq)) | 318 | if (wq_has_sleeper(wq)) |
319 | wake_up_interruptible_sync(&wq->wait); | 319 | wake_up_interruptible_sync_poll(&wq->wait, |
320 | POLLOUT | POLLWRNORM | POLLWRBAND); | ||
320 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); | 321 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); |
321 | } | 322 | } |
322 | rcu_read_unlock(); | 323 | rcu_read_unlock(); |
@@ -1710,7 +1711,8 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1710 | goto out_unlock; | 1711 | goto out_unlock; |
1711 | } | 1712 | } |
1712 | 1713 | ||
1713 | wake_up_interruptible_sync(&u->peer_wait); | 1714 | wake_up_interruptible_sync_poll(&u->peer_wait, |
1715 | POLLOUT | POLLWRNORM | POLLWRBAND); | ||
1714 | 1716 | ||
1715 | if (msg->msg_name) | 1717 | if (msg->msg_name) |
1716 | unix_copy_addr(msg, skb->sk); | 1718 | unix_copy_addr(msg, skb->sk); |