aboutsummaryrefslogtreecommitdiffstats
path: root/net/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/socket.c')
-rw-r--r--net/socket.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/net/socket.c b/net/socket.c
index 4ca1526db756..45afa648364a 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -104,6 +104,12 @@
104#include <linux/route.h> 104#include <linux/route.h>
105#include <linux/sockios.h> 105#include <linux/sockios.h>
106#include <linux/atalk.h> 106#include <linux/atalk.h>
107#include <net/ll_poll.h>
108
109#ifdef CONFIG_NET_LL_RX_POLL
110unsigned int sysctl_net_ll_read __read_mostly;
111unsigned int sysctl_net_ll_poll __read_mostly;
112#endif
107 113
108static int sock_no_open(struct inode *irrelevant, struct file *dontcare); 114static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
109static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov, 115static ssize_t sock_aio_read(struct kiocb *iocb, const struct iovec *iov,
@@ -1142,13 +1148,24 @@ EXPORT_SYMBOL(sock_create_lite);
1142/* No kernel lock held - perfect */ 1148/* No kernel lock held - perfect */
1143static unsigned int sock_poll(struct file *file, poll_table *wait) 1149static unsigned int sock_poll(struct file *file, poll_table *wait)
1144{ 1150{
1151 unsigned int busy_flag = 0;
1145 struct socket *sock; 1152 struct socket *sock;
1146 1153
1147 /* 1154 /*
1148 * We can't return errors to poll, so it's either yes or no. 1155 * We can't return errors to poll, so it's either yes or no.
1149 */ 1156 */
1150 sock = file->private_data; 1157 sock = file->private_data;
1151 return sock->ops->poll(file, sock, wait); 1158
1159 if (sk_can_busy_loop(sock->sk)) {
1160 /* this socket can poll_ll so tell the system call */
1161 busy_flag = POLL_BUSY_LOOP;
1162
1163 /* once, only if requested by syscall */
1164 if (wait && (wait->_key & POLL_BUSY_LOOP))
1165 sk_busy_loop(sock->sk, 1);
1166 }
1167
1168 return busy_flag | sock->ops->poll(file, sock, wait);
1152} 1169}
1153 1170
1154static int sock_mmap(struct file *file, struct vm_area_struct *vma) 1171static int sock_mmap(struct file *file, struct vm_area_struct *vma)
@@ -2635,7 +2652,9 @@ static int __init sock_init(void)
2635 */ 2652 */
2636 2653
2637#ifdef CONFIG_NETFILTER 2654#ifdef CONFIG_NETFILTER
2638 netfilter_init(); 2655 err = netfilter_init();
2656 if (err)
2657 goto out;
2639#endif 2658#endif
2640 2659
2641#ifdef CONFIG_NETWORK_PHY_TIMESTAMPING 2660#ifdef CONFIG_NETWORK_PHY_TIMESTAMPING