diff options
Diffstat (limited to 'net/socket.c')
-rw-r--r-- | net/socket.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/net/socket.c b/net/socket.c index 674434127b3a..5b7df6695f4f 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -1130,15 +1130,21 @@ EXPORT_SYMBOL(sock_create_lite); | |||
1130 | static __poll_t sock_poll(struct file *file, poll_table *wait) | 1130 | static __poll_t sock_poll(struct file *file, poll_table *wait) |
1131 | { | 1131 | { |
1132 | struct socket *sock = file->private_data; | 1132 | struct socket *sock = file->private_data; |
1133 | __poll_t events = poll_requested_events(wait); | 1133 | __poll_t events = poll_requested_events(wait), flag = 0; |
1134 | 1134 | ||
1135 | if (!sock->ops->poll) | 1135 | if (!sock->ops->poll) |
1136 | return 0; | 1136 | return 0; |
1137 | 1137 | ||
1138 | /* poll once if requested by the syscall */ | 1138 | if (sk_can_busy_loop(sock->sk)) { |
1139 | if (sk_can_busy_loop(sock->sk) && (events & POLL_BUSY_LOOP)) | 1139 | /* poll once if requested by the syscall */ |
1140 | sk_busy_loop(sock->sk, 1); | 1140 | if (events & POLL_BUSY_LOOP) |
1141 | return sock->ops->poll(file, sock, wait) | sock_poll_busy_flag(sock); | 1141 | sk_busy_loop(sock->sk, 1); |
1142 | |||
1143 | /* if this socket can poll_ll, tell the system call */ | ||
1144 | flag = POLL_BUSY_LOOP; | ||
1145 | } | ||
1146 | |||
1147 | return sock->ops->poll(file, sock, wait) | flag; | ||
1142 | } | 1148 | } |
1143 | 1149 | ||
1144 | static int sock_mmap(struct file *file, struct vm_area_struct *vma) | 1150 | static int sock_mmap(struct file *file, struct vm_area_struct *vma) |