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 37e5540b3c
(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>
This commit is contained in:
Родитель
fc766e4c49
Коммит
67426b756c
|
@ -316,7 +316,8 @@ static void unix_write_space(struct sock *sk)
|
|||
if (unix_writable(sk)) {
|
||||
wq = rcu_dereference(sk->sk_wq);
|
||||
if (wq_has_sleeper(wq))
|
||||
wake_up_interruptible_sync(&wq->wait);
|
||||
wake_up_interruptible_sync_poll(&wq->wait,
|
||||
POLLOUT | POLLWRNORM | POLLWRBAND);
|
||||
sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
@ -1710,7 +1711,8 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock,
|
|||
goto out_unlock;
|
||||
}
|
||||
|
||||
wake_up_interruptible_sync(&u->peer_wait);
|
||||
wake_up_interruptible_sync_poll(&u->peer_wait,
|
||||
POLLOUT | POLLWRNORM | POLLWRBAND);
|
||||
|
||||
if (msg->msg_name)
|
||||
unix_copy_addr(msg, skb->sk);
|
||||
|
|
Загрузка…
Ссылка в новой задаче