diff options
author | David S. Miller <davem@davemloft.net> | 2018-07-30 09:10:25 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-07-30 09:10:25 -0700 |
commit | b0a0381987dd2be9eb95f7415b110dbb0a7dbe4a (patch) | |
tree | 307bcd2465bd96bc79cecf60abf50630538117a8 /net/socket.c | |
parent | 3f6bcc5162a1ba4e99e867364919168c1d821308 (diff) | |
parent | a331de3bf0e66ab2437fc8c5b99bd3c0d9da3088 (diff) |
Merge branch 'socket-poll-related-cleanups-v2'
Christoph Hellwig says:
====================
socket poll related cleanups v2
A couple of cleanups I stumbled upon when studying the networking
poll code.
Changes since v1:
- drop a dispute patch from this series (to be sent separately)
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/net/socket.c b/net/socket.c index 85633622c94d..5b7df6695f4f 100644 --- a/net/socket.c +++ b/net/socket.c @@ -1130,12 +1130,21 @@ EXPORT_SYMBOL(sock_create_lite); static __poll_t sock_poll(struct file *file, poll_table *wait) { struct socket *sock = file->private_data; - __poll_t events = poll_requested_events(wait); + __poll_t events = poll_requested_events(wait), flag = 0; - sock_poll_busy_loop(sock, events); if (!sock->ops->poll) return 0; - return sock->ops->poll(file, sock, wait) | sock_poll_busy_flag(sock); + + if (sk_can_busy_loop(sock->sk)) { + /* poll once if requested by the syscall */ + if (events & POLL_BUSY_LOOP) + sk_busy_loop(sock->sk, 1); + + /* if this socket can poll_ll, tell the system call */ + flag = POLL_BUSY_LOOP; + } + + return sock->ops->poll(file, sock, wait) | flag; } static int sock_mmap(struct file *file, struct vm_area_struct *vma) |