diff options
Diffstat (limited to 'net')
108 files changed, 741 insertions, 449 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 73a65789271b..8ccee3d01822 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -693,7 +693,7 @@ static struct sk_buff **vlan_gro_receive(struct sk_buff **head, | |||
693 | out_unlock: | 693 | out_unlock: |
694 | rcu_read_unlock(); | 694 | rcu_read_unlock(); |
695 | out: | 695 | out: |
696 | NAPI_GRO_CB(skb)->flush |= flush; | 696 | skb_gro_flush_final(skb, pp, flush); |
697 | 697 | ||
698 | return pp; | 698 | return pp; |
699 | } | 699 | } |
diff --git a/net/Makefile b/net/Makefile index 13ec0d5415c7..bdaf53925acd 100644 --- a/net/Makefile +++ b/net/Makefile | |||
@@ -20,11 +20,7 @@ obj-$(CONFIG_TLS) += tls/ | |||
20 | obj-$(CONFIG_XFRM) += xfrm/ | 20 | obj-$(CONFIG_XFRM) += xfrm/ |
21 | obj-$(CONFIG_UNIX) += unix/ | 21 | obj-$(CONFIG_UNIX) += unix/ |
22 | obj-$(CONFIG_NET) += ipv6/ | 22 | obj-$(CONFIG_NET) += ipv6/ |
23 | ifneq ($(CC_CAN_LINK),y) | ||
24 | $(warning CC cannot link executables. Skipping bpfilter.) | ||
25 | else | ||
26 | obj-$(CONFIG_BPFILTER) += bpfilter/ | 23 | obj-$(CONFIG_BPFILTER) += bpfilter/ |
27 | endif | ||
28 | obj-$(CONFIG_PACKET) += packet/ | 24 | obj-$(CONFIG_PACKET) += packet/ |
29 | obj-$(CONFIG_NET_KEY) += key/ | 25 | obj-$(CONFIG_NET_KEY) += key/ |
30 | obj-$(CONFIG_BRIDGE) += bridge/ | 26 | obj-$(CONFIG_BRIDGE) += bridge/ |
diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c index 55fdba05d7d9..9b6bc5abe946 100644 --- a/net/appletalk/ddp.c +++ b/net/appletalk/ddp.c | |||
@@ -1869,7 +1869,7 @@ static const struct proto_ops atalk_dgram_ops = { | |||
1869 | .socketpair = sock_no_socketpair, | 1869 | .socketpair = sock_no_socketpair, |
1870 | .accept = sock_no_accept, | 1870 | .accept = sock_no_accept, |
1871 | .getname = atalk_getname, | 1871 | .getname = atalk_getname, |
1872 | .poll_mask = datagram_poll_mask, | 1872 | .poll = datagram_poll, |
1873 | .ioctl = atalk_ioctl, | 1873 | .ioctl = atalk_ioctl, |
1874 | #ifdef CONFIG_COMPAT | 1874 | #ifdef CONFIG_COMPAT |
1875 | .compat_ioctl = atalk_compat_ioctl, | 1875 | .compat_ioctl = atalk_compat_ioctl, |
diff --git a/net/atm/br2684.c b/net/atm/br2684.c index 36b3adacc0dd..10462de734ea 100644 --- a/net/atm/br2684.c +++ b/net/atm/br2684.c | |||
@@ -252,8 +252,7 @@ static int br2684_xmit_vcc(struct sk_buff *skb, struct net_device *dev, | |||
252 | 252 | ||
253 | ATM_SKB(skb)->vcc = atmvcc = brvcc->atmvcc; | 253 | ATM_SKB(skb)->vcc = atmvcc = brvcc->atmvcc; |
254 | pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, atmvcc, atmvcc->dev); | 254 | pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, atmvcc, atmvcc->dev); |
255 | refcount_add(skb->truesize, &sk_atm(atmvcc)->sk_wmem_alloc); | 255 | atm_account_tx(atmvcc, skb); |
256 | ATM_SKB(skb)->atm_options = atmvcc->atm_options; | ||
257 | dev->stats.tx_packets++; | 256 | dev->stats.tx_packets++; |
258 | dev->stats.tx_bytes += skb->len; | 257 | dev->stats.tx_bytes += skb->len; |
259 | 258 | ||
diff --git a/net/atm/clip.c b/net/atm/clip.c index 66caa48a27c2..d795b9c5aea4 100644 --- a/net/atm/clip.c +++ b/net/atm/clip.c | |||
@@ -381,8 +381,7 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb, | |||
381 | memcpy(here, llc_oui, sizeof(llc_oui)); | 381 | memcpy(here, llc_oui, sizeof(llc_oui)); |
382 | ((__be16 *) here)[3] = skb->protocol; | 382 | ((__be16 *) here)[3] = skb->protocol; |
383 | } | 383 | } |
384 | refcount_add(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc); | 384 | atm_account_tx(vcc, skb); |
385 | ATM_SKB(skb)->atm_options = vcc->atm_options; | ||
386 | entry->vccs->last_use = jiffies; | 385 | entry->vccs->last_use = jiffies; |
387 | pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, vcc, vcc->dev); | 386 | pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", skb, vcc, vcc->dev); |
388 | old = xchg(&entry->vccs->xoff, 1); /* assume XOFF ... */ | 387 | old = xchg(&entry->vccs->xoff, 1); /* assume XOFF ... */ |
diff --git a/net/atm/common.c b/net/atm/common.c index 1f2af59935db..a7a68e509628 100644 --- a/net/atm/common.c +++ b/net/atm/common.c | |||
@@ -630,10 +630,9 @@ int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t size) | |||
630 | goto out; | 630 | goto out; |
631 | } | 631 | } |
632 | pr_debug("%d += %d\n", sk_wmem_alloc_get(sk), skb->truesize); | 632 | pr_debug("%d += %d\n", sk_wmem_alloc_get(sk), skb->truesize); |
633 | refcount_add(skb->truesize, &sk->sk_wmem_alloc); | 633 | atm_account_tx(vcc, skb); |
634 | 634 | ||
635 | skb->dev = NULL; /* for paths shared with net_device interfaces */ | 635 | skb->dev = NULL; /* for paths shared with net_device interfaces */ |
636 | ATM_SKB(skb)->atm_options = vcc->atm_options; | ||
637 | if (!copy_from_iter_full(skb_put(skb, size), size, &m->msg_iter)) { | 636 | if (!copy_from_iter_full(skb_put(skb, size), size, &m->msg_iter)) { |
638 | kfree_skb(skb); | 637 | kfree_skb(skb); |
639 | error = -EFAULT; | 638 | error = -EFAULT; |
@@ -648,11 +647,16 @@ out: | |||
648 | return error; | 647 | return error; |
649 | } | 648 | } |
650 | 649 | ||
651 | __poll_t vcc_poll_mask(struct socket *sock, __poll_t events) | 650 | __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait) |
652 | { | 651 | { |
653 | struct sock *sk = sock->sk; | 652 | struct sock *sk = sock->sk; |
654 | struct atm_vcc *vcc = ATM_SD(sock); | 653 | struct atm_vcc *vcc; |
655 | __poll_t mask = 0; | 654 | __poll_t mask; |
655 | |||
656 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
657 | mask = 0; | ||
658 | |||
659 | vcc = ATM_SD(sock); | ||
656 | 660 | ||
657 | /* exceptional events */ | 661 | /* exceptional events */ |
658 | if (sk->sk_err) | 662 | if (sk->sk_err) |
diff --git a/net/atm/common.h b/net/atm/common.h index 526796ad230f..5850649068bb 100644 --- a/net/atm/common.h +++ b/net/atm/common.h | |||
@@ -17,7 +17,7 @@ int vcc_connect(struct socket *sock, int itf, short vpi, int vci); | |||
17 | int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, | 17 | int vcc_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, |
18 | int flags); | 18 | int flags); |
19 | int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len); | 19 | int vcc_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len); |
20 | __poll_t vcc_poll_mask(struct socket *sock, __poll_t events); | 20 | __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait); |
21 | int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | 21 | int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
22 | int vcc_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); | 22 | int vcc_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); |
23 | int vcc_setsockopt(struct socket *sock, int level, int optname, | 23 | int vcc_setsockopt(struct socket *sock, int level, int optname, |
diff --git a/net/atm/lec.c b/net/atm/lec.c index 5a95fcf6f9b6..d7f5cf5b7594 100644 --- a/net/atm/lec.c +++ b/net/atm/lec.c | |||
@@ -182,9 +182,8 @@ lec_send(struct atm_vcc *vcc, struct sk_buff *skb) | |||
182 | struct net_device *dev = skb->dev; | 182 | struct net_device *dev = skb->dev; |
183 | 183 | ||
184 | ATM_SKB(skb)->vcc = vcc; | 184 | ATM_SKB(skb)->vcc = vcc; |
185 | ATM_SKB(skb)->atm_options = vcc->atm_options; | 185 | atm_account_tx(vcc, skb); |
186 | 186 | ||
187 | refcount_add(skb->truesize, &sk_atm(vcc)->sk_wmem_alloc); | ||
188 | if (vcc->send(vcc, skb) < 0) { | 187 | if (vcc->send(vcc, skb) < 0) { |
189 | dev->stats.tx_dropped++; | 188 | dev->stats.tx_dropped++; |
190 | return; | 189 | return; |
diff --git a/net/atm/mpc.c b/net/atm/mpc.c index 75620c2f2617..24b53c4c39c6 100644 --- a/net/atm/mpc.c +++ b/net/atm/mpc.c | |||
@@ -555,8 +555,7 @@ static int send_via_shortcut(struct sk_buff *skb, struct mpoa_client *mpc) | |||
555 | sizeof(struct llc_snap_hdr)); | 555 | sizeof(struct llc_snap_hdr)); |
556 | } | 556 | } |
557 | 557 | ||
558 | refcount_add(skb->truesize, &sk_atm(entry->shortcut)->sk_wmem_alloc); | 558 | atm_account_tx(entry->shortcut, skb); |
559 | ATM_SKB(skb)->atm_options = entry->shortcut->atm_options; | ||
560 | entry->shortcut->send(entry->shortcut, skb); | 559 | entry->shortcut->send(entry->shortcut, skb); |
561 | entry->packets_fwded++; | 560 | entry->packets_fwded++; |
562 | mpc->in_ops->put(entry); | 561 | mpc->in_ops->put(entry); |
diff --git a/net/atm/pppoatm.c b/net/atm/pppoatm.c index 21d9d341a619..af8c4b38b746 100644 --- a/net/atm/pppoatm.c +++ b/net/atm/pppoatm.c | |||
@@ -350,8 +350,7 @@ static int pppoatm_send(struct ppp_channel *chan, struct sk_buff *skb) | |||
350 | return 1; | 350 | return 1; |
351 | } | 351 | } |
352 | 352 | ||
353 | refcount_add(skb->truesize, &sk_atm(ATM_SKB(skb)->vcc)->sk_wmem_alloc); | 353 | atm_account_tx(vcc, skb); |
354 | ATM_SKB(skb)->atm_options = ATM_SKB(skb)->vcc->atm_options; | ||
355 | pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", | 354 | pr_debug("atm_skb(%p)->vcc(%p)->dev(%p)\n", |
356 | skb, ATM_SKB(skb)->vcc, ATM_SKB(skb)->vcc->dev); | 355 | skb, ATM_SKB(skb)->vcc, ATM_SKB(skb)->vcc->dev); |
357 | ret = ATM_SKB(skb)->vcc->send(ATM_SKB(skb)->vcc, skb) | 356 | ret = ATM_SKB(skb)->vcc->send(ATM_SKB(skb)->vcc, skb) |
diff --git a/net/atm/pvc.c b/net/atm/pvc.c index 9f75092fe778..2cb10af16afc 100644 --- a/net/atm/pvc.c +++ b/net/atm/pvc.c | |||
@@ -113,7 +113,7 @@ static const struct proto_ops pvc_proto_ops = { | |||
113 | .socketpair = sock_no_socketpair, | 113 | .socketpair = sock_no_socketpair, |
114 | .accept = sock_no_accept, | 114 | .accept = sock_no_accept, |
115 | .getname = pvc_getname, | 115 | .getname = pvc_getname, |
116 | .poll_mask = vcc_poll_mask, | 116 | .poll = vcc_poll, |
117 | .ioctl = vcc_ioctl, | 117 | .ioctl = vcc_ioctl, |
118 | #ifdef CONFIG_COMPAT | 118 | #ifdef CONFIG_COMPAT |
119 | .compat_ioctl = vcc_compat_ioctl, | 119 | .compat_ioctl = vcc_compat_ioctl, |
diff --git a/net/atm/raw.c b/net/atm/raw.c index ee10e8d46185..b3ba44aab0ee 100644 --- a/net/atm/raw.c +++ b/net/atm/raw.c | |||
@@ -35,8 +35,8 @@ static void atm_pop_raw(struct atm_vcc *vcc, struct sk_buff *skb) | |||
35 | struct sock *sk = sk_atm(vcc); | 35 | struct sock *sk = sk_atm(vcc); |
36 | 36 | ||
37 | pr_debug("(%d) %d -= %d\n", | 37 | pr_debug("(%d) %d -= %d\n", |
38 | vcc->vci, sk_wmem_alloc_get(sk), skb->truesize); | 38 | vcc->vci, sk_wmem_alloc_get(sk), ATM_SKB(skb)->acct_truesize); |
39 | WARN_ON(refcount_sub_and_test(skb->truesize, &sk->sk_wmem_alloc)); | 39 | WARN_ON(refcount_sub_and_test(ATM_SKB(skb)->acct_truesize, &sk->sk_wmem_alloc)); |
40 | dev_kfree_skb_any(skb); | 40 | dev_kfree_skb_any(skb); |
41 | sk->sk_write_space(sk); | 41 | sk->sk_write_space(sk); |
42 | } | 42 | } |
diff --git a/net/atm/svc.c b/net/atm/svc.c index 53f4ad7087b1..2f91b766ac42 100644 --- a/net/atm/svc.c +++ b/net/atm/svc.c | |||
@@ -636,7 +636,7 @@ static const struct proto_ops svc_proto_ops = { | |||
636 | .socketpair = sock_no_socketpair, | 636 | .socketpair = sock_no_socketpair, |
637 | .accept = svc_accept, | 637 | .accept = svc_accept, |
638 | .getname = svc_getname, | 638 | .getname = svc_getname, |
639 | .poll_mask = vcc_poll_mask, | 639 | .poll = vcc_poll, |
640 | .ioctl = svc_ioctl, | 640 | .ioctl = svc_ioctl, |
641 | #ifdef CONFIG_COMPAT | 641 | #ifdef CONFIG_COMPAT |
642 | .compat_ioctl = svc_compat_ioctl, | 642 | .compat_ioctl = svc_compat_ioctl, |
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index d1d2442ce573..c603d33d5410 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c | |||
@@ -1941,7 +1941,7 @@ static const struct proto_ops ax25_proto_ops = { | |||
1941 | .socketpair = sock_no_socketpair, | 1941 | .socketpair = sock_no_socketpair, |
1942 | .accept = ax25_accept, | 1942 | .accept = ax25_accept, |
1943 | .getname = ax25_getname, | 1943 | .getname = ax25_getname, |
1944 | .poll_mask = datagram_poll_mask, | 1944 | .poll = datagram_poll, |
1945 | .ioctl = ax25_ioctl, | 1945 | .ioctl = ax25_ioctl, |
1946 | .listen = ax25_listen, | 1946 | .listen = ax25_listen, |
1947 | .shutdown = ax25_shutdown, | 1947 | .shutdown = ax25_shutdown, |
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 510ab4f55df5..3264e1873219 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -437,13 +437,16 @@ static inline __poll_t bt_accept_poll(struct sock *parent) | |||
437 | return 0; | 437 | return 0; |
438 | } | 438 | } |
439 | 439 | ||
440 | __poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events) | 440 | __poll_t bt_sock_poll(struct file *file, struct socket *sock, |
441 | poll_table *wait) | ||
441 | { | 442 | { |
442 | struct sock *sk = sock->sk; | 443 | struct sock *sk = sock->sk; |
443 | __poll_t mask = 0; | 444 | __poll_t mask = 0; |
444 | 445 | ||
445 | BT_DBG("sock %p, sk %p", sock, sk); | 446 | BT_DBG("sock %p, sk %p", sock, sk); |
446 | 447 | ||
448 | poll_wait(file, sk_sleep(sk), wait); | ||
449 | |||
447 | if (sk->sk_state == BT_LISTEN) | 450 | if (sk->sk_state == BT_LISTEN) |
448 | return bt_accept_poll(sk); | 451 | return bt_accept_poll(sk); |
449 | 452 | ||
@@ -475,7 +478,7 @@ __poll_t bt_sock_poll_mask(struct socket *sock, __poll_t events) | |||
475 | 478 | ||
476 | return mask; | 479 | return mask; |
477 | } | 480 | } |
478 | EXPORT_SYMBOL(bt_sock_poll_mask); | 481 | EXPORT_SYMBOL(bt_sock_poll); |
479 | 482 | ||
480 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | 483 | int bt_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) |
481 | { | 484 | { |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index d6c099861538..1506e1632394 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -1975,7 +1975,7 @@ static const struct proto_ops hci_sock_ops = { | |||
1975 | .sendmsg = hci_sock_sendmsg, | 1975 | .sendmsg = hci_sock_sendmsg, |
1976 | .recvmsg = hci_sock_recvmsg, | 1976 | .recvmsg = hci_sock_recvmsg, |
1977 | .ioctl = hci_sock_ioctl, | 1977 | .ioctl = hci_sock_ioctl, |
1978 | .poll_mask = datagram_poll_mask, | 1978 | .poll = datagram_poll, |
1979 | .listen = sock_no_listen, | 1979 | .listen = sock_no_listen, |
1980 | .shutdown = sock_no_shutdown, | 1980 | .shutdown = sock_no_shutdown, |
1981 | .setsockopt = hci_sock_setsockopt, | 1981 | .setsockopt = hci_sock_setsockopt, |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 742a190034e6..686bdc6b35b0 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -1653,7 +1653,7 @@ static const struct proto_ops l2cap_sock_ops = { | |||
1653 | .getname = l2cap_sock_getname, | 1653 | .getname = l2cap_sock_getname, |
1654 | .sendmsg = l2cap_sock_sendmsg, | 1654 | .sendmsg = l2cap_sock_sendmsg, |
1655 | .recvmsg = l2cap_sock_recvmsg, | 1655 | .recvmsg = l2cap_sock_recvmsg, |
1656 | .poll_mask = bt_sock_poll_mask, | 1656 | .poll = bt_sock_poll, |
1657 | .ioctl = bt_sock_ioctl, | 1657 | .ioctl = bt_sock_ioctl, |
1658 | .mmap = sock_no_mmap, | 1658 | .mmap = sock_no_mmap, |
1659 | .socketpair = sock_no_socketpair, | 1659 | .socketpair = sock_no_socketpair, |
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 1cf57622473a..d606e9212291 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c | |||
@@ -1049,7 +1049,7 @@ static const struct proto_ops rfcomm_sock_ops = { | |||
1049 | .setsockopt = rfcomm_sock_setsockopt, | 1049 | .setsockopt = rfcomm_sock_setsockopt, |
1050 | .getsockopt = rfcomm_sock_getsockopt, | 1050 | .getsockopt = rfcomm_sock_getsockopt, |
1051 | .ioctl = rfcomm_sock_ioctl, | 1051 | .ioctl = rfcomm_sock_ioctl, |
1052 | .poll_mask = bt_sock_poll_mask, | 1052 | .poll = bt_sock_poll, |
1053 | .socketpair = sock_no_socketpair, | 1053 | .socketpair = sock_no_socketpair, |
1054 | .mmap = sock_no_mmap | 1054 | .mmap = sock_no_mmap |
1055 | }; | 1055 | }; |
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index d60dbc61d170..413b8ee49fec 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -1197,7 +1197,7 @@ static const struct proto_ops sco_sock_ops = { | |||
1197 | .getname = sco_sock_getname, | 1197 | .getname = sco_sock_getname, |
1198 | .sendmsg = sco_sock_sendmsg, | 1198 | .sendmsg = sco_sock_sendmsg, |
1199 | .recvmsg = sco_sock_recvmsg, | 1199 | .recvmsg = sco_sock_recvmsg, |
1200 | .poll_mask = bt_sock_poll_mask, | 1200 | .poll = bt_sock_poll, |
1201 | .ioctl = bt_sock_ioctl, | 1201 | .ioctl = bt_sock_ioctl, |
1202 | .mmap = sock_no_mmap, | 1202 | .mmap = sock_no_mmap, |
1203 | .socketpair = sock_no_socketpair, | 1203 | .socketpair = sock_no_socketpair, |
diff --git a/net/bpfilter/.gitignore b/net/bpfilter/.gitignore new file mode 100644 index 000000000000..e97084e3eea2 --- /dev/null +++ b/net/bpfilter/.gitignore | |||
@@ -0,0 +1 @@ | |||
bpfilter_umh | |||
diff --git a/net/bpfilter/Kconfig b/net/bpfilter/Kconfig index a948b072c28f..76deb6615883 100644 --- a/net/bpfilter/Kconfig +++ b/net/bpfilter/Kconfig | |||
@@ -1,6 +1,5 @@ | |||
1 | menuconfig BPFILTER | 1 | menuconfig BPFILTER |
2 | bool "BPF based packet filtering framework (BPFILTER)" | 2 | bool "BPF based packet filtering framework (BPFILTER)" |
3 | default n | ||
4 | depends on NET && BPF && INET | 3 | depends on NET && BPF && INET |
5 | help | 4 | help |
6 | This builds experimental bpfilter framework that is aiming to | 5 | This builds experimental bpfilter framework that is aiming to |
@@ -9,6 +8,7 @@ menuconfig BPFILTER | |||
9 | if BPFILTER | 8 | if BPFILTER |
10 | config BPFILTER_UMH | 9 | config BPFILTER_UMH |
11 | tristate "bpfilter kernel module with user mode helper" | 10 | tristate "bpfilter kernel module with user mode helper" |
11 | depends on $(success,$(srctree)/scripts/cc-can-link.sh $(CC)) | ||
12 | default m | 12 | default m |
13 | help | 13 | help |
14 | This builds bpfilter kernel module with embedded user mode helper | 14 | This builds bpfilter kernel module with embedded user mode helper |
diff --git a/net/bpfilter/Makefile b/net/bpfilter/Makefile index e0bbe7583e58..39c6980b5d99 100644 --- a/net/bpfilter/Makefile +++ b/net/bpfilter/Makefile | |||
@@ -15,18 +15,7 @@ ifeq ($(CONFIG_BPFILTER_UMH), y) | |||
15 | HOSTLDFLAGS += -static | 15 | HOSTLDFLAGS += -static |
16 | endif | 16 | endif |
17 | 17 | ||
18 | # a bit of elf magic to convert bpfilter_umh binary into a binary blob | 18 | $(obj)/bpfilter_umh_blob.o: $(obj)/bpfilter_umh |
19 | # inside bpfilter_umh.o elf file referenced by | ||
20 | # _binary_net_bpfilter_bpfilter_umh_start symbol | ||
21 | # which bpfilter_kern.c passes further into umh blob loader at run-time | ||
22 | quiet_cmd_copy_umh = GEN $@ | ||
23 | cmd_copy_umh = echo ':' > $(obj)/.bpfilter_umh.o.cmd; \ | ||
24 | $(OBJCOPY) -I binary -O `$(OBJDUMP) -f $<|grep format|cut -d' ' -f8` \ | ||
25 | -B `$(OBJDUMP) -f $<|grep architecture|cut -d, -f1|cut -d' ' -f2` \ | ||
26 | --rename-section .data=.init.rodata $< $@ | ||
27 | |||
28 | $(obj)/bpfilter_umh.o: $(obj)/bpfilter_umh | ||
29 | $(call cmd,copy_umh) | ||
30 | 19 | ||
31 | obj-$(CONFIG_BPFILTER_UMH) += bpfilter.o | 20 | obj-$(CONFIG_BPFILTER_UMH) += bpfilter.o |
32 | bpfilter-objs += bpfilter_kern.o bpfilter_umh.o | 21 | bpfilter-objs += bpfilter_kern.o bpfilter_umh_blob.o |
diff --git a/net/bpfilter/bpfilter_kern.c b/net/bpfilter/bpfilter_kern.c index 09522573f611..f0fc182d3db7 100644 --- a/net/bpfilter/bpfilter_kern.c +++ b/net/bpfilter/bpfilter_kern.c | |||
@@ -10,11 +10,8 @@ | |||
10 | #include <linux/file.h> | 10 | #include <linux/file.h> |
11 | #include "msgfmt.h" | 11 | #include "msgfmt.h" |
12 | 12 | ||
13 | #define UMH_start _binary_net_bpfilter_bpfilter_umh_start | 13 | extern char bpfilter_umh_start; |
14 | #define UMH_end _binary_net_bpfilter_bpfilter_umh_end | 14 | extern char bpfilter_umh_end; |
15 | |||
16 | extern char UMH_start; | ||
17 | extern char UMH_end; | ||
18 | 15 | ||
19 | static struct umh_info info; | 16 | static struct umh_info info; |
20 | /* since ip_getsockopt() can run in parallel, serialize access to umh */ | 17 | /* since ip_getsockopt() can run in parallel, serialize access to umh */ |
@@ -93,7 +90,9 @@ static int __init load_umh(void) | |||
93 | int err; | 90 | int err; |
94 | 91 | ||
95 | /* fork usermode process */ | 92 | /* fork usermode process */ |
96 | err = fork_usermode_blob(&UMH_start, &UMH_end - &UMH_start, &info); | 93 | err = fork_usermode_blob(&bpfilter_umh_start, |
94 | &bpfilter_umh_end - &bpfilter_umh_start, | ||
95 | &info); | ||
97 | if (err) | 96 | if (err) |
98 | return err; | 97 | return err; |
99 | pr_info("Loaded bpfilter_umh pid %d\n", info.pid); | 98 | pr_info("Loaded bpfilter_umh pid %d\n", info.pid); |
diff --git a/net/bpfilter/bpfilter_umh_blob.S b/net/bpfilter/bpfilter_umh_blob.S new file mode 100644 index 000000000000..40311d10d2f2 --- /dev/null +++ b/net/bpfilter/bpfilter_umh_blob.S | |||
@@ -0,0 +1,7 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0 */ | ||
2 | .section .init.rodata, "a" | ||
3 | .global bpfilter_umh_start | ||
4 | bpfilter_umh_start: | ||
5 | .incbin "net/bpfilter/bpfilter_umh" | ||
6 | .global bpfilter_umh_end | ||
7 | bpfilter_umh_end: | ||
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index c7991867d622..a6fb1b3bcad9 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
@@ -934,11 +934,15 @@ static int caif_release(struct socket *sock) | |||
934 | } | 934 | } |
935 | 935 | ||
936 | /* Copied from af_unix.c:unix_poll(), added CAIF tx_flow handling */ | 936 | /* Copied from af_unix.c:unix_poll(), added CAIF tx_flow handling */ |
937 | static __poll_t caif_poll_mask(struct socket *sock, __poll_t events) | 937 | static __poll_t caif_poll(struct file *file, |
938 | struct socket *sock, poll_table *wait) | ||
938 | { | 939 | { |
939 | struct sock *sk = sock->sk; | 940 | struct sock *sk = sock->sk; |
941 | __poll_t mask; | ||
940 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); | 942 | struct caifsock *cf_sk = container_of(sk, struct caifsock, sk); |
941 | __poll_t mask = 0; | 943 | |
944 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
945 | mask = 0; | ||
942 | 946 | ||
943 | /* exceptional events? */ | 947 | /* exceptional events? */ |
944 | if (sk->sk_err) | 948 | if (sk->sk_err) |
@@ -972,7 +976,7 @@ static const struct proto_ops caif_seqpacket_ops = { | |||
972 | .socketpair = sock_no_socketpair, | 976 | .socketpair = sock_no_socketpair, |
973 | .accept = sock_no_accept, | 977 | .accept = sock_no_accept, |
974 | .getname = sock_no_getname, | 978 | .getname = sock_no_getname, |
975 | .poll_mask = caif_poll_mask, | 979 | .poll = caif_poll, |
976 | .ioctl = sock_no_ioctl, | 980 | .ioctl = sock_no_ioctl, |
977 | .listen = sock_no_listen, | 981 | .listen = sock_no_listen, |
978 | .shutdown = sock_no_shutdown, | 982 | .shutdown = sock_no_shutdown, |
@@ -993,7 +997,7 @@ static const struct proto_ops caif_stream_ops = { | |||
993 | .socketpair = sock_no_socketpair, | 997 | .socketpair = sock_no_socketpair, |
994 | .accept = sock_no_accept, | 998 | .accept = sock_no_accept, |
995 | .getname = sock_no_getname, | 999 | .getname = sock_no_getname, |
996 | .poll_mask = caif_poll_mask, | 1000 | .poll = caif_poll, |
997 | .ioctl = sock_no_ioctl, | 1001 | .ioctl = sock_no_ioctl, |
998 | .listen = sock_no_listen, | 1002 | .listen = sock_no_listen, |
999 | .shutdown = sock_no_shutdown, | 1003 | .shutdown = sock_no_shutdown, |
diff --git a/net/can/bcm.c b/net/can/bcm.c index 9393f25df08d..0af8f0db892a 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
@@ -1660,7 +1660,7 @@ static const struct proto_ops bcm_ops = { | |||
1660 | .socketpair = sock_no_socketpair, | 1660 | .socketpair = sock_no_socketpair, |
1661 | .accept = sock_no_accept, | 1661 | .accept = sock_no_accept, |
1662 | .getname = sock_no_getname, | 1662 | .getname = sock_no_getname, |
1663 | .poll_mask = datagram_poll_mask, | 1663 | .poll = datagram_poll, |
1664 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ | 1664 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ |
1665 | .listen = sock_no_listen, | 1665 | .listen = sock_no_listen, |
1666 | .shutdown = sock_no_shutdown, | 1666 | .shutdown = sock_no_shutdown, |
diff --git a/net/can/raw.c b/net/can/raw.c index fd7e2f49ea6a..1051eee82581 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
@@ -843,7 +843,7 @@ static const struct proto_ops raw_ops = { | |||
843 | .socketpair = sock_no_socketpair, | 843 | .socketpair = sock_no_socketpair, |
844 | .accept = sock_no_accept, | 844 | .accept = sock_no_accept, |
845 | .getname = raw_getname, | 845 | .getname = raw_getname, |
846 | .poll_mask = datagram_poll_mask, | 846 | .poll = datagram_poll, |
847 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ | 847 | .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ |
848 | .listen = sock_no_listen, | 848 | .listen = sock_no_listen, |
849 | .shutdown = sock_no_shutdown, | 849 | .shutdown = sock_no_shutdown, |
diff --git a/net/core/datagram.c b/net/core/datagram.c index f19bf3dc2bd6..9938952c5c78 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
@@ -819,8 +819,9 @@ EXPORT_SYMBOL(skb_copy_and_csum_datagram_msg); | |||
819 | 819 | ||
820 | /** | 820 | /** |
821 | * datagram_poll - generic datagram poll | 821 | * datagram_poll - generic datagram poll |
822 | * @file: file struct | ||
822 | * @sock: socket | 823 | * @sock: socket |
823 | * @events to wait for | 824 | * @wait: poll table |
824 | * | 825 | * |
825 | * Datagram poll: Again totally generic. This also handles | 826 | * Datagram poll: Again totally generic. This also handles |
826 | * sequenced packet sockets providing the socket receive queue | 827 | * sequenced packet sockets providing the socket receive queue |
@@ -830,10 +831,14 @@ EXPORT_SYMBOL(skb_copy_and_csum_datagram_msg); | |||
830 | * and you use a different write policy from sock_writeable() | 831 | * and you use a different write policy from sock_writeable() |
831 | * then please supply your own write_space callback. | 832 | * then please supply your own write_space callback. |
832 | */ | 833 | */ |
833 | __poll_t datagram_poll_mask(struct socket *sock, __poll_t events) | 834 | __poll_t datagram_poll(struct file *file, struct socket *sock, |
835 | poll_table *wait) | ||
834 | { | 836 | { |
835 | struct sock *sk = sock->sk; | 837 | struct sock *sk = sock->sk; |
836 | __poll_t mask = 0; | 838 | __poll_t mask; |
839 | |||
840 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
841 | mask = 0; | ||
837 | 842 | ||
838 | /* exceptional events? */ | 843 | /* exceptional events? */ |
839 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) | 844 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) |
@@ -866,4 +871,4 @@ __poll_t datagram_poll_mask(struct socket *sock, __poll_t events) | |||
866 | 871 | ||
867 | return mask; | 872 | return mask; |
868 | } | 873 | } |
869 | EXPORT_SYMBOL(datagram_poll_mask); | 874 | EXPORT_SYMBOL(datagram_poll); |
diff --git a/net/core/dev.c b/net/core/dev.c index 57b7bab5f70b..a5aa1c7444e6 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -8643,7 +8643,8 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
8643 | /* We get here if we can't use the current device name */ | 8643 | /* We get here if we can't use the current device name */ |
8644 | if (!pat) | 8644 | if (!pat) |
8645 | goto out; | 8645 | goto out; |
8646 | if (dev_get_valid_name(net, dev, pat) < 0) | 8646 | err = dev_get_valid_name(net, dev, pat); |
8647 | if (err < 0) | ||
8647 | goto out; | 8648 | goto out; |
8648 | } | 8649 | } |
8649 | 8650 | ||
@@ -8655,7 +8656,6 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
8655 | dev_close(dev); | 8656 | dev_close(dev); |
8656 | 8657 | ||
8657 | /* And unlink it from device chain */ | 8658 | /* And unlink it from device chain */ |
8658 | err = -ENODEV; | ||
8659 | unlist_netdevice(dev); | 8659 | unlist_netdevice(dev); |
8660 | 8660 | ||
8661 | synchronize_net(); | 8661 | synchronize_net(); |
diff --git a/net/core/dev_ioctl.c b/net/core/dev_ioctl.c index a04e1e88bf3a..50537ff961a7 100644 --- a/net/core/dev_ioctl.c +++ b/net/core/dev_ioctl.c | |||
@@ -285,16 +285,9 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
285 | if (ifr->ifr_qlen < 0) | 285 | if (ifr->ifr_qlen < 0) |
286 | return -EINVAL; | 286 | return -EINVAL; |
287 | if (dev->tx_queue_len ^ ifr->ifr_qlen) { | 287 | if (dev->tx_queue_len ^ ifr->ifr_qlen) { |
288 | unsigned int orig_len = dev->tx_queue_len; | 288 | err = dev_change_tx_queue_len(dev, ifr->ifr_qlen); |
289 | 289 | if (err) | |
290 | dev->tx_queue_len = ifr->ifr_qlen; | ||
291 | err = call_netdevice_notifiers( | ||
292 | NETDEV_CHANGE_TX_QUEUE_LEN, dev); | ||
293 | err = notifier_to_errno(err); | ||
294 | if (err) { | ||
295 | dev->tx_queue_len = orig_len; | ||
296 | return err; | 290 | return err; |
297 | } | ||
298 | } | 291 | } |
299 | return 0; | 292 | return 0; |
300 | 293 | ||
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index 126ffc5bc630..f64aa13811ea 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c | |||
@@ -416,6 +416,14 @@ static struct fib_rule *rule_find(struct fib_rules_ops *ops, | |||
416 | if (rule->mark && r->mark != rule->mark) | 416 | if (rule->mark && r->mark != rule->mark) |
417 | continue; | 417 | continue; |
418 | 418 | ||
419 | if (rule->suppress_ifgroup != -1 && | ||
420 | r->suppress_ifgroup != rule->suppress_ifgroup) | ||
421 | continue; | ||
422 | |||
423 | if (rule->suppress_prefixlen != -1 && | ||
424 | r->suppress_prefixlen != rule->suppress_prefixlen) | ||
425 | continue; | ||
426 | |||
419 | if (rule->mark_mask && r->mark_mask != rule->mark_mask) | 427 | if (rule->mark_mask && r->mark_mask != rule->mark_mask) |
420 | continue; | 428 | continue; |
421 | 429 | ||
@@ -436,6 +444,9 @@ static struct fib_rule *rule_find(struct fib_rules_ops *ops, | |||
436 | if (rule->ip_proto && r->ip_proto != rule->ip_proto) | 444 | if (rule->ip_proto && r->ip_proto != rule->ip_proto) |
437 | continue; | 445 | continue; |
438 | 446 | ||
447 | if (rule->proto && r->proto != rule->proto) | ||
448 | continue; | ||
449 | |||
439 | if (fib_rule_port_range_set(&rule->sport_range) && | 450 | if (fib_rule_port_range_set(&rule->sport_range) && |
440 | !fib_rule_port_range_compare(&r->sport_range, | 451 | !fib_rule_port_range_compare(&r->sport_range, |
441 | &rule->sport_range)) | 452 | &rule->sport_range)) |
@@ -645,6 +656,73 @@ errout: | |||
645 | return err; | 656 | return err; |
646 | } | 657 | } |
647 | 658 | ||
659 | static int rule_exists(struct fib_rules_ops *ops, struct fib_rule_hdr *frh, | ||
660 | struct nlattr **tb, struct fib_rule *rule) | ||
661 | { | ||
662 | struct fib_rule *r; | ||
663 | |||
664 | list_for_each_entry(r, &ops->rules_list, list) { | ||
665 | if (r->action != rule->action) | ||
666 | continue; | ||
667 | |||
668 | if (r->table != rule->table) | ||
669 | continue; | ||
670 | |||
671 | if (r->pref != rule->pref) | ||
672 | continue; | ||
673 | |||
674 | if (memcmp(r->iifname, rule->iifname, IFNAMSIZ)) | ||
675 | continue; | ||
676 | |||
677 | if (memcmp(r->oifname, rule->oifname, IFNAMSIZ)) | ||
678 | continue; | ||
679 | |||
680 | if (r->mark != rule->mark) | ||
681 | continue; | ||
682 | |||
683 | if (r->suppress_ifgroup != rule->suppress_ifgroup) | ||
684 | continue; | ||
685 | |||
686 | if (r->suppress_prefixlen != rule->suppress_prefixlen) | ||
687 | continue; | ||
688 | |||
689 | if (r->mark_mask != rule->mark_mask) | ||
690 | continue; | ||
691 | |||
692 | if (r->tun_id != rule->tun_id) | ||
693 | continue; | ||
694 | |||
695 | if (r->fr_net != rule->fr_net) | ||
696 | continue; | ||
697 | |||
698 | if (r->l3mdev != rule->l3mdev) | ||
699 | continue; | ||
700 | |||
701 | if (!uid_eq(r->uid_range.start, rule->uid_range.start) || | ||
702 | !uid_eq(r->uid_range.end, rule->uid_range.end)) | ||
703 | continue; | ||
704 | |||
705 | if (r->ip_proto != rule->ip_proto) | ||
706 | continue; | ||
707 | |||
708 | if (r->proto != rule->proto) | ||
709 | continue; | ||
710 | |||
711 | if (!fib_rule_port_range_compare(&r->sport_range, | ||
712 | &rule->sport_range)) | ||
713 | continue; | ||
714 | |||
715 | if (!fib_rule_port_range_compare(&r->dport_range, | ||
716 | &rule->dport_range)) | ||
717 | continue; | ||
718 | |||
719 | if (!ops->compare(r, frh, tb)) | ||
720 | continue; | ||
721 | return 1; | ||
722 | } | ||
723 | return 0; | ||
724 | } | ||
725 | |||
648 | int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, | 726 | int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, |
649 | struct netlink_ext_ack *extack) | 727 | struct netlink_ext_ack *extack) |
650 | { | 728 | { |
@@ -679,7 +757,7 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
679 | goto errout; | 757 | goto errout; |
680 | 758 | ||
681 | if ((nlh->nlmsg_flags & NLM_F_EXCL) && | 759 | if ((nlh->nlmsg_flags & NLM_F_EXCL) && |
682 | rule_find(ops, frh, tb, rule, user_priority)) { | 760 | rule_exists(ops, frh, tb, rule)) { |
683 | err = -EEXIST; | 761 | err = -EEXIST; |
684 | goto errout_free; | 762 | goto errout_free; |
685 | } | 763 | } |
diff --git a/net/core/filter.c b/net/core/filter.c index 3d9ba7e5965a..0ca6907d7efe 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -3214,20 +3214,6 @@ err: | |||
3214 | } | 3214 | } |
3215 | EXPORT_SYMBOL_GPL(xdp_do_redirect); | 3215 | EXPORT_SYMBOL_GPL(xdp_do_redirect); |
3216 | 3216 | ||
3217 | static int __xdp_generic_ok_fwd_dev(struct sk_buff *skb, struct net_device *fwd) | ||
3218 | { | ||
3219 | unsigned int len; | ||
3220 | |||
3221 | if (unlikely(!(fwd->flags & IFF_UP))) | ||
3222 | return -ENETDOWN; | ||
3223 | |||
3224 | len = fwd->mtu + fwd->hard_header_len + VLAN_HLEN; | ||
3225 | if (skb->len > len) | ||
3226 | return -EMSGSIZE; | ||
3227 | |||
3228 | return 0; | ||
3229 | } | ||
3230 | |||
3231 | static int xdp_do_generic_redirect_map(struct net_device *dev, | 3217 | static int xdp_do_generic_redirect_map(struct net_device *dev, |
3232 | struct sk_buff *skb, | 3218 | struct sk_buff *skb, |
3233 | struct xdp_buff *xdp, | 3219 | struct xdp_buff *xdp, |
@@ -3256,10 +3242,11 @@ static int xdp_do_generic_redirect_map(struct net_device *dev, | |||
3256 | } | 3242 | } |
3257 | 3243 | ||
3258 | if (map->map_type == BPF_MAP_TYPE_DEVMAP) { | 3244 | if (map->map_type == BPF_MAP_TYPE_DEVMAP) { |
3259 | if (unlikely((err = __xdp_generic_ok_fwd_dev(skb, fwd)))) | 3245 | struct bpf_dtab_netdev *dst = fwd; |
3246 | |||
3247 | err = dev_map_generic_redirect(dst, skb, xdp_prog); | ||
3248 | if (unlikely(err)) | ||
3260 | goto err; | 3249 | goto err; |
3261 | skb->dev = fwd; | ||
3262 | generic_xdp_tx(skb, xdp_prog); | ||
3263 | } else if (map->map_type == BPF_MAP_TYPE_XSKMAP) { | 3250 | } else if (map->map_type == BPF_MAP_TYPE_XSKMAP) { |
3264 | struct xdp_sock *xs = fwd; | 3251 | struct xdp_sock *xs = fwd; |
3265 | 3252 | ||
@@ -4086,8 +4073,9 @@ static int bpf_fib_set_fwd_params(struct bpf_fib_lookup *params, | |||
4086 | memcpy(params->smac, dev->dev_addr, ETH_ALEN); | 4073 | memcpy(params->smac, dev->dev_addr, ETH_ALEN); |
4087 | params->h_vlan_TCI = 0; | 4074 | params->h_vlan_TCI = 0; |
4088 | params->h_vlan_proto = 0; | 4075 | params->h_vlan_proto = 0; |
4076 | params->ifindex = dev->ifindex; | ||
4089 | 4077 | ||
4090 | return dev->ifindex; | 4078 | return 0; |
4091 | } | 4079 | } |
4092 | #endif | 4080 | #endif |
4093 | 4081 | ||
@@ -4111,7 +4099,7 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4111 | /* verify forwarding is enabled on this interface */ | 4099 | /* verify forwarding is enabled on this interface */ |
4112 | in_dev = __in_dev_get_rcu(dev); | 4100 | in_dev = __in_dev_get_rcu(dev); |
4113 | if (unlikely(!in_dev || !IN_DEV_FORWARD(in_dev))) | 4101 | if (unlikely(!in_dev || !IN_DEV_FORWARD(in_dev))) |
4114 | return 0; | 4102 | return BPF_FIB_LKUP_RET_FWD_DISABLED; |
4115 | 4103 | ||
4116 | if (flags & BPF_FIB_LOOKUP_OUTPUT) { | 4104 | if (flags & BPF_FIB_LOOKUP_OUTPUT) { |
4117 | fl4.flowi4_iif = 1; | 4105 | fl4.flowi4_iif = 1; |
@@ -4136,7 +4124,7 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4136 | 4124 | ||
4137 | tb = fib_get_table(net, tbid); | 4125 | tb = fib_get_table(net, tbid); |
4138 | if (unlikely(!tb)) | 4126 | if (unlikely(!tb)) |
4139 | return 0; | 4127 | return BPF_FIB_LKUP_RET_NOT_FWDED; |
4140 | 4128 | ||
4141 | err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF); | 4129 | err = fib_table_lookup(tb, &fl4, &res, FIB_LOOKUP_NOREF); |
4142 | } else { | 4130 | } else { |
@@ -4148,8 +4136,20 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4148 | err = fib_lookup(net, &fl4, &res, FIB_LOOKUP_NOREF); | 4136 | err = fib_lookup(net, &fl4, &res, FIB_LOOKUP_NOREF); |
4149 | } | 4137 | } |
4150 | 4138 | ||
4151 | if (err || res.type != RTN_UNICAST) | 4139 | if (err) { |
4152 | return 0; | 4140 | /* map fib lookup errors to RTN_ type */ |
4141 | if (err == -EINVAL) | ||
4142 | return BPF_FIB_LKUP_RET_BLACKHOLE; | ||
4143 | if (err == -EHOSTUNREACH) | ||
4144 | return BPF_FIB_LKUP_RET_UNREACHABLE; | ||
4145 | if (err == -EACCES) | ||
4146 | return BPF_FIB_LKUP_RET_PROHIBIT; | ||
4147 | |||
4148 | return BPF_FIB_LKUP_RET_NOT_FWDED; | ||
4149 | } | ||
4150 | |||
4151 | if (res.type != RTN_UNICAST) | ||
4152 | return BPF_FIB_LKUP_RET_NOT_FWDED; | ||
4153 | 4153 | ||
4154 | if (res.fi->fib_nhs > 1) | 4154 | if (res.fi->fib_nhs > 1) |
4155 | fib_select_path(net, &res, &fl4, NULL); | 4155 | fib_select_path(net, &res, &fl4, NULL); |
@@ -4157,19 +4157,16 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4157 | if (check_mtu) { | 4157 | if (check_mtu) { |
4158 | mtu = ip_mtu_from_fib_result(&res, params->ipv4_dst); | 4158 | mtu = ip_mtu_from_fib_result(&res, params->ipv4_dst); |
4159 | if (params->tot_len > mtu) | 4159 | if (params->tot_len > mtu) |
4160 | return 0; | 4160 | return BPF_FIB_LKUP_RET_FRAG_NEEDED; |
4161 | } | 4161 | } |
4162 | 4162 | ||
4163 | nh = &res.fi->fib_nh[res.nh_sel]; | 4163 | nh = &res.fi->fib_nh[res.nh_sel]; |
4164 | 4164 | ||
4165 | /* do not handle lwt encaps right now */ | 4165 | /* do not handle lwt encaps right now */ |
4166 | if (nh->nh_lwtstate) | 4166 | if (nh->nh_lwtstate) |
4167 | return 0; | 4167 | return BPF_FIB_LKUP_RET_UNSUPP_LWT; |
4168 | 4168 | ||
4169 | dev = nh->nh_dev; | 4169 | dev = nh->nh_dev; |
4170 | if (unlikely(!dev)) | ||
4171 | return 0; | ||
4172 | |||
4173 | if (nh->nh_gw) | 4170 | if (nh->nh_gw) |
4174 | params->ipv4_dst = nh->nh_gw; | 4171 | params->ipv4_dst = nh->nh_gw; |
4175 | 4172 | ||
@@ -4179,10 +4176,10 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4179 | * rcu_read_lock_bh is not needed here | 4176 | * rcu_read_lock_bh is not needed here |
4180 | */ | 4177 | */ |
4181 | neigh = __ipv4_neigh_lookup_noref(dev, (__force u32)params->ipv4_dst); | 4178 | neigh = __ipv4_neigh_lookup_noref(dev, (__force u32)params->ipv4_dst); |
4182 | if (neigh) | 4179 | if (!neigh) |
4183 | return bpf_fib_set_fwd_params(params, neigh, dev); | 4180 | return BPF_FIB_LKUP_RET_NO_NEIGH; |
4184 | 4181 | ||
4185 | return 0; | 4182 | return bpf_fib_set_fwd_params(params, neigh, dev); |
4186 | } | 4183 | } |
4187 | #endif | 4184 | #endif |
4188 | 4185 | ||
@@ -4203,7 +4200,7 @@ static int bpf_ipv6_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4203 | 4200 | ||
4204 | /* link local addresses are never forwarded */ | 4201 | /* link local addresses are never forwarded */ |
4205 | if (rt6_need_strict(dst) || rt6_need_strict(src)) | 4202 | if (rt6_need_strict(dst) || rt6_need_strict(src)) |
4206 | return 0; | 4203 | return BPF_FIB_LKUP_RET_NOT_FWDED; |
4207 | 4204 | ||
4208 | dev = dev_get_by_index_rcu(net, params->ifindex); | 4205 | dev = dev_get_by_index_rcu(net, params->ifindex); |
4209 | if (unlikely(!dev)) | 4206 | if (unlikely(!dev)) |
@@ -4211,7 +4208,7 @@ static int bpf_ipv6_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4211 | 4208 | ||
4212 | idev = __in6_dev_get_safely(dev); | 4209 | idev = __in6_dev_get_safely(dev); |
4213 | if (unlikely(!idev || !net->ipv6.devconf_all->forwarding)) | 4210 | if (unlikely(!idev || !net->ipv6.devconf_all->forwarding)) |
4214 | return 0; | 4211 | return BPF_FIB_LKUP_RET_FWD_DISABLED; |
4215 | 4212 | ||
4216 | if (flags & BPF_FIB_LOOKUP_OUTPUT) { | 4213 | if (flags & BPF_FIB_LOOKUP_OUTPUT) { |
4217 | fl6.flowi6_iif = 1; | 4214 | fl6.flowi6_iif = 1; |
@@ -4238,7 +4235,7 @@ static int bpf_ipv6_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4238 | 4235 | ||
4239 | tb = ipv6_stub->fib6_get_table(net, tbid); | 4236 | tb = ipv6_stub->fib6_get_table(net, tbid); |
4240 | if (unlikely(!tb)) | 4237 | if (unlikely(!tb)) |
4241 | return 0; | 4238 | return BPF_FIB_LKUP_RET_NOT_FWDED; |
4242 | 4239 | ||
4243 | f6i = ipv6_stub->fib6_table_lookup(net, tb, oif, &fl6, strict); | 4240 | f6i = ipv6_stub->fib6_table_lookup(net, tb, oif, &fl6, strict); |
4244 | } else { | 4241 | } else { |
@@ -4251,11 +4248,23 @@ static int bpf_ipv6_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4251 | } | 4248 | } |
4252 | 4249 | ||
4253 | if (unlikely(IS_ERR_OR_NULL(f6i) || f6i == net->ipv6.fib6_null_entry)) | 4250 | if (unlikely(IS_ERR_OR_NULL(f6i) || f6i == net->ipv6.fib6_null_entry)) |
4254 | return 0; | 4251 | return BPF_FIB_LKUP_RET_NOT_FWDED; |
4252 | |||
4253 | if (unlikely(f6i->fib6_flags & RTF_REJECT)) { | ||
4254 | switch (f6i->fib6_type) { | ||
4255 | case RTN_BLACKHOLE: | ||
4256 | return BPF_FIB_LKUP_RET_BLACKHOLE; | ||
4257 | case RTN_UNREACHABLE: | ||
4258 | return BPF_FIB_LKUP_RET_UNREACHABLE; | ||
4259 | case RTN_PROHIBIT: | ||
4260 | return BPF_FIB_LKUP_RET_PROHIBIT; | ||
4261 | default: | ||
4262 | return BPF_FIB_LKUP_RET_NOT_FWDED; | ||
4263 | } | ||
4264 | } | ||
4255 | 4265 | ||
4256 | if (unlikely(f6i->fib6_flags & RTF_REJECT || | 4266 | if (f6i->fib6_type != RTN_UNICAST) |
4257 | f6i->fib6_type != RTN_UNICAST)) | 4267 | return BPF_FIB_LKUP_RET_NOT_FWDED; |
4258 | return 0; | ||
4259 | 4268 | ||
4260 | if (f6i->fib6_nsiblings && fl6.flowi6_oif == 0) | 4269 | if (f6i->fib6_nsiblings && fl6.flowi6_oif == 0) |
4261 | f6i = ipv6_stub->fib6_multipath_select(net, f6i, &fl6, | 4270 | f6i = ipv6_stub->fib6_multipath_select(net, f6i, &fl6, |
@@ -4265,11 +4274,11 @@ static int bpf_ipv6_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4265 | if (check_mtu) { | 4274 | if (check_mtu) { |
4266 | mtu = ipv6_stub->ip6_mtu_from_fib6(f6i, dst, src); | 4275 | mtu = ipv6_stub->ip6_mtu_from_fib6(f6i, dst, src); |
4267 | if (params->tot_len > mtu) | 4276 | if (params->tot_len > mtu) |
4268 | return 0; | 4277 | return BPF_FIB_LKUP_RET_FRAG_NEEDED; |
4269 | } | 4278 | } |
4270 | 4279 | ||
4271 | if (f6i->fib6_nh.nh_lwtstate) | 4280 | if (f6i->fib6_nh.nh_lwtstate) |
4272 | return 0; | 4281 | return BPF_FIB_LKUP_RET_UNSUPP_LWT; |
4273 | 4282 | ||
4274 | if (f6i->fib6_flags & RTF_GATEWAY) | 4283 | if (f6i->fib6_flags & RTF_GATEWAY) |
4275 | *dst = f6i->fib6_nh.nh_gw; | 4284 | *dst = f6i->fib6_nh.nh_gw; |
@@ -4283,10 +4292,10 @@ static int bpf_ipv6_fib_lookup(struct net *net, struct bpf_fib_lookup *params, | |||
4283 | */ | 4292 | */ |
4284 | neigh = ___neigh_lookup_noref(ipv6_stub->nd_tbl, neigh_key_eq128, | 4293 | neigh = ___neigh_lookup_noref(ipv6_stub->nd_tbl, neigh_key_eq128, |
4285 | ndisc_hashfn, dst, dev); | 4294 | ndisc_hashfn, dst, dev); |
4286 | if (neigh) | 4295 | if (!neigh) |
4287 | return bpf_fib_set_fwd_params(params, neigh, dev); | 4296 | return BPF_FIB_LKUP_RET_NO_NEIGH; |
4288 | 4297 | ||
4289 | return 0; | 4298 | return bpf_fib_set_fwd_params(params, neigh, dev); |
4290 | } | 4299 | } |
4291 | #endif | 4300 | #endif |
4292 | 4301 | ||
@@ -4328,7 +4337,7 @@ BPF_CALL_4(bpf_skb_fib_lookup, struct sk_buff *, skb, | |||
4328 | struct bpf_fib_lookup *, params, int, plen, u32, flags) | 4337 | struct bpf_fib_lookup *, params, int, plen, u32, flags) |
4329 | { | 4338 | { |
4330 | struct net *net = dev_net(skb->dev); | 4339 | struct net *net = dev_net(skb->dev); |
4331 | int index = -EAFNOSUPPORT; | 4340 | int rc = -EAFNOSUPPORT; |
4332 | 4341 | ||
4333 | if (plen < sizeof(*params)) | 4342 | if (plen < sizeof(*params)) |
4334 | return -EINVAL; | 4343 | return -EINVAL; |
@@ -4339,25 +4348,25 @@ BPF_CALL_4(bpf_skb_fib_lookup, struct sk_buff *, skb, | |||
4339 | switch (params->family) { | 4348 | switch (params->family) { |
4340 | #if IS_ENABLED(CONFIG_INET) | 4349 | #if IS_ENABLED(CONFIG_INET) |
4341 | case AF_INET: | 4350 | case AF_INET: |
4342 | index = bpf_ipv4_fib_lookup(net, params, flags, false); | 4351 | rc = bpf_ipv4_fib_lookup(net, params, flags, false); |
4343 | break; | 4352 | break; |
4344 | #endif | 4353 | #endif |
4345 | #if IS_ENABLED(CONFIG_IPV6) | 4354 | #if IS_ENABLED(CONFIG_IPV6) |
4346 | case AF_INET6: | 4355 | case AF_INET6: |
4347 | index = bpf_ipv6_fib_lookup(net, params, flags, false); | 4356 | rc = bpf_ipv6_fib_lookup(net, params, flags, false); |
4348 | break; | 4357 | break; |
4349 | #endif | 4358 | #endif |
4350 | } | 4359 | } |
4351 | 4360 | ||
4352 | if (index > 0) { | 4361 | if (!rc) { |
4353 | struct net_device *dev; | 4362 | struct net_device *dev; |
4354 | 4363 | ||
4355 | dev = dev_get_by_index_rcu(net, index); | 4364 | dev = dev_get_by_index_rcu(net, params->ifindex); |
4356 | if (!is_skb_forwardable(dev, skb)) | 4365 | if (!is_skb_forwardable(dev, skb)) |
4357 | index = 0; | 4366 | rc = BPF_FIB_LKUP_RET_FRAG_NEEDED; |
4358 | } | 4367 | } |
4359 | 4368 | ||
4360 | return index; | 4369 | return rc; |
4361 | } | 4370 | } |
4362 | 4371 | ||
4363 | static const struct bpf_func_proto bpf_skb_fib_lookup_proto = { | 4372 | static const struct bpf_func_proto bpf_skb_fib_lookup_proto = { |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index c642304f178c..eba8dae22c25 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -5276,8 +5276,7 @@ struct sk_buff *alloc_skb_with_frags(unsigned long header_len, | |||
5276 | if (npages >= 1 << order) { | 5276 | if (npages >= 1 << order) { |
5277 | page = alloc_pages((gfp_mask & ~__GFP_DIRECT_RECLAIM) | | 5277 | page = alloc_pages((gfp_mask & ~__GFP_DIRECT_RECLAIM) | |
5278 | __GFP_COMP | | 5278 | __GFP_COMP | |
5279 | __GFP_NOWARN | | 5279 | __GFP_NOWARN, |
5280 | __GFP_NORETRY, | ||
5281 | order); | 5280 | order); |
5282 | if (page) | 5281 | if (page) |
5283 | goto fill_page; | 5282 | goto fill_page; |
diff --git a/net/core/sock.c b/net/core/sock.c index bcc41829a16d..9e8f65585b81 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -3243,7 +3243,8 @@ static int req_prot_init(const struct proto *prot) | |||
3243 | 3243 | ||
3244 | rsk_prot->slab = kmem_cache_create(rsk_prot->slab_name, | 3244 | rsk_prot->slab = kmem_cache_create(rsk_prot->slab_name, |
3245 | rsk_prot->obj_size, 0, | 3245 | rsk_prot->obj_size, 0, |
3246 | prot->slab_flags, NULL); | 3246 | SLAB_ACCOUNT | prot->slab_flags, |
3247 | NULL); | ||
3247 | 3248 | ||
3248 | if (!rsk_prot->slab) { | 3249 | if (!rsk_prot->slab) { |
3249 | pr_crit("%s: Can't create request sock SLAB cache!\n", | 3250 | pr_crit("%s: Can't create request sock SLAB cache!\n", |
@@ -3258,7 +3259,8 @@ int proto_register(struct proto *prot, int alloc_slab) | |||
3258 | if (alloc_slab) { | 3259 | if (alloc_slab) { |
3259 | prot->slab = kmem_cache_create_usercopy(prot->name, | 3260 | prot->slab = kmem_cache_create_usercopy(prot->name, |
3260 | prot->obj_size, 0, | 3261 | prot->obj_size, 0, |
3261 | SLAB_HWCACHE_ALIGN | prot->slab_flags, | 3262 | SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT | |
3263 | prot->slab_flags, | ||
3262 | prot->useroffset, prot->usersize, | 3264 | prot->useroffset, prot->usersize, |
3263 | NULL); | 3265 | NULL); |
3264 | 3266 | ||
@@ -3281,6 +3283,7 @@ int proto_register(struct proto *prot, int alloc_slab) | |||
3281 | kmem_cache_create(prot->twsk_prot->twsk_slab_name, | 3283 | kmem_cache_create(prot->twsk_prot->twsk_slab_name, |
3282 | prot->twsk_prot->twsk_obj_size, | 3284 | prot->twsk_prot->twsk_obj_size, |
3283 | 0, | 3285 | 0, |
3286 | SLAB_ACCOUNT | | ||
3284 | prot->slab_flags, | 3287 | prot->slab_flags, |
3285 | NULL); | 3288 | NULL); |
3286 | if (prot->twsk_prot->twsk_slab == NULL) | 3289 | if (prot->twsk_prot->twsk_slab == NULL) |
diff --git a/net/dccp/ccids/ccid3.c b/net/dccp/ccids/ccid3.c index 8b5ba6dffac7..12877a1514e7 100644 --- a/net/dccp/ccids/ccid3.c +++ b/net/dccp/ccids/ccid3.c | |||
@@ -600,7 +600,7 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk, | |||
600 | { | 600 | { |
601 | struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); | 601 | struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); |
602 | struct dccp_sock *dp = dccp_sk(sk); | 602 | struct dccp_sock *dp = dccp_sk(sk); |
603 | ktime_t now = ktime_get_real(); | 603 | ktime_t now = ktime_get(); |
604 | s64 delta = 0; | 604 | s64 delta = 0; |
605 | 605 | ||
606 | switch (fbtype) { | 606 | switch (fbtype) { |
@@ -625,15 +625,14 @@ static void ccid3_hc_rx_send_feedback(struct sock *sk, | |||
625 | case CCID3_FBACK_PERIODIC: | 625 | case CCID3_FBACK_PERIODIC: |
626 | delta = ktime_us_delta(now, hc->rx_tstamp_last_feedback); | 626 | delta = ktime_us_delta(now, hc->rx_tstamp_last_feedback); |
627 | if (delta <= 0) | 627 | if (delta <= 0) |
628 | DCCP_BUG("delta (%ld) <= 0", (long)delta); | 628 | delta = 1; |
629 | else | 629 | hc->rx_x_recv = scaled_div32(hc->rx_bytes_recv, delta); |
630 | hc->rx_x_recv = scaled_div32(hc->rx_bytes_recv, delta); | ||
631 | break; | 630 | break; |
632 | default: | 631 | default: |
633 | return; | 632 | return; |
634 | } | 633 | } |
635 | 634 | ||
636 | ccid3_pr_debug("Interval %ldusec, X_recv=%u, 1/p=%u\n", (long)delta, | 635 | ccid3_pr_debug("Interval %lldusec, X_recv=%u, 1/p=%u\n", delta, |
637 | hc->rx_x_recv, hc->rx_pinv); | 636 | hc->rx_x_recv, hc->rx_pinv); |
638 | 637 | ||
639 | hc->rx_tstamp_last_feedback = now; | 638 | hc->rx_tstamp_last_feedback = now; |
@@ -680,7 +679,8 @@ static int ccid3_hc_rx_insert_options(struct sock *sk, struct sk_buff *skb) | |||
680 | static u32 ccid3_first_li(struct sock *sk) | 679 | static u32 ccid3_first_li(struct sock *sk) |
681 | { | 680 | { |
682 | struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); | 681 | struct ccid3_hc_rx_sock *hc = ccid3_hc_rx_sk(sk); |
683 | u32 x_recv, p, delta; | 682 | u32 x_recv, p; |
683 | s64 delta; | ||
684 | u64 fval; | 684 | u64 fval; |
685 | 685 | ||
686 | if (hc->rx_rtt == 0) { | 686 | if (hc->rx_rtt == 0) { |
@@ -688,7 +688,9 @@ static u32 ccid3_first_li(struct sock *sk) | |||
688 | hc->rx_rtt = DCCP_FALLBACK_RTT; | 688 | hc->rx_rtt = DCCP_FALLBACK_RTT; |
689 | } | 689 | } |
690 | 690 | ||
691 | delta = ktime_to_us(net_timedelta(hc->rx_tstamp_last_feedback)); | 691 | delta = ktime_us_delta(ktime_get(), hc->rx_tstamp_last_feedback); |
692 | if (delta <= 0) | ||
693 | delta = 1; | ||
692 | x_recv = scaled_div32(hc->rx_bytes_recv, delta); | 694 | x_recv = scaled_div32(hc->rx_bytes_recv, delta); |
693 | if (x_recv == 0) { /* would also trigger divide-by-zero */ | 695 | if (x_recv == 0) { /* would also trigger divide-by-zero */ |
694 | DCCP_WARN("X_recv==0\n"); | 696 | DCCP_WARN("X_recv==0\n"); |
diff --git a/net/dccp/dccp.h b/net/dccp/dccp.h index 0ea2ee56ac1b..f91e3816806b 100644 --- a/net/dccp/dccp.h +++ b/net/dccp/dccp.h | |||
@@ -316,7 +316,8 @@ int dccp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock, | |||
316 | int flags, int *addr_len); | 316 | int flags, int *addr_len); |
317 | void dccp_shutdown(struct sock *sk, int how); | 317 | void dccp_shutdown(struct sock *sk, int how); |
318 | int inet_dccp_listen(struct socket *sock, int backlog); | 318 | int inet_dccp_listen(struct socket *sock, int backlog); |
319 | __poll_t dccp_poll_mask(struct socket *sock, __poll_t events); | 319 | __poll_t dccp_poll(struct file *file, struct socket *sock, |
320 | poll_table *wait); | ||
320 | int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); | 321 | int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len); |
321 | void dccp_req_err(struct sock *sk, u64 seq); | 322 | void dccp_req_err(struct sock *sk, u64 seq); |
322 | 323 | ||
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c index a9e478cd3787..b08feb219b44 100644 --- a/net/dccp/ipv4.c +++ b/net/dccp/ipv4.c | |||
@@ -984,7 +984,7 @@ static const struct proto_ops inet_dccp_ops = { | |||
984 | .accept = inet_accept, | 984 | .accept = inet_accept, |
985 | .getname = inet_getname, | 985 | .getname = inet_getname, |
986 | /* FIXME: work on tcp_poll to rename it to inet_csk_poll */ | 986 | /* FIXME: work on tcp_poll to rename it to inet_csk_poll */ |
987 | .poll_mask = dccp_poll_mask, | 987 | .poll = dccp_poll, |
988 | .ioctl = inet_ioctl, | 988 | .ioctl = inet_ioctl, |
989 | /* FIXME: work on inet_listen to rename it to sock_common_listen */ | 989 | /* FIXME: work on inet_listen to rename it to sock_common_listen */ |
990 | .listen = inet_dccp_listen, | 990 | .listen = inet_dccp_listen, |
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 17fc4e0166ba..6344f1b18a6a 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c | |||
@@ -1070,7 +1070,7 @@ static const struct proto_ops inet6_dccp_ops = { | |||
1070 | .socketpair = sock_no_socketpair, | 1070 | .socketpair = sock_no_socketpair, |
1071 | .accept = inet_accept, | 1071 | .accept = inet_accept, |
1072 | .getname = inet6_getname, | 1072 | .getname = inet6_getname, |
1073 | .poll_mask = dccp_poll_mask, | 1073 | .poll = dccp_poll, |
1074 | .ioctl = inet6_ioctl, | 1074 | .ioctl = inet6_ioctl, |
1075 | .listen = inet_dccp_listen, | 1075 | .listen = inet_dccp_listen, |
1076 | .shutdown = inet_shutdown, | 1076 | .shutdown = inet_shutdown, |
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index ca21c1c76da0..0d56e36a6db7 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -312,11 +312,20 @@ int dccp_disconnect(struct sock *sk, int flags) | |||
312 | 312 | ||
313 | EXPORT_SYMBOL_GPL(dccp_disconnect); | 313 | EXPORT_SYMBOL_GPL(dccp_disconnect); |
314 | 314 | ||
315 | __poll_t dccp_poll_mask(struct socket *sock, __poll_t events) | 315 | /* |
316 | * Wait for a DCCP event. | ||
317 | * | ||
318 | * Note that we don't need to lock the socket, as the upper poll layers | ||
319 | * take care of normal races (between the test and the event) and we don't | ||
320 | * go look at any of the socket buffers directly. | ||
321 | */ | ||
322 | __poll_t dccp_poll(struct file *file, struct socket *sock, | ||
323 | poll_table *wait) | ||
316 | { | 324 | { |
317 | __poll_t mask; | 325 | __poll_t mask; |
318 | struct sock *sk = sock->sk; | 326 | struct sock *sk = sock->sk; |
319 | 327 | ||
328 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
320 | if (sk->sk_state == DCCP_LISTEN) | 329 | if (sk->sk_state == DCCP_LISTEN) |
321 | return inet_csk_listen_poll(sk); | 330 | return inet_csk_listen_poll(sk); |
322 | 331 | ||
@@ -358,7 +367,7 @@ __poll_t dccp_poll_mask(struct socket *sock, __poll_t events) | |||
358 | return mask; | 367 | return mask; |
359 | } | 368 | } |
360 | 369 | ||
361 | EXPORT_SYMBOL_GPL(dccp_poll_mask); | 370 | EXPORT_SYMBOL_GPL(dccp_poll); |
362 | 371 | ||
363 | int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg) | 372 | int dccp_ioctl(struct sock *sk, int cmd, unsigned long arg) |
364 | { | 373 | { |
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 9a686d890bfa..7d6ff983ba2c 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
@@ -1207,11 +1207,11 @@ static int dn_getname(struct socket *sock, struct sockaddr *uaddr,int peer) | |||
1207 | } | 1207 | } |
1208 | 1208 | ||
1209 | 1209 | ||
1210 | static __poll_t dn_poll_mask(struct socket *sock, __poll_t events) | 1210 | static __poll_t dn_poll(struct file *file, struct socket *sock, poll_table *wait) |
1211 | { | 1211 | { |
1212 | struct sock *sk = sock->sk; | 1212 | struct sock *sk = sock->sk; |
1213 | struct dn_scp *scp = DN_SK(sk); | 1213 | struct dn_scp *scp = DN_SK(sk); |
1214 | __poll_t mask = datagram_poll_mask(sock, events); | 1214 | __poll_t mask = datagram_poll(file, sock, wait); |
1215 | 1215 | ||
1216 | if (!skb_queue_empty(&scp->other_receive_queue)) | 1216 | if (!skb_queue_empty(&scp->other_receive_queue)) |
1217 | mask |= EPOLLRDBAND; | 1217 | mask |= EPOLLRDBAND; |
@@ -2331,7 +2331,7 @@ static const struct proto_ops dn_proto_ops = { | |||
2331 | .socketpair = sock_no_socketpair, | 2331 | .socketpair = sock_no_socketpair, |
2332 | .accept = dn_accept, | 2332 | .accept = dn_accept, |
2333 | .getname = dn_getname, | 2333 | .getname = dn_getname, |
2334 | .poll_mask = dn_poll_mask, | 2334 | .poll = dn_poll, |
2335 | .ioctl = dn_ioctl, | 2335 | .ioctl = dn_ioctl, |
2336 | .listen = dn_listen, | 2336 | .listen = dn_listen, |
2337 | .shutdown = dn_shutdown, | 2337 | .shutdown = dn_shutdown, |
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c index a0768d2759b8..a60658c85a9a 100644 --- a/net/ieee802154/socket.c +++ b/net/ieee802154/socket.c | |||
@@ -423,7 +423,7 @@ static const struct proto_ops ieee802154_raw_ops = { | |||
423 | .socketpair = sock_no_socketpair, | 423 | .socketpair = sock_no_socketpair, |
424 | .accept = sock_no_accept, | 424 | .accept = sock_no_accept, |
425 | .getname = sock_no_getname, | 425 | .getname = sock_no_getname, |
426 | .poll_mask = datagram_poll_mask, | 426 | .poll = datagram_poll, |
427 | .ioctl = ieee802154_sock_ioctl, | 427 | .ioctl = ieee802154_sock_ioctl, |
428 | .listen = sock_no_listen, | 428 | .listen = sock_no_listen, |
429 | .shutdown = sock_no_shutdown, | 429 | .shutdown = sock_no_shutdown, |
@@ -969,7 +969,7 @@ static const struct proto_ops ieee802154_dgram_ops = { | |||
969 | .socketpair = sock_no_socketpair, | 969 | .socketpair = sock_no_socketpair, |
970 | .accept = sock_no_accept, | 970 | .accept = sock_no_accept, |
971 | .getname = sock_no_getname, | 971 | .getname = sock_no_getname, |
972 | .poll_mask = datagram_poll_mask, | 972 | .poll = datagram_poll, |
973 | .ioctl = ieee802154_sock_ioctl, | 973 | .ioctl = ieee802154_sock_ioctl, |
974 | .listen = sock_no_listen, | 974 | .listen = sock_no_listen, |
975 | .shutdown = sock_no_shutdown, | 975 | .shutdown = sock_no_shutdown, |
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 15e125558c76..b403499fdabe 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -986,7 +986,7 @@ const struct proto_ops inet_stream_ops = { | |||
986 | .socketpair = sock_no_socketpair, | 986 | .socketpair = sock_no_socketpair, |
987 | .accept = inet_accept, | 987 | .accept = inet_accept, |
988 | .getname = inet_getname, | 988 | .getname = inet_getname, |
989 | .poll_mask = tcp_poll_mask, | 989 | .poll = tcp_poll, |
990 | .ioctl = inet_ioctl, | 990 | .ioctl = inet_ioctl, |
991 | .listen = inet_listen, | 991 | .listen = inet_listen, |
992 | .shutdown = inet_shutdown, | 992 | .shutdown = inet_shutdown, |
@@ -1021,7 +1021,7 @@ const struct proto_ops inet_dgram_ops = { | |||
1021 | .socketpair = sock_no_socketpair, | 1021 | .socketpair = sock_no_socketpair, |
1022 | .accept = sock_no_accept, | 1022 | .accept = sock_no_accept, |
1023 | .getname = inet_getname, | 1023 | .getname = inet_getname, |
1024 | .poll_mask = udp_poll_mask, | 1024 | .poll = udp_poll, |
1025 | .ioctl = inet_ioctl, | 1025 | .ioctl = inet_ioctl, |
1026 | .listen = sock_no_listen, | 1026 | .listen = sock_no_listen, |
1027 | .shutdown = inet_shutdown, | 1027 | .shutdown = inet_shutdown, |
@@ -1042,7 +1042,7 @@ EXPORT_SYMBOL(inet_dgram_ops); | |||
1042 | 1042 | ||
1043 | /* | 1043 | /* |
1044 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without | 1044 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without |
1045 | * udp_poll_mask | 1045 | * udp_poll |
1046 | */ | 1046 | */ |
1047 | static const struct proto_ops inet_sockraw_ops = { | 1047 | static const struct proto_ops inet_sockraw_ops = { |
1048 | .family = PF_INET, | 1048 | .family = PF_INET, |
@@ -1053,7 +1053,7 @@ static const struct proto_ops inet_sockraw_ops = { | |||
1053 | .socketpair = sock_no_socketpair, | 1053 | .socketpair = sock_no_socketpair, |
1054 | .accept = sock_no_accept, | 1054 | .accept = sock_no_accept, |
1055 | .getname = inet_getname, | 1055 | .getname = inet_getname, |
1056 | .poll_mask = datagram_poll_mask, | 1056 | .poll = datagram_poll, |
1057 | .ioctl = inet_ioctl, | 1057 | .ioctl = inet_ioctl, |
1058 | .listen = sock_no_listen, | 1058 | .listen = sock_no_listen, |
1059 | .shutdown = inet_shutdown, | 1059 | .shutdown = inet_shutdown, |
diff --git a/net/ipv4/fou.c b/net/ipv4/fou.c index 1540db65241a..c9ec1603666b 100644 --- a/net/ipv4/fou.c +++ b/net/ipv4/fou.c | |||
@@ -448,9 +448,7 @@ next_proto: | |||
448 | out_unlock: | 448 | out_unlock: |
449 | rcu_read_unlock(); | 449 | rcu_read_unlock(); |
450 | out: | 450 | out: |
451 | NAPI_GRO_CB(skb)->flush |= flush; | 451 | skb_gro_flush_final_remcsum(skb, pp, flush, &grc); |
452 | skb_gro_remcsum_cleanup(skb, &grc); | ||
453 | skb->remcsum_offload = 0; | ||
454 | 452 | ||
455 | return pp; | 453 | return pp; |
456 | } | 454 | } |
diff --git a/net/ipv4/gre_offload.c b/net/ipv4/gre_offload.c index 1859c473b21a..6a7d980105f6 100644 --- a/net/ipv4/gre_offload.c +++ b/net/ipv4/gre_offload.c | |||
@@ -223,7 +223,7 @@ static struct sk_buff **gre_gro_receive(struct sk_buff **head, | |||
223 | out_unlock: | 223 | out_unlock: |
224 | rcu_read_unlock(); | 224 | rcu_read_unlock(); |
225 | out: | 225 | out: |
226 | NAPI_GRO_CB(skb)->flush |= flush; | 226 | skb_gro_flush_final(skb, pp, flush); |
227 | 227 | ||
228 | return pp; | 228 | return pp; |
229 | } | 229 | } |
diff --git a/net/ipv4/inet_hashtables.c b/net/ipv4/inet_hashtables.c index 31ff46daae97..3647167c8fa3 100644 --- a/net/ipv4/inet_hashtables.c +++ b/net/ipv4/inet_hashtables.c | |||
@@ -243,9 +243,9 @@ static inline int compute_score(struct sock *sk, struct net *net, | |||
243 | bool dev_match = (sk->sk_bound_dev_if == dif || | 243 | bool dev_match = (sk->sk_bound_dev_if == dif || |
244 | sk->sk_bound_dev_if == sdif); | 244 | sk->sk_bound_dev_if == sdif); |
245 | 245 | ||
246 | if (exact_dif && !dev_match) | 246 | if (!dev_match) |
247 | return -1; | 247 | return -1; |
248 | if (sk->sk_bound_dev_if && dev_match) | 248 | if (sk->sk_bound_dev_if) |
249 | score += 4; | 249 | score += 4; |
250 | } | 250 | } |
251 | if (sk->sk_incoming_cpu == raw_smp_processor_id()) | 251 | if (sk->sk_incoming_cpu == raw_smp_processor_id()) |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index af5a830ff6ad..b3308e9d9762 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -1145,7 +1145,8 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork, | |||
1145 | cork->fragsize = ip_sk_use_pmtu(sk) ? | 1145 | cork->fragsize = ip_sk_use_pmtu(sk) ? |
1146 | dst_mtu(&rt->dst) : rt->dst.dev->mtu; | 1146 | dst_mtu(&rt->dst) : rt->dst.dev->mtu; |
1147 | 1147 | ||
1148 | cork->gso_size = sk->sk_type == SOCK_DGRAM ? ipc->gso_size : 0; | 1148 | cork->gso_size = sk->sk_type == SOCK_DGRAM && |
1149 | sk->sk_protocol == IPPROTO_UDP ? ipc->gso_size : 0; | ||
1149 | cork->dst = &rt->dst; | 1150 | cork->dst = &rt->dst; |
1150 | cork->length = 0; | 1151 | cork->length = 0; |
1151 | cork->ttl = ipc->ttl; | 1152 | cork->ttl = ipc->ttl; |
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index d06247ba08b2..af0a857d8352 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
@@ -265,8 +265,9 @@ static int proc_tcp_fastopen_key(struct ctl_table *table, int write, | |||
265 | ipv4.sysctl_tcp_fastopen); | 265 | ipv4.sysctl_tcp_fastopen); |
266 | struct ctl_table tbl = { .maxlen = (TCP_FASTOPEN_KEY_LENGTH * 2 + 10) }; | 266 | struct ctl_table tbl = { .maxlen = (TCP_FASTOPEN_KEY_LENGTH * 2 + 10) }; |
267 | struct tcp_fastopen_context *ctxt; | 267 | struct tcp_fastopen_context *ctxt; |
268 | int ret; | ||
269 | u32 user_key[4]; /* 16 bytes, matching TCP_FASTOPEN_KEY_LENGTH */ | 268 | u32 user_key[4]; /* 16 bytes, matching TCP_FASTOPEN_KEY_LENGTH */ |
269 | __le32 key[4]; | ||
270 | int ret, i; | ||
270 | 271 | ||
271 | tbl.data = kmalloc(tbl.maxlen, GFP_KERNEL); | 272 | tbl.data = kmalloc(tbl.maxlen, GFP_KERNEL); |
272 | if (!tbl.data) | 273 | if (!tbl.data) |
@@ -275,11 +276,14 @@ static int proc_tcp_fastopen_key(struct ctl_table *table, int write, | |||
275 | rcu_read_lock(); | 276 | rcu_read_lock(); |
276 | ctxt = rcu_dereference(net->ipv4.tcp_fastopen_ctx); | 277 | ctxt = rcu_dereference(net->ipv4.tcp_fastopen_ctx); |
277 | if (ctxt) | 278 | if (ctxt) |
278 | memcpy(user_key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH); | 279 | memcpy(key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH); |
279 | else | 280 | else |
280 | memset(user_key, 0, sizeof(user_key)); | 281 | memset(key, 0, sizeof(key)); |
281 | rcu_read_unlock(); | 282 | rcu_read_unlock(); |
282 | 283 | ||
284 | for (i = 0; i < ARRAY_SIZE(key); i++) | ||
285 | user_key[i] = le32_to_cpu(key[i]); | ||
286 | |||
283 | snprintf(tbl.data, tbl.maxlen, "%08x-%08x-%08x-%08x", | 287 | snprintf(tbl.data, tbl.maxlen, "%08x-%08x-%08x-%08x", |
284 | user_key[0], user_key[1], user_key[2], user_key[3]); | 288 | user_key[0], user_key[1], user_key[2], user_key[3]); |
285 | ret = proc_dostring(&tbl, write, buffer, lenp, ppos); | 289 | ret = proc_dostring(&tbl, write, buffer, lenp, ppos); |
@@ -290,13 +294,17 @@ static int proc_tcp_fastopen_key(struct ctl_table *table, int write, | |||
290 | ret = -EINVAL; | 294 | ret = -EINVAL; |
291 | goto bad_key; | 295 | goto bad_key; |
292 | } | 296 | } |
293 | tcp_fastopen_reset_cipher(net, NULL, user_key, | 297 | |
298 | for (i = 0; i < ARRAY_SIZE(user_key); i++) | ||
299 | key[i] = cpu_to_le32(user_key[i]); | ||
300 | |||
301 | tcp_fastopen_reset_cipher(net, NULL, key, | ||
294 | TCP_FASTOPEN_KEY_LENGTH); | 302 | TCP_FASTOPEN_KEY_LENGTH); |
295 | } | 303 | } |
296 | 304 | ||
297 | bad_key: | 305 | bad_key: |
298 | pr_debug("proc FO key set 0x%x-%x-%x-%x <- 0x%s: %u\n", | 306 | pr_debug("proc FO key set 0x%x-%x-%x-%x <- 0x%s: %u\n", |
299 | user_key[0], user_key[1], user_key[2], user_key[3], | 307 | user_key[0], user_key[1], user_key[2], user_key[3], |
300 | (char *)tbl.data, ret); | 308 | (char *)tbl.data, ret); |
301 | kfree(tbl.data); | 309 | kfree(tbl.data); |
302 | return ret; | 310 | return ret; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 141acd92e58a..e7b53d2a971f 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -494,21 +494,32 @@ static inline bool tcp_stream_is_readable(const struct tcp_sock *tp, | |||
494 | } | 494 | } |
495 | 495 | ||
496 | /* | 496 | /* |
497 | * Socket is not locked. We are protected from async events by poll logic and | 497 | * Wait for a TCP event. |
498 | * correct handling of state changes made by other threads is impossible in | 498 | * |
499 | * any case. | 499 | * Note that we don't need to lock the socket, as the upper poll layers |
500 | * take care of normal races (between the test and the event) and we don't | ||
501 | * go look at any of the socket buffers directly. | ||
500 | */ | 502 | */ |
501 | __poll_t tcp_poll_mask(struct socket *sock, __poll_t events) | 503 | __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait) |
502 | { | 504 | { |
505 | __poll_t mask; | ||
503 | struct sock *sk = sock->sk; | 506 | struct sock *sk = sock->sk; |
504 | const struct tcp_sock *tp = tcp_sk(sk); | 507 | const struct tcp_sock *tp = tcp_sk(sk); |
505 | __poll_t mask = 0; | ||
506 | int state; | 508 | int state; |
507 | 509 | ||
510 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
511 | |||
508 | state = inet_sk_state_load(sk); | 512 | state = inet_sk_state_load(sk); |
509 | if (state == TCP_LISTEN) | 513 | if (state == TCP_LISTEN) |
510 | return inet_csk_listen_poll(sk); | 514 | return inet_csk_listen_poll(sk); |
511 | 515 | ||
516 | /* Socket is not locked. We are protected from async events | ||
517 | * by poll logic and correct handling of state changes | ||
518 | * made by other threads is impossible in any case. | ||
519 | */ | ||
520 | |||
521 | mask = 0; | ||
522 | |||
512 | /* | 523 | /* |
513 | * EPOLLHUP is certainly not done right. But poll() doesn't | 524 | * EPOLLHUP is certainly not done right. But poll() doesn't |
514 | * have a notion of HUP in just one direction, and for a | 525 | * have a notion of HUP in just one direction, and for a |
@@ -589,7 +600,7 @@ __poll_t tcp_poll_mask(struct socket *sock, __poll_t events) | |||
589 | 600 | ||
590 | return mask; | 601 | return mask; |
591 | } | 602 | } |
592 | EXPORT_SYMBOL(tcp_poll_mask); | 603 | EXPORT_SYMBOL(tcp_poll); |
593 | 604 | ||
594 | int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) | 605 | int tcp_ioctl(struct sock *sk, int cmd, unsigned long arg) |
595 | { | 606 | { |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 355d3dffd021..8e5522c6833a 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -265,7 +265,7 @@ static void __tcp_ecn_check_ce(struct sock *sk, const struct sk_buff *skb) | |||
265 | * it is probably a retransmit. | 265 | * it is probably a retransmit. |
266 | */ | 266 | */ |
267 | if (tp->ecn_flags & TCP_ECN_SEEN) | 267 | if (tp->ecn_flags & TCP_ECN_SEEN) |
268 | tcp_enter_quickack_mode(sk, 1); | 268 | tcp_enter_quickack_mode(sk, 2); |
269 | break; | 269 | break; |
270 | case INET_ECN_CE: | 270 | case INET_ECN_CE: |
271 | if (tcp_ca_needs_ecn(sk)) | 271 | if (tcp_ca_needs_ecn(sk)) |
@@ -273,7 +273,7 @@ static void __tcp_ecn_check_ce(struct sock *sk, const struct sk_buff *skb) | |||
273 | 273 | ||
274 | if (!(tp->ecn_flags & TCP_ECN_DEMAND_CWR)) { | 274 | if (!(tp->ecn_flags & TCP_ECN_DEMAND_CWR)) { |
275 | /* Better not delay acks, sender can have a very low cwnd */ | 275 | /* Better not delay acks, sender can have a very low cwnd */ |
276 | tcp_enter_quickack_mode(sk, 1); | 276 | tcp_enter_quickack_mode(sk, 2); |
277 | tp->ecn_flags |= TCP_ECN_DEMAND_CWR; | 277 | tp->ecn_flags |= TCP_ECN_DEMAND_CWR; |
278 | } | 278 | } |
279 | tp->ecn_flags |= TCP_ECN_SEEN; | 279 | tp->ecn_flags |= TCP_ECN_SEEN; |
@@ -3181,6 +3181,15 @@ static int tcp_clean_rtx_queue(struct sock *sk, u32 prior_fack, | |||
3181 | 3181 | ||
3182 | if (tcp_is_reno(tp)) { | 3182 | if (tcp_is_reno(tp)) { |
3183 | tcp_remove_reno_sacks(sk, pkts_acked); | 3183 | tcp_remove_reno_sacks(sk, pkts_acked); |
3184 | |||
3185 | /* If any of the cumulatively ACKed segments was | ||
3186 | * retransmitted, non-SACK case cannot confirm that | ||
3187 | * progress was due to original transmission due to | ||
3188 | * lack of TCPCB_SACKED_ACKED bits even if some of | ||
3189 | * the packets may have been never retransmitted. | ||
3190 | */ | ||
3191 | if (flag & FLAG_RETRANS_DATA_ACKED) | ||
3192 | flag &= ~FLAG_ORIG_SACK_ACKED; | ||
3184 | } else { | 3193 | } else { |
3185 | int delta; | 3194 | int delta; |
3186 | 3195 | ||
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 9bb27df4dac5..24e116ddae79 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -2591,7 +2591,7 @@ int compat_udp_getsockopt(struct sock *sk, int level, int optname, | |||
2591 | * udp_poll - wait for a UDP event. | 2591 | * udp_poll - wait for a UDP event. |
2592 | * @file - file struct | 2592 | * @file - file struct |
2593 | * @sock - socket | 2593 | * @sock - socket |
2594 | * @events - events to wait for | 2594 | * @wait - poll table |
2595 | * | 2595 | * |
2596 | * This is same as datagram poll, except for the special case of | 2596 | * This is same as datagram poll, except for the special case of |
2597 | * blocking sockets. If application is using a blocking fd | 2597 | * blocking sockets. If application is using a blocking fd |
@@ -2600,23 +2600,23 @@ int compat_udp_getsockopt(struct sock *sk, int level, int optname, | |||
2600 | * but then block when reading it. Add special case code | 2600 | * but then block when reading it. Add special case code |
2601 | * to work around these arguably broken applications. | 2601 | * to work around these arguably broken applications. |
2602 | */ | 2602 | */ |
2603 | __poll_t udp_poll_mask(struct socket *sock, __poll_t events) | 2603 | __poll_t udp_poll(struct file *file, struct socket *sock, poll_table *wait) |
2604 | { | 2604 | { |
2605 | __poll_t mask = datagram_poll_mask(sock, events); | 2605 | __poll_t mask = datagram_poll(file, sock, wait); |
2606 | struct sock *sk = sock->sk; | 2606 | struct sock *sk = sock->sk; |
2607 | 2607 | ||
2608 | if (!skb_queue_empty(&udp_sk(sk)->reader_queue)) | 2608 | if (!skb_queue_empty(&udp_sk(sk)->reader_queue)) |
2609 | mask |= EPOLLIN | EPOLLRDNORM; | 2609 | mask |= EPOLLIN | EPOLLRDNORM; |
2610 | 2610 | ||
2611 | /* Check for false positives due to checksum errors */ | 2611 | /* Check for false positives due to checksum errors */ |
2612 | if ((mask & EPOLLRDNORM) && !(sock->file->f_flags & O_NONBLOCK) && | 2612 | if ((mask & EPOLLRDNORM) && !(file->f_flags & O_NONBLOCK) && |
2613 | !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1) | 2613 | !(sk->sk_shutdown & RCV_SHUTDOWN) && first_packet_length(sk) == -1) |
2614 | mask &= ~(EPOLLIN | EPOLLRDNORM); | 2614 | mask &= ~(EPOLLIN | EPOLLRDNORM); |
2615 | 2615 | ||
2616 | return mask; | 2616 | return mask; |
2617 | 2617 | ||
2618 | } | 2618 | } |
2619 | EXPORT_SYMBOL(udp_poll_mask); | 2619 | EXPORT_SYMBOL(udp_poll); |
2620 | 2620 | ||
2621 | int udp_abort(struct sock *sk, int err) | 2621 | int udp_abort(struct sock *sk, int err) |
2622 | { | 2622 | { |
diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c index 92dc9e5a7ff3..69c54540d5b4 100644 --- a/net/ipv4/udp_offload.c +++ b/net/ipv4/udp_offload.c | |||
@@ -394,7 +394,7 @@ unflush: | |||
394 | out_unlock: | 394 | out_unlock: |
395 | rcu_read_unlock(); | 395 | rcu_read_unlock(); |
396 | out: | 396 | out: |
397 | NAPI_GRO_CB(skb)->flush |= flush; | 397 | skb_gro_flush_final(skb, pp, flush); |
398 | return pp; | 398 | return pp; |
399 | } | 399 | } |
400 | EXPORT_SYMBOL(udp_gro_receive); | 400 | EXPORT_SYMBOL(udp_gro_receive); |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index c134286d6a41..91580c62bb86 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -4528,6 +4528,7 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp, | |||
4528 | unsigned long expires, u32 flags) | 4528 | unsigned long expires, u32 flags) |
4529 | { | 4529 | { |
4530 | struct fib6_info *f6i; | 4530 | struct fib6_info *f6i; |
4531 | u32 prio; | ||
4531 | 4532 | ||
4532 | f6i = addrconf_get_prefix_route(&ifp->addr, | 4533 | f6i = addrconf_get_prefix_route(&ifp->addr, |
4533 | ifp->prefix_len, | 4534 | ifp->prefix_len, |
@@ -4536,13 +4537,15 @@ static int modify_prefix_route(struct inet6_ifaddr *ifp, | |||
4536 | if (!f6i) | 4537 | if (!f6i) |
4537 | return -ENOENT; | 4538 | return -ENOENT; |
4538 | 4539 | ||
4539 | if (f6i->fib6_metric != ifp->rt_priority) { | 4540 | prio = ifp->rt_priority ? : IP6_RT_PRIO_ADDRCONF; |
4541 | if (f6i->fib6_metric != prio) { | ||
4542 | /* delete old one */ | ||
4543 | ip6_del_rt(dev_net(ifp->idev->dev), f6i); | ||
4544 | |||
4540 | /* add new one */ | 4545 | /* add new one */ |
4541 | addrconf_prefix_route(&ifp->addr, ifp->prefix_len, | 4546 | addrconf_prefix_route(&ifp->addr, ifp->prefix_len, |
4542 | ifp->rt_priority, ifp->idev->dev, | 4547 | ifp->rt_priority, ifp->idev->dev, |
4543 | expires, flags, GFP_KERNEL); | 4548 | expires, flags, GFP_KERNEL); |
4544 | /* delete old one */ | ||
4545 | ip6_del_rt(dev_net(ifp->idev->dev), f6i); | ||
4546 | } else { | 4549 | } else { |
4547 | if (!expires) | 4550 | if (!expires) |
4548 | fib6_clean_expires(f6i); | 4551 | fib6_clean_expires(f6i); |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 74f2a261e8df..9ed0eae91758 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -570,7 +570,7 @@ const struct proto_ops inet6_stream_ops = { | |||
570 | .socketpair = sock_no_socketpair, /* a do nothing */ | 570 | .socketpair = sock_no_socketpair, /* a do nothing */ |
571 | .accept = inet_accept, /* ok */ | 571 | .accept = inet_accept, /* ok */ |
572 | .getname = inet6_getname, | 572 | .getname = inet6_getname, |
573 | .poll_mask = tcp_poll_mask, /* ok */ | 573 | .poll = tcp_poll, /* ok */ |
574 | .ioctl = inet6_ioctl, /* must change */ | 574 | .ioctl = inet6_ioctl, /* must change */ |
575 | .listen = inet_listen, /* ok */ | 575 | .listen = inet_listen, /* ok */ |
576 | .shutdown = inet_shutdown, /* ok */ | 576 | .shutdown = inet_shutdown, /* ok */ |
@@ -603,7 +603,7 @@ const struct proto_ops inet6_dgram_ops = { | |||
603 | .socketpair = sock_no_socketpair, /* a do nothing */ | 603 | .socketpair = sock_no_socketpair, /* a do nothing */ |
604 | .accept = sock_no_accept, /* a do nothing */ | 604 | .accept = sock_no_accept, /* a do nothing */ |
605 | .getname = inet6_getname, | 605 | .getname = inet6_getname, |
606 | .poll_mask = udp_poll_mask, /* ok */ | 606 | .poll = udp_poll, /* ok */ |
607 | .ioctl = inet6_ioctl, /* must change */ | 607 | .ioctl = inet6_ioctl, /* must change */ |
608 | .listen = sock_no_listen, /* ok */ | 608 | .listen = sock_no_listen, /* ok */ |
609 | .shutdown = inet_shutdown, /* ok */ | 609 | .shutdown = inet_shutdown, /* ok */ |
diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c index 2febe26de6a1..595ad408dba0 100644 --- a/net/ipv6/inet6_hashtables.c +++ b/net/ipv6/inet6_hashtables.c | |||
@@ -113,9 +113,9 @@ static inline int compute_score(struct sock *sk, struct net *net, | |||
113 | bool dev_match = (sk->sk_bound_dev_if == dif || | 113 | bool dev_match = (sk->sk_bound_dev_if == dif || |
114 | sk->sk_bound_dev_if == sdif); | 114 | sk->sk_bound_dev_if == sdif); |
115 | 115 | ||
116 | if (exact_dif && !dev_match) | 116 | if (!dev_match) |
117 | return -1; | 117 | return -1; |
118 | if (sk->sk_bound_dev_if && dev_match) | 118 | if (sk->sk_bound_dev_if) |
119 | score++; | 119 | score++; |
120 | } | 120 | } |
121 | if (sk->sk_incoming_cpu == raw_smp_processor_id()) | 121 | if (sk->sk_incoming_cpu == raw_smp_processor_id()) |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 39d1d487eca2..1fb2f3118d60 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -167,8 +167,9 @@ struct fib6_info *fib6_info_alloc(gfp_t gfp_flags) | |||
167 | return f6i; | 167 | return f6i; |
168 | } | 168 | } |
169 | 169 | ||
170 | void fib6_info_destroy(struct fib6_info *f6i) | 170 | void fib6_info_destroy_rcu(struct rcu_head *head) |
171 | { | 171 | { |
172 | struct fib6_info *f6i = container_of(head, struct fib6_info, rcu); | ||
172 | struct rt6_exception_bucket *bucket; | 173 | struct rt6_exception_bucket *bucket; |
173 | struct dst_metrics *m; | 174 | struct dst_metrics *m; |
174 | 175 | ||
@@ -206,7 +207,7 @@ void fib6_info_destroy(struct fib6_info *f6i) | |||
206 | 207 | ||
207 | kfree(f6i); | 208 | kfree(f6i); |
208 | } | 209 | } |
209 | EXPORT_SYMBOL_GPL(fib6_info_destroy); | 210 | EXPORT_SYMBOL_GPL(fib6_info_destroy_rcu); |
210 | 211 | ||
211 | static struct fib6_node *node_alloc(struct net *net) | 212 | static struct fib6_node *node_alloc(struct net *net) |
212 | { | 213 | { |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 021e5aef6ba3..a14fb4fcdf18 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1219,7 +1219,8 @@ static int ip6_setup_cork(struct sock *sk, struct inet_cork_full *cork, | |||
1219 | if (mtu < IPV6_MIN_MTU) | 1219 | if (mtu < IPV6_MIN_MTU) |
1220 | return -EINVAL; | 1220 | return -EINVAL; |
1221 | cork->base.fragsize = mtu; | 1221 | cork->base.fragsize = mtu; |
1222 | cork->base.gso_size = sk->sk_type == SOCK_DGRAM ? ipc6->gso_size : 0; | 1222 | cork->base.gso_size = sk->sk_type == SOCK_DGRAM && |
1223 | sk->sk_protocol == IPPROTO_UDP ? ipc6->gso_size : 0; | ||
1223 | 1224 | ||
1224 | if (dst_allfrag(xfrm_dst_path(&rt->dst))) | 1225 | if (dst_allfrag(xfrm_dst_path(&rt->dst))) |
1225 | cork->base.flags |= IPCORK_ALLFRAG; | 1226 | cork->base.flags |= IPCORK_ALLFRAG; |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 975021df7c1c..c0c74088f2af 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -2082,7 +2082,8 @@ void ipv6_mc_dad_complete(struct inet6_dev *idev) | |||
2082 | mld_send_initial_cr(idev); | 2082 | mld_send_initial_cr(idev); |
2083 | idev->mc_dad_count--; | 2083 | idev->mc_dad_count--; |
2084 | if (idev->mc_dad_count) | 2084 | if (idev->mc_dad_count) |
2085 | mld_dad_start_timer(idev, idev->mc_maxdelay); | 2085 | mld_dad_start_timer(idev, |
2086 | unsolicited_report_interval(idev)); | ||
2086 | } | 2087 | } |
2087 | } | 2088 | } |
2088 | 2089 | ||
@@ -2094,7 +2095,8 @@ static void mld_dad_timer_expire(struct timer_list *t) | |||
2094 | if (idev->mc_dad_count) { | 2095 | if (idev->mc_dad_count) { |
2095 | idev->mc_dad_count--; | 2096 | idev->mc_dad_count--; |
2096 | if (idev->mc_dad_count) | 2097 | if (idev->mc_dad_count) |
2097 | mld_dad_start_timer(idev, idev->mc_maxdelay); | 2098 | mld_dad_start_timer(idev, |
2099 | unsolicited_report_interval(idev)); | ||
2098 | } | 2100 | } |
2099 | in6_dev_put(idev); | 2101 | in6_dev_put(idev); |
2100 | } | 2102 | } |
@@ -2452,7 +2454,8 @@ static void mld_ifc_timer_expire(struct timer_list *t) | |||
2452 | if (idev->mc_ifc_count) { | 2454 | if (idev->mc_ifc_count) { |
2453 | idev->mc_ifc_count--; | 2455 | idev->mc_ifc_count--; |
2454 | if (idev->mc_ifc_count) | 2456 | if (idev->mc_ifc_count) |
2455 | mld_ifc_start_timer(idev, idev->mc_maxdelay); | 2457 | mld_ifc_start_timer(idev, |
2458 | unsolicited_report_interval(idev)); | ||
2456 | } | 2459 | } |
2457 | in6_dev_put(idev); | 2460 | in6_dev_put(idev); |
2458 | } | 2461 | } |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 5e0332014c17..a452d99c9f52 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
@@ -107,7 +107,7 @@ static int nf_ct_frag6_sysctl_register(struct net *net) | |||
107 | if (hdr == NULL) | 107 | if (hdr == NULL) |
108 | goto err_reg; | 108 | goto err_reg; |
109 | 109 | ||
110 | net->nf_frag.sysctl.frags_hdr = hdr; | 110 | net->nf_frag_frags_hdr = hdr; |
111 | return 0; | 111 | return 0; |
112 | 112 | ||
113 | err_reg: | 113 | err_reg: |
@@ -121,8 +121,8 @@ static void __net_exit nf_ct_frags6_sysctl_unregister(struct net *net) | |||
121 | { | 121 | { |
122 | struct ctl_table *table; | 122 | struct ctl_table *table; |
123 | 123 | ||
124 | table = net->nf_frag.sysctl.frags_hdr->ctl_table_arg; | 124 | table = net->nf_frag_frags_hdr->ctl_table_arg; |
125 | unregister_net_sysctl_table(net->nf_frag.sysctl.frags_hdr); | 125 | unregister_net_sysctl_table(net->nf_frag_frags_hdr); |
126 | if (!net_eq(net, &init_net)) | 126 | if (!net_eq(net, &init_net)) |
127 | kfree(table); | 127 | kfree(table); |
128 | } | 128 | } |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index ce6f0d15b5dd..afc307c89d1a 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -1334,7 +1334,7 @@ void raw6_proc_exit(void) | |||
1334 | } | 1334 | } |
1335 | #endif /* CONFIG_PROC_FS */ | 1335 | #endif /* CONFIG_PROC_FS */ |
1336 | 1336 | ||
1337 | /* Same as inet6_dgram_ops, sans udp_poll_mask. */ | 1337 | /* Same as inet6_dgram_ops, sans udp_poll. */ |
1338 | const struct proto_ops inet6_sockraw_ops = { | 1338 | const struct proto_ops inet6_sockraw_ops = { |
1339 | .family = PF_INET6, | 1339 | .family = PF_INET6, |
1340 | .owner = THIS_MODULE, | 1340 | .owner = THIS_MODULE, |
@@ -1344,7 +1344,7 @@ const struct proto_ops inet6_sockraw_ops = { | |||
1344 | .socketpair = sock_no_socketpair, /* a do nothing */ | 1344 | .socketpair = sock_no_socketpair, /* a do nothing */ |
1345 | .accept = sock_no_accept, /* a do nothing */ | 1345 | .accept = sock_no_accept, /* a do nothing */ |
1346 | .getname = inet6_getname, | 1346 | .getname = inet6_getname, |
1347 | .poll_mask = datagram_poll_mask, /* ok */ | 1347 | .poll = datagram_poll, /* ok */ |
1348 | .ioctl = inet6_ioctl, /* must change */ | 1348 | .ioctl = inet6_ioctl, /* must change */ |
1349 | .listen = sock_no_listen, /* ok */ | 1349 | .listen = sock_no_listen, /* ok */ |
1350 | .shutdown = inet_shutdown, /* ok */ | 1350 | .shutdown = inet_shutdown, /* ok */ |
diff --git a/net/ipv6/seg6_hmac.c b/net/ipv6/seg6_hmac.c index 33fb35cbfac1..558fe8cc6d43 100644 --- a/net/ipv6/seg6_hmac.c +++ b/net/ipv6/seg6_hmac.c | |||
@@ -373,7 +373,7 @@ static int seg6_hmac_init_algo(void) | |||
373 | return -ENOMEM; | 373 | return -ENOMEM; |
374 | 374 | ||
375 | for_each_possible_cpu(cpu) { | 375 | for_each_possible_cpu(cpu) { |
376 | tfm = crypto_alloc_shash(algo->name, 0, GFP_KERNEL); | 376 | tfm = crypto_alloc_shash(algo->name, 0, 0); |
377 | if (IS_ERR(tfm)) | 377 | if (IS_ERR(tfm)) |
378 | return PTR_ERR(tfm); | 378 | return PTR_ERR(tfm); |
379 | p_tfm = per_cpu_ptr(algo->tfms, cpu); | 379 | p_tfm = per_cpu_ptr(algo->tfms, cpu); |
diff --git a/net/iucv/af_iucv.c b/net/iucv/af_iucv.c index 68e86257a549..893a022f9620 100644 --- a/net/iucv/af_iucv.c +++ b/net/iucv/af_iucv.c | |||
@@ -1488,11 +1488,14 @@ static inline __poll_t iucv_accept_poll(struct sock *parent) | |||
1488 | return 0; | 1488 | return 0; |
1489 | } | 1489 | } |
1490 | 1490 | ||
1491 | static __poll_t iucv_sock_poll_mask(struct socket *sock, __poll_t events) | 1491 | __poll_t iucv_sock_poll(struct file *file, struct socket *sock, |
1492 | poll_table *wait) | ||
1492 | { | 1493 | { |
1493 | struct sock *sk = sock->sk; | 1494 | struct sock *sk = sock->sk; |
1494 | __poll_t mask = 0; | 1495 | __poll_t mask = 0; |
1495 | 1496 | ||
1497 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
1498 | |||
1496 | if (sk->sk_state == IUCV_LISTEN) | 1499 | if (sk->sk_state == IUCV_LISTEN) |
1497 | return iucv_accept_poll(sk); | 1500 | return iucv_accept_poll(sk); |
1498 | 1501 | ||
@@ -2385,7 +2388,7 @@ static const struct proto_ops iucv_sock_ops = { | |||
2385 | .getname = iucv_sock_getname, | 2388 | .getname = iucv_sock_getname, |
2386 | .sendmsg = iucv_sock_sendmsg, | 2389 | .sendmsg = iucv_sock_sendmsg, |
2387 | .recvmsg = iucv_sock_recvmsg, | 2390 | .recvmsg = iucv_sock_recvmsg, |
2388 | .poll_mask = iucv_sock_poll_mask, | 2391 | .poll = iucv_sock_poll, |
2389 | .ioctl = sock_no_ioctl, | 2392 | .ioctl = sock_no_ioctl, |
2390 | .mmap = sock_no_mmap, | 2393 | .mmap = sock_no_mmap, |
2391 | .socketpair = sock_no_socketpair, | 2394 | .socketpair = sock_no_socketpair, |
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c index 84b7d5c6fec8..d3601d421571 100644 --- a/net/kcm/kcmsock.c +++ b/net/kcm/kcmsock.c | |||
@@ -1336,9 +1336,9 @@ static void init_kcm_sock(struct kcm_sock *kcm, struct kcm_mux *mux) | |||
1336 | struct list_head *head; | 1336 | struct list_head *head; |
1337 | int index = 0; | 1337 | int index = 0; |
1338 | 1338 | ||
1339 | /* For SOCK_SEQPACKET sock type, datagram_poll_mask checks the sk_state, | 1339 | /* For SOCK_SEQPACKET sock type, datagram_poll checks the sk_state, so |
1340 | * so we set sk_state, otherwise epoll_wait always returns right away | 1340 | * we set sk_state, otherwise epoll_wait always returns right away with |
1341 | * with EPOLLHUP | 1341 | * EPOLLHUP |
1342 | */ | 1342 | */ |
1343 | kcm->sk.sk_state = TCP_ESTABLISHED; | 1343 | kcm->sk.sk_state = TCP_ESTABLISHED; |
1344 | 1344 | ||
@@ -1903,7 +1903,7 @@ static const struct proto_ops kcm_dgram_ops = { | |||
1903 | .socketpair = sock_no_socketpair, | 1903 | .socketpair = sock_no_socketpair, |
1904 | .accept = sock_no_accept, | 1904 | .accept = sock_no_accept, |
1905 | .getname = sock_no_getname, | 1905 | .getname = sock_no_getname, |
1906 | .poll_mask = datagram_poll_mask, | 1906 | .poll = datagram_poll, |
1907 | .ioctl = kcm_ioctl, | 1907 | .ioctl = kcm_ioctl, |
1908 | .listen = sock_no_listen, | 1908 | .listen = sock_no_listen, |
1909 | .shutdown = sock_no_shutdown, | 1909 | .shutdown = sock_no_shutdown, |
@@ -1924,7 +1924,7 @@ static const struct proto_ops kcm_seqpacket_ops = { | |||
1924 | .socketpair = sock_no_socketpair, | 1924 | .socketpair = sock_no_socketpair, |
1925 | .accept = sock_no_accept, | 1925 | .accept = sock_no_accept, |
1926 | .getname = sock_no_getname, | 1926 | .getname = sock_no_getname, |
1927 | .poll_mask = datagram_poll_mask, | 1927 | .poll = datagram_poll, |
1928 | .ioctl = kcm_ioctl, | 1928 | .ioctl = kcm_ioctl, |
1929 | .listen = sock_no_listen, | 1929 | .listen = sock_no_listen, |
1930 | .shutdown = sock_no_shutdown, | 1930 | .shutdown = sock_no_shutdown, |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 8bdc1cbe490a..5e1d2946ffbf 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -3751,7 +3751,7 @@ static const struct proto_ops pfkey_ops = { | |||
3751 | 3751 | ||
3752 | /* Now the operations that really occur. */ | 3752 | /* Now the operations that really occur. */ |
3753 | .release = pfkey_release, | 3753 | .release = pfkey_release, |
3754 | .poll_mask = datagram_poll_mask, | 3754 | .poll = datagram_poll, |
3755 | .sendmsg = pfkey_sendmsg, | 3755 | .sendmsg = pfkey_sendmsg, |
3756 | .recvmsg = pfkey_recvmsg, | 3756 | .recvmsg = pfkey_recvmsg, |
3757 | }; | 3757 | }; |
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 181073bf6925..a9c05b2bc1b0 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c | |||
@@ -613,7 +613,7 @@ static const struct proto_ops l2tp_ip_ops = { | |||
613 | .socketpair = sock_no_socketpair, | 613 | .socketpair = sock_no_socketpair, |
614 | .accept = sock_no_accept, | 614 | .accept = sock_no_accept, |
615 | .getname = l2tp_ip_getname, | 615 | .getname = l2tp_ip_getname, |
616 | .poll_mask = datagram_poll_mask, | 616 | .poll = datagram_poll, |
617 | .ioctl = inet_ioctl, | 617 | .ioctl = inet_ioctl, |
618 | .listen = sock_no_listen, | 618 | .listen = sock_no_listen, |
619 | .shutdown = inet_shutdown, | 619 | .shutdown = inet_shutdown, |
diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index 336e4c00abbc..957369192ca1 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c | |||
@@ -754,7 +754,7 @@ static const struct proto_ops l2tp_ip6_ops = { | |||
754 | .socketpair = sock_no_socketpair, | 754 | .socketpair = sock_no_socketpair, |
755 | .accept = sock_no_accept, | 755 | .accept = sock_no_accept, |
756 | .getname = l2tp_ip6_getname, | 756 | .getname = l2tp_ip6_getname, |
757 | .poll_mask = datagram_poll_mask, | 757 | .poll = datagram_poll, |
758 | .ioctl = inet6_ioctl, | 758 | .ioctl = inet6_ioctl, |
759 | .listen = sock_no_listen, | 759 | .listen = sock_no_listen, |
760 | .shutdown = inet_shutdown, | 760 | .shutdown = inet_shutdown, |
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index 55188382845c..e398797878a9 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c | |||
@@ -1818,7 +1818,7 @@ static const struct proto_ops pppol2tp_ops = { | |||
1818 | .socketpair = sock_no_socketpair, | 1818 | .socketpair = sock_no_socketpair, |
1819 | .accept = sock_no_accept, | 1819 | .accept = sock_no_accept, |
1820 | .getname = pppol2tp_getname, | 1820 | .getname = pppol2tp_getname, |
1821 | .poll_mask = datagram_poll_mask, | 1821 | .poll = datagram_poll, |
1822 | .listen = sock_no_listen, | 1822 | .listen = sock_no_listen, |
1823 | .shutdown = sock_no_shutdown, | 1823 | .shutdown = sock_no_shutdown, |
1824 | .setsockopt = pppol2tp_setsockopt, | 1824 | .setsockopt = pppol2tp_setsockopt, |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index 804de8490186..1beeea9549fa 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
@@ -1192,7 +1192,7 @@ static const struct proto_ops llc_ui_ops = { | |||
1192 | .socketpair = sock_no_socketpair, | 1192 | .socketpair = sock_no_socketpair, |
1193 | .accept = llc_ui_accept, | 1193 | .accept = llc_ui_accept, |
1194 | .getname = llc_ui_getname, | 1194 | .getname = llc_ui_getname, |
1195 | .poll_mask = datagram_poll_mask, | 1195 | .poll = datagram_poll, |
1196 | .ioctl = llc_ui_ioctl, | 1196 | .ioctl = llc_ui_ioctl, |
1197 | .listen = llc_ui_listen, | 1197 | .listen = llc_ui_listen, |
1198 | .shutdown = llc_ui_shutdown, | 1198 | .shutdown = llc_ui_shutdown, |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 44b5dfe8727d..fa1f1e63a264 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -4845,7 +4845,9 @@ int ieee80211_tx_control_port(struct wiphy *wiphy, struct net_device *dev, | |||
4845 | skb_reset_network_header(skb); | 4845 | skb_reset_network_header(skb); |
4846 | skb_reset_mac_header(skb); | 4846 | skb_reset_mac_header(skb); |
4847 | 4847 | ||
4848 | local_bh_disable(); | ||
4848 | __ieee80211_subif_start_xmit(skb, skb->dev, flags); | 4849 | __ieee80211_subif_start_xmit(skb, skb->dev, flags); |
4850 | local_bh_enable(); | ||
4849 | 4851 | ||
4850 | return 0; | 4852 | return 0; |
4851 | } | 4853 | } |
diff --git a/net/ncsi/ncsi-aen.c b/net/ncsi/ncsi-aen.c index e7b05de1e6d1..25e483e8278b 100644 --- a/net/ncsi/ncsi-aen.c +++ b/net/ncsi/ncsi-aen.c | |||
@@ -73,8 +73,8 @@ static int ncsi_aen_handler_lsc(struct ncsi_dev_priv *ndp, | |||
73 | ncm->data[2] = data; | 73 | ncm->data[2] = data; |
74 | ncm->data[4] = ntohl(lsc->oem_status); | 74 | ncm->data[4] = ntohl(lsc->oem_status); |
75 | 75 | ||
76 | netdev_info(ndp->ndev.dev, "NCSI: LSC AEN - channel %u state %s\n", | 76 | netdev_dbg(ndp->ndev.dev, "NCSI: LSC AEN - channel %u state %s\n", |
77 | nc->id, data & 0x1 ? "up" : "down"); | 77 | nc->id, data & 0x1 ? "up" : "down"); |
78 | 78 | ||
79 | chained = !list_empty(&nc->link); | 79 | chained = !list_empty(&nc->link); |
80 | state = nc->state; | 80 | state = nc->state; |
@@ -148,9 +148,9 @@ static int ncsi_aen_handler_hncdsc(struct ncsi_dev_priv *ndp, | |||
148 | hncdsc = (struct ncsi_aen_hncdsc_pkt *)h; | 148 | hncdsc = (struct ncsi_aen_hncdsc_pkt *)h; |
149 | ncm->data[3] = ntohl(hncdsc->status); | 149 | ncm->data[3] = ntohl(hncdsc->status); |
150 | spin_unlock_irqrestore(&nc->lock, flags); | 150 | spin_unlock_irqrestore(&nc->lock, flags); |
151 | netdev_printk(KERN_DEBUG, ndp->ndev.dev, | 151 | netdev_dbg(ndp->ndev.dev, |
152 | "NCSI: host driver %srunning on channel %u\n", | 152 | "NCSI: host driver %srunning on channel %u\n", |
153 | ncm->data[3] & 0x1 ? "" : "not ", nc->id); | 153 | ncm->data[3] & 0x1 ? "" : "not ", nc->id); |
154 | 154 | ||
155 | return 0; | 155 | return 0; |
156 | } | 156 | } |
diff --git a/net/ncsi/ncsi-manage.c b/net/ncsi/ncsi-manage.c index 5561e221b71f..091284760d21 100644 --- a/net/ncsi/ncsi-manage.c +++ b/net/ncsi/ncsi-manage.c | |||
@@ -788,8 +788,8 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp) | |||
788 | } | 788 | } |
789 | break; | 789 | break; |
790 | case ncsi_dev_state_config_done: | 790 | case ncsi_dev_state_config_done: |
791 | netdev_printk(KERN_DEBUG, ndp->ndev.dev, | 791 | netdev_dbg(ndp->ndev.dev, "NCSI: channel %u config done\n", |
792 | "NCSI: channel %u config done\n", nc->id); | 792 | nc->id); |
793 | spin_lock_irqsave(&nc->lock, flags); | 793 | spin_lock_irqsave(&nc->lock, flags); |
794 | if (nc->reconfigure_needed) { | 794 | if (nc->reconfigure_needed) { |
795 | /* This channel's configuration has been updated | 795 | /* This channel's configuration has been updated |
@@ -804,8 +804,7 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp) | |||
804 | list_add_tail_rcu(&nc->link, &ndp->channel_queue); | 804 | list_add_tail_rcu(&nc->link, &ndp->channel_queue); |
805 | spin_unlock_irqrestore(&ndp->lock, flags); | 805 | spin_unlock_irqrestore(&ndp->lock, flags); |
806 | 806 | ||
807 | netdev_printk(KERN_DEBUG, dev, | 807 | netdev_dbg(dev, "Dirty NCSI channel state reset\n"); |
808 | "Dirty NCSI channel state reset\n"); | ||
809 | ncsi_process_next_channel(ndp); | 808 | ncsi_process_next_channel(ndp); |
810 | break; | 809 | break; |
811 | } | 810 | } |
@@ -816,9 +815,9 @@ static void ncsi_configure_channel(struct ncsi_dev_priv *ndp) | |||
816 | } else { | 815 | } else { |
817 | hot_nc = NULL; | 816 | hot_nc = NULL; |
818 | nc->state = NCSI_CHANNEL_INACTIVE; | 817 | nc->state = NCSI_CHANNEL_INACTIVE; |
819 | netdev_warn(ndp->ndev.dev, | 818 | netdev_dbg(ndp->ndev.dev, |
820 | "NCSI: channel %u link down after config\n", | 819 | "NCSI: channel %u link down after config\n", |
821 | nc->id); | 820 | nc->id); |
822 | } | 821 | } |
823 | spin_unlock_irqrestore(&nc->lock, flags); | 822 | spin_unlock_irqrestore(&nc->lock, flags); |
824 | 823 | ||
@@ -908,9 +907,9 @@ static int ncsi_choose_active_channel(struct ncsi_dev_priv *ndp) | |||
908 | } | 907 | } |
909 | 908 | ||
910 | ncm = &found->modes[NCSI_MODE_LINK]; | 909 | ncm = &found->modes[NCSI_MODE_LINK]; |
911 | netdev_printk(KERN_DEBUG, ndp->ndev.dev, | 910 | netdev_dbg(ndp->ndev.dev, |
912 | "NCSI: Channel %u added to queue (link %s)\n", | 911 | "NCSI: Channel %u added to queue (link %s)\n", |
913 | found->id, ncm->data[2] & 0x1 ? "up" : "down"); | 912 | found->id, ncm->data[2] & 0x1 ? "up" : "down"); |
914 | 913 | ||
915 | out: | 914 | out: |
916 | spin_lock_irqsave(&ndp->lock, flags); | 915 | spin_lock_irqsave(&ndp->lock, flags); |
@@ -1199,14 +1198,14 @@ int ncsi_process_next_channel(struct ncsi_dev_priv *ndp) | |||
1199 | switch (old_state) { | 1198 | switch (old_state) { |
1200 | case NCSI_CHANNEL_INACTIVE: | 1199 | case NCSI_CHANNEL_INACTIVE: |
1201 | ndp->ndev.state = ncsi_dev_state_config; | 1200 | ndp->ndev.state = ncsi_dev_state_config; |
1202 | netdev_info(ndp->ndev.dev, "NCSI: configuring channel %u\n", | 1201 | netdev_dbg(ndp->ndev.dev, "NCSI: configuring channel %u\n", |
1203 | nc->id); | 1202 | nc->id); |
1204 | ncsi_configure_channel(ndp); | 1203 | ncsi_configure_channel(ndp); |
1205 | break; | 1204 | break; |
1206 | case NCSI_CHANNEL_ACTIVE: | 1205 | case NCSI_CHANNEL_ACTIVE: |
1207 | ndp->ndev.state = ncsi_dev_state_suspend; | 1206 | ndp->ndev.state = ncsi_dev_state_suspend; |
1208 | netdev_info(ndp->ndev.dev, "NCSI: suspending channel %u\n", | 1207 | netdev_dbg(ndp->ndev.dev, "NCSI: suspending channel %u\n", |
1209 | nc->id); | 1208 | nc->id); |
1210 | ncsi_suspend_channel(ndp); | 1209 | ncsi_suspend_channel(ndp); |
1211 | break; | 1210 | break; |
1212 | default: | 1211 | default: |
@@ -1226,8 +1225,6 @@ out: | |||
1226 | return ncsi_choose_active_channel(ndp); | 1225 | return ncsi_choose_active_channel(ndp); |
1227 | } | 1226 | } |
1228 | 1227 | ||
1229 | netdev_printk(KERN_DEBUG, ndp->ndev.dev, | ||
1230 | "NCSI: No more channels to process\n"); | ||
1231 | ncsi_report_link(ndp, false); | 1228 | ncsi_report_link(ndp, false); |
1232 | return -ENODEV; | 1229 | return -ENODEV; |
1233 | } | 1230 | } |
@@ -1318,9 +1315,9 @@ static int ncsi_kick_channels(struct ncsi_dev_priv *ndp) | |||
1318 | if ((ndp->ndev.state & 0xff00) == | 1315 | if ((ndp->ndev.state & 0xff00) == |
1319 | ncsi_dev_state_config || | 1316 | ncsi_dev_state_config || |
1320 | !list_empty(&nc->link)) { | 1317 | !list_empty(&nc->link)) { |
1321 | netdev_printk(KERN_DEBUG, nd->dev, | 1318 | netdev_dbg(nd->dev, |
1322 | "NCSI: channel %p marked dirty\n", | 1319 | "NCSI: channel %p marked dirty\n", |
1323 | nc); | 1320 | nc); |
1324 | nc->reconfigure_needed = true; | 1321 | nc->reconfigure_needed = true; |
1325 | } | 1322 | } |
1326 | spin_unlock_irqrestore(&nc->lock, flags); | 1323 | spin_unlock_irqrestore(&nc->lock, flags); |
@@ -1338,8 +1335,7 @@ static int ncsi_kick_channels(struct ncsi_dev_priv *ndp) | |||
1338 | list_add_tail_rcu(&nc->link, &ndp->channel_queue); | 1335 | list_add_tail_rcu(&nc->link, &ndp->channel_queue); |
1339 | spin_unlock_irqrestore(&ndp->lock, flags); | 1336 | spin_unlock_irqrestore(&ndp->lock, flags); |
1340 | 1337 | ||
1341 | netdev_printk(KERN_DEBUG, nd->dev, | 1338 | netdev_dbg(nd->dev, "NCSI: kicked channel %p\n", nc); |
1342 | "NCSI: kicked channel %p\n", nc); | ||
1343 | n++; | 1339 | n++; |
1344 | } | 1340 | } |
1345 | } | 1341 | } |
@@ -1370,8 +1366,8 @@ int ncsi_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid) | |||
1370 | list_for_each_entry_rcu(vlan, &ndp->vlan_vids, list) { | 1366 | list_for_each_entry_rcu(vlan, &ndp->vlan_vids, list) { |
1371 | n_vids++; | 1367 | n_vids++; |
1372 | if (vlan->vid == vid) { | 1368 | if (vlan->vid == vid) { |
1373 | netdev_printk(KERN_DEBUG, dev, | 1369 | netdev_dbg(dev, "NCSI: vid %u already registered\n", |
1374 | "NCSI: vid %u already registered\n", vid); | 1370 | vid); |
1375 | return 0; | 1371 | return 0; |
1376 | } | 1372 | } |
1377 | } | 1373 | } |
@@ -1390,7 +1386,7 @@ int ncsi_vlan_rx_add_vid(struct net_device *dev, __be16 proto, u16 vid) | |||
1390 | vlan->vid = vid; | 1386 | vlan->vid = vid; |
1391 | list_add_rcu(&vlan->list, &ndp->vlan_vids); | 1387 | list_add_rcu(&vlan->list, &ndp->vlan_vids); |
1392 | 1388 | ||
1393 | netdev_printk(KERN_DEBUG, dev, "NCSI: Added new vid %u\n", vid); | 1389 | netdev_dbg(dev, "NCSI: Added new vid %u\n", vid); |
1394 | 1390 | ||
1395 | found = ncsi_kick_channels(ndp) != 0; | 1391 | found = ncsi_kick_channels(ndp) != 0; |
1396 | 1392 | ||
@@ -1419,8 +1415,7 @@ int ncsi_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid) | |||
1419 | /* Remove the VLAN id from our internal list */ | 1415 | /* Remove the VLAN id from our internal list */ |
1420 | list_for_each_entry_safe(vlan, tmp, &ndp->vlan_vids, list) | 1416 | list_for_each_entry_safe(vlan, tmp, &ndp->vlan_vids, list) |
1421 | if (vlan->vid == vid) { | 1417 | if (vlan->vid == vid) { |
1422 | netdev_printk(KERN_DEBUG, dev, | 1418 | netdev_dbg(dev, "NCSI: vid %u found, removing\n", vid); |
1423 | "NCSI: vid %u found, removing\n", vid); | ||
1424 | list_del_rcu(&vlan->list); | 1419 | list_del_rcu(&vlan->list); |
1425 | found = true; | 1420 | found = true; |
1426 | kfree(vlan); | 1421 | kfree(vlan); |
@@ -1547,7 +1542,7 @@ void ncsi_stop_dev(struct ncsi_dev *nd) | |||
1547 | } | 1542 | } |
1548 | } | 1543 | } |
1549 | 1544 | ||
1550 | netdev_printk(KERN_DEBUG, ndp->ndev.dev, "NCSI: Stopping device\n"); | 1545 | netdev_dbg(ndp->ndev.dev, "NCSI: Stopping device\n"); |
1551 | ncsi_report_link(ndp, true); | 1546 | ncsi_report_link(ndp, true); |
1552 | } | 1547 | } |
1553 | EXPORT_SYMBOL_GPL(ncsi_stop_dev); | 1548 | EXPORT_SYMBOL_GPL(ncsi_stop_dev); |
diff --git a/net/netfilter/nf_conncount.c b/net/netfilter/nf_conncount.c index d8383609fe28..510039862aa9 100644 --- a/net/netfilter/nf_conncount.c +++ b/net/netfilter/nf_conncount.c | |||
@@ -47,6 +47,8 @@ struct nf_conncount_tuple { | |||
47 | struct hlist_node node; | 47 | struct hlist_node node; |
48 | struct nf_conntrack_tuple tuple; | 48 | struct nf_conntrack_tuple tuple; |
49 | struct nf_conntrack_zone zone; | 49 | struct nf_conntrack_zone zone; |
50 | int cpu; | ||
51 | u32 jiffies32; | ||
50 | }; | 52 | }; |
51 | 53 | ||
52 | struct nf_conncount_rb { | 54 | struct nf_conncount_rb { |
@@ -91,11 +93,42 @@ bool nf_conncount_add(struct hlist_head *head, | |||
91 | return false; | 93 | return false; |
92 | conn->tuple = *tuple; | 94 | conn->tuple = *tuple; |
93 | conn->zone = *zone; | 95 | conn->zone = *zone; |
96 | conn->cpu = raw_smp_processor_id(); | ||
97 | conn->jiffies32 = (u32)jiffies; | ||
94 | hlist_add_head(&conn->node, head); | 98 | hlist_add_head(&conn->node, head); |
95 | return true; | 99 | return true; |
96 | } | 100 | } |
97 | EXPORT_SYMBOL_GPL(nf_conncount_add); | 101 | EXPORT_SYMBOL_GPL(nf_conncount_add); |
98 | 102 | ||
103 | static const struct nf_conntrack_tuple_hash * | ||
104 | find_or_evict(struct net *net, struct nf_conncount_tuple *conn) | ||
105 | { | ||
106 | const struct nf_conntrack_tuple_hash *found; | ||
107 | unsigned long a, b; | ||
108 | int cpu = raw_smp_processor_id(); | ||
109 | __s32 age; | ||
110 | |||
111 | found = nf_conntrack_find_get(net, &conn->zone, &conn->tuple); | ||
112 | if (found) | ||
113 | return found; | ||
114 | b = conn->jiffies32; | ||
115 | a = (u32)jiffies; | ||
116 | |||
117 | /* conn might have been added just before by another cpu and | ||
118 | * might still be unconfirmed. In this case, nf_conntrack_find() | ||
119 | * returns no result. Thus only evict if this cpu added the | ||
120 | * stale entry or if the entry is older than two jiffies. | ||
121 | */ | ||
122 | age = a - b; | ||
123 | if (conn->cpu == cpu || age >= 2) { | ||
124 | hlist_del(&conn->node); | ||
125 | kmem_cache_free(conncount_conn_cachep, conn); | ||
126 | return ERR_PTR(-ENOENT); | ||
127 | } | ||
128 | |||
129 | return ERR_PTR(-EAGAIN); | ||
130 | } | ||
131 | |||
99 | unsigned int nf_conncount_lookup(struct net *net, struct hlist_head *head, | 132 | unsigned int nf_conncount_lookup(struct net *net, struct hlist_head *head, |
100 | const struct nf_conntrack_tuple *tuple, | 133 | const struct nf_conntrack_tuple *tuple, |
101 | const struct nf_conntrack_zone *zone, | 134 | const struct nf_conntrack_zone *zone, |
@@ -103,18 +136,27 @@ unsigned int nf_conncount_lookup(struct net *net, struct hlist_head *head, | |||
103 | { | 136 | { |
104 | const struct nf_conntrack_tuple_hash *found; | 137 | const struct nf_conntrack_tuple_hash *found; |
105 | struct nf_conncount_tuple *conn; | 138 | struct nf_conncount_tuple *conn; |
106 | struct hlist_node *n; | ||
107 | struct nf_conn *found_ct; | 139 | struct nf_conn *found_ct; |
140 | struct hlist_node *n; | ||
108 | unsigned int length = 0; | 141 | unsigned int length = 0; |
109 | 142 | ||
110 | *addit = tuple ? true : false; | 143 | *addit = tuple ? true : false; |
111 | 144 | ||
112 | /* check the saved connections */ | 145 | /* check the saved connections */ |
113 | hlist_for_each_entry_safe(conn, n, head, node) { | 146 | hlist_for_each_entry_safe(conn, n, head, node) { |
114 | found = nf_conntrack_find_get(net, &conn->zone, &conn->tuple); | 147 | found = find_or_evict(net, conn); |
115 | if (found == NULL) { | 148 | if (IS_ERR(found)) { |
116 | hlist_del(&conn->node); | 149 | /* Not found, but might be about to be confirmed */ |
117 | kmem_cache_free(conncount_conn_cachep, conn); | 150 | if (PTR_ERR(found) == -EAGAIN) { |
151 | length++; | ||
152 | if (!tuple) | ||
153 | continue; | ||
154 | |||
155 | if (nf_ct_tuple_equal(&conn->tuple, tuple) && | ||
156 | nf_ct_zone_id(&conn->zone, conn->zone.dir) == | ||
157 | nf_ct_zone_id(zone, zone->dir)) | ||
158 | *addit = false; | ||
159 | } | ||
118 | continue; | 160 | continue; |
119 | } | 161 | } |
120 | 162 | ||
diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c index 551a1eddf0fa..a75b11c39312 100644 --- a/net/netfilter/nf_conntrack_helper.c +++ b/net/netfilter/nf_conntrack_helper.c | |||
@@ -465,6 +465,11 @@ void nf_conntrack_helper_unregister(struct nf_conntrack_helper *me) | |||
465 | 465 | ||
466 | nf_ct_expect_iterate_destroy(expect_iter_me, NULL); | 466 | nf_ct_expect_iterate_destroy(expect_iter_me, NULL); |
467 | nf_ct_iterate_destroy(unhelp, me); | 467 | nf_ct_iterate_destroy(unhelp, me); |
468 | |||
469 | /* Maybe someone has gotten the helper already when unhelp above. | ||
470 | * So need to wait it. | ||
471 | */ | ||
472 | synchronize_rcu(); | ||
468 | } | 473 | } |
469 | EXPORT_SYMBOL_GPL(nf_conntrack_helper_unregister); | 474 | EXPORT_SYMBOL_GPL(nf_conntrack_helper_unregister); |
470 | 475 | ||
diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c index 426457047578..a61d6df6e5f6 100644 --- a/net/netfilter/nf_log.c +++ b/net/netfilter/nf_log.c | |||
@@ -424,6 +424,10 @@ static int nf_log_proc_dostring(struct ctl_table *table, int write, | |||
424 | if (write) { | 424 | if (write) { |
425 | struct ctl_table tmp = *table; | 425 | struct ctl_table tmp = *table; |
426 | 426 | ||
427 | /* proc_dostring() can append to existing strings, so we need to | ||
428 | * initialize it as an empty string. | ||
429 | */ | ||
430 | buf[0] = '\0'; | ||
427 | tmp.data = buf; | 431 | tmp.data = buf; |
428 | r = proc_dostring(&tmp, write, buffer, lenp, ppos); | 432 | r = proc_dostring(&tmp, write, buffer, lenp, ppos); |
429 | if (r) | 433 | if (r) |
@@ -442,14 +446,17 @@ static int nf_log_proc_dostring(struct ctl_table *table, int write, | |||
442 | rcu_assign_pointer(net->nf.nf_loggers[tindex], logger); | 446 | rcu_assign_pointer(net->nf.nf_loggers[tindex], logger); |
443 | mutex_unlock(&nf_log_mutex); | 447 | mutex_unlock(&nf_log_mutex); |
444 | } else { | 448 | } else { |
449 | struct ctl_table tmp = *table; | ||
450 | |||
451 | tmp.data = buf; | ||
445 | mutex_lock(&nf_log_mutex); | 452 | mutex_lock(&nf_log_mutex); |
446 | logger = nft_log_dereference(net->nf.nf_loggers[tindex]); | 453 | logger = nft_log_dereference(net->nf.nf_loggers[tindex]); |
447 | if (!logger) | 454 | if (!logger) |
448 | table->data = "NONE"; | 455 | strlcpy(buf, "NONE", sizeof(buf)); |
449 | else | 456 | else |
450 | table->data = logger->name; | 457 | strlcpy(buf, logger->name, sizeof(buf)); |
451 | r = proc_dostring(table, write, buffer, lenp, ppos); | ||
452 | mutex_unlock(&nf_log_mutex); | 458 | mutex_unlock(&nf_log_mutex); |
459 | r = proc_dostring(&tmp, write, buffer, lenp, ppos); | ||
453 | } | 460 | } |
454 | 461 | ||
455 | return r; | 462 | return r; |
diff --git a/net/netfilter/nfnetlink_queue.c b/net/netfilter/nfnetlink_queue.c index 4ccd2988f9db..ea4ba551abb2 100644 --- a/net/netfilter/nfnetlink_queue.c +++ b/net/netfilter/nfnetlink_queue.c | |||
@@ -1243,6 +1243,9 @@ static int nfqnl_recv_unsupp(struct net *net, struct sock *ctnl, | |||
1243 | static const struct nla_policy nfqa_cfg_policy[NFQA_CFG_MAX+1] = { | 1243 | static const struct nla_policy nfqa_cfg_policy[NFQA_CFG_MAX+1] = { |
1244 | [NFQA_CFG_CMD] = { .len = sizeof(struct nfqnl_msg_config_cmd) }, | 1244 | [NFQA_CFG_CMD] = { .len = sizeof(struct nfqnl_msg_config_cmd) }, |
1245 | [NFQA_CFG_PARAMS] = { .len = sizeof(struct nfqnl_msg_config_params) }, | 1245 | [NFQA_CFG_PARAMS] = { .len = sizeof(struct nfqnl_msg_config_params) }, |
1246 | [NFQA_CFG_QUEUE_MAXLEN] = { .type = NLA_U32 }, | ||
1247 | [NFQA_CFG_MASK] = { .type = NLA_U32 }, | ||
1248 | [NFQA_CFG_FLAGS] = { .type = NLA_U32 }, | ||
1246 | }; | 1249 | }; |
1247 | 1250 | ||
1248 | static const struct nf_queue_handler nfqh = { | 1251 | static const struct nf_queue_handler nfqh = { |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 1189b84413d5..393573a99a5a 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -2658,7 +2658,7 @@ static const struct proto_ops netlink_ops = { | |||
2658 | .socketpair = sock_no_socketpair, | 2658 | .socketpair = sock_no_socketpair, |
2659 | .accept = sock_no_accept, | 2659 | .accept = sock_no_accept, |
2660 | .getname = netlink_getname, | 2660 | .getname = netlink_getname, |
2661 | .poll_mask = datagram_poll_mask, | 2661 | .poll = datagram_poll, |
2662 | .ioctl = netlink_ioctl, | 2662 | .ioctl = netlink_ioctl, |
2663 | .listen = sock_no_listen, | 2663 | .listen = sock_no_listen, |
2664 | .shutdown = sock_no_shutdown, | 2664 | .shutdown = sock_no_shutdown, |
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 93fbcafbf388..03f37c4e64fe 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c | |||
@@ -1355,7 +1355,7 @@ static const struct proto_ops nr_proto_ops = { | |||
1355 | .socketpair = sock_no_socketpair, | 1355 | .socketpair = sock_no_socketpair, |
1356 | .accept = nr_accept, | 1356 | .accept = nr_accept, |
1357 | .getname = nr_getname, | 1357 | .getname = nr_getname, |
1358 | .poll_mask = datagram_poll_mask, | 1358 | .poll = datagram_poll, |
1359 | .ioctl = nr_ioctl, | 1359 | .ioctl = nr_ioctl, |
1360 | .listen = nr_listen, | 1360 | .listen = nr_listen, |
1361 | .shutdown = sock_no_shutdown, | 1361 | .shutdown = sock_no_shutdown, |
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c index ab5bb14b49af..ea0c0c6f1874 100644 --- a/net/nfc/llcp_sock.c +++ b/net/nfc/llcp_sock.c | |||
@@ -548,13 +548,16 @@ static inline __poll_t llcp_accept_poll(struct sock *parent) | |||
548 | return 0; | 548 | return 0; |
549 | } | 549 | } |
550 | 550 | ||
551 | static __poll_t llcp_sock_poll_mask(struct socket *sock, __poll_t events) | 551 | static __poll_t llcp_sock_poll(struct file *file, struct socket *sock, |
552 | poll_table *wait) | ||
552 | { | 553 | { |
553 | struct sock *sk = sock->sk; | 554 | struct sock *sk = sock->sk; |
554 | __poll_t mask = 0; | 555 | __poll_t mask = 0; |
555 | 556 | ||
556 | pr_debug("%p\n", sk); | 557 | pr_debug("%p\n", sk); |
557 | 558 | ||
559 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
560 | |||
558 | if (sk->sk_state == LLCP_LISTEN) | 561 | if (sk->sk_state == LLCP_LISTEN) |
559 | return llcp_accept_poll(sk); | 562 | return llcp_accept_poll(sk); |
560 | 563 | ||
@@ -896,7 +899,7 @@ static const struct proto_ops llcp_sock_ops = { | |||
896 | .socketpair = sock_no_socketpair, | 899 | .socketpair = sock_no_socketpair, |
897 | .accept = llcp_sock_accept, | 900 | .accept = llcp_sock_accept, |
898 | .getname = llcp_sock_getname, | 901 | .getname = llcp_sock_getname, |
899 | .poll_mask = llcp_sock_poll_mask, | 902 | .poll = llcp_sock_poll, |
900 | .ioctl = sock_no_ioctl, | 903 | .ioctl = sock_no_ioctl, |
901 | .listen = llcp_sock_listen, | 904 | .listen = llcp_sock_listen, |
902 | .shutdown = sock_no_shutdown, | 905 | .shutdown = sock_no_shutdown, |
@@ -916,7 +919,7 @@ static const struct proto_ops llcp_rawsock_ops = { | |||
916 | .socketpair = sock_no_socketpair, | 919 | .socketpair = sock_no_socketpair, |
917 | .accept = sock_no_accept, | 920 | .accept = sock_no_accept, |
918 | .getname = llcp_sock_getname, | 921 | .getname = llcp_sock_getname, |
919 | .poll_mask = llcp_sock_poll_mask, | 922 | .poll = llcp_sock_poll, |
920 | .ioctl = sock_no_ioctl, | 923 | .ioctl = sock_no_ioctl, |
921 | .listen = sock_no_listen, | 924 | .listen = sock_no_listen, |
922 | .shutdown = sock_no_shutdown, | 925 | .shutdown = sock_no_shutdown, |
diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c index 60c322531c49..e2188deb08dc 100644 --- a/net/nfc/rawsock.c +++ b/net/nfc/rawsock.c | |||
@@ -284,7 +284,7 @@ static const struct proto_ops rawsock_ops = { | |||
284 | .socketpair = sock_no_socketpair, | 284 | .socketpair = sock_no_socketpair, |
285 | .accept = sock_no_accept, | 285 | .accept = sock_no_accept, |
286 | .getname = sock_no_getname, | 286 | .getname = sock_no_getname, |
287 | .poll_mask = datagram_poll_mask, | 287 | .poll = datagram_poll, |
288 | .ioctl = sock_no_ioctl, | 288 | .ioctl = sock_no_ioctl, |
289 | .listen = sock_no_listen, | 289 | .listen = sock_no_listen, |
290 | .shutdown = sock_no_shutdown, | 290 | .shutdown = sock_no_shutdown, |
@@ -304,7 +304,7 @@ static const struct proto_ops rawsock_raw_ops = { | |||
304 | .socketpair = sock_no_socketpair, | 304 | .socketpair = sock_no_socketpair, |
305 | .accept = sock_no_accept, | 305 | .accept = sock_no_accept, |
306 | .getname = sock_no_getname, | 306 | .getname = sock_no_getname, |
307 | .poll_mask = datagram_poll_mask, | 307 | .poll = datagram_poll, |
308 | .ioctl = sock_no_ioctl, | 308 | .ioctl = sock_no_ioctl, |
309 | .listen = sock_no_listen, | 309 | .listen = sock_no_listen, |
310 | .shutdown = sock_no_shutdown, | 310 | .shutdown = sock_no_shutdown, |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 50809748c127..57634bc3da74 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -2262,6 +2262,13 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, | |||
2262 | if (po->stats.stats1.tp_drops) | 2262 | if (po->stats.stats1.tp_drops) |
2263 | status |= TP_STATUS_LOSING; | 2263 | status |= TP_STATUS_LOSING; |
2264 | } | 2264 | } |
2265 | |||
2266 | if (do_vnet && | ||
2267 | virtio_net_hdr_from_skb(skb, h.raw + macoff - | ||
2268 | sizeof(struct virtio_net_hdr), | ||
2269 | vio_le(), true, 0)) | ||
2270 | goto drop_n_account; | ||
2271 | |||
2265 | po->stats.stats1.tp_packets++; | 2272 | po->stats.stats1.tp_packets++; |
2266 | if (copy_skb) { | 2273 | if (copy_skb) { |
2267 | status |= TP_STATUS_COPY; | 2274 | status |= TP_STATUS_COPY; |
@@ -2269,15 +2276,6 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, | |||
2269 | } | 2276 | } |
2270 | spin_unlock(&sk->sk_receive_queue.lock); | 2277 | spin_unlock(&sk->sk_receive_queue.lock); |
2271 | 2278 | ||
2272 | if (do_vnet) { | ||
2273 | if (virtio_net_hdr_from_skb(skb, h.raw + macoff - | ||
2274 | sizeof(struct virtio_net_hdr), | ||
2275 | vio_le(), true, 0)) { | ||
2276 | spin_lock(&sk->sk_receive_queue.lock); | ||
2277 | goto drop_n_account; | ||
2278 | } | ||
2279 | } | ||
2280 | |||
2281 | skb_copy_bits(skb, 0, h.raw + macoff, snaplen); | 2279 | skb_copy_bits(skb, 0, h.raw + macoff, snaplen); |
2282 | 2280 | ||
2283 | if (!(ts_status = tpacket_get_timestamp(skb, &ts, po->tp_tstamp))) | 2281 | if (!(ts_status = tpacket_get_timestamp(skb, &ts, po->tp_tstamp))) |
@@ -4078,11 +4076,12 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd, | |||
4078 | return 0; | 4076 | return 0; |
4079 | } | 4077 | } |
4080 | 4078 | ||
4081 | static __poll_t packet_poll_mask(struct socket *sock, __poll_t events) | 4079 | static __poll_t packet_poll(struct file *file, struct socket *sock, |
4080 | poll_table *wait) | ||
4082 | { | 4081 | { |
4083 | struct sock *sk = sock->sk; | 4082 | struct sock *sk = sock->sk; |
4084 | struct packet_sock *po = pkt_sk(sk); | 4083 | struct packet_sock *po = pkt_sk(sk); |
4085 | __poll_t mask = datagram_poll_mask(sock, events); | 4084 | __poll_t mask = datagram_poll(file, sock, wait); |
4086 | 4085 | ||
4087 | spin_lock_bh(&sk->sk_receive_queue.lock); | 4086 | spin_lock_bh(&sk->sk_receive_queue.lock); |
4088 | if (po->rx_ring.pg_vec) { | 4087 | if (po->rx_ring.pg_vec) { |
@@ -4424,7 +4423,7 @@ static const struct proto_ops packet_ops_spkt = { | |||
4424 | .socketpair = sock_no_socketpair, | 4423 | .socketpair = sock_no_socketpair, |
4425 | .accept = sock_no_accept, | 4424 | .accept = sock_no_accept, |
4426 | .getname = packet_getname_spkt, | 4425 | .getname = packet_getname_spkt, |
4427 | .poll_mask = datagram_poll_mask, | 4426 | .poll = datagram_poll, |
4428 | .ioctl = packet_ioctl, | 4427 | .ioctl = packet_ioctl, |
4429 | .listen = sock_no_listen, | 4428 | .listen = sock_no_listen, |
4430 | .shutdown = sock_no_shutdown, | 4429 | .shutdown = sock_no_shutdown, |
@@ -4445,7 +4444,7 @@ static const struct proto_ops packet_ops = { | |||
4445 | .socketpair = sock_no_socketpair, | 4444 | .socketpair = sock_no_socketpair, |
4446 | .accept = sock_no_accept, | 4445 | .accept = sock_no_accept, |
4447 | .getname = packet_getname, | 4446 | .getname = packet_getname, |
4448 | .poll_mask = packet_poll_mask, | 4447 | .poll = packet_poll, |
4449 | .ioctl = packet_ioctl, | 4448 | .ioctl = packet_ioctl, |
4450 | .listen = sock_no_listen, | 4449 | .listen = sock_no_listen, |
4451 | .shutdown = sock_no_shutdown, | 4450 | .shutdown = sock_no_shutdown, |
diff --git a/net/phonet/socket.c b/net/phonet/socket.c index c295c4e20f01..30187990257f 100644 --- a/net/phonet/socket.c +++ b/net/phonet/socket.c | |||
@@ -340,12 +340,15 @@ static int pn_socket_getname(struct socket *sock, struct sockaddr *addr, | |||
340 | return sizeof(struct sockaddr_pn); | 340 | return sizeof(struct sockaddr_pn); |
341 | } | 341 | } |
342 | 342 | ||
343 | static __poll_t pn_socket_poll_mask(struct socket *sock, __poll_t events) | 343 | static __poll_t pn_socket_poll(struct file *file, struct socket *sock, |
344 | poll_table *wait) | ||
344 | { | 345 | { |
345 | struct sock *sk = sock->sk; | 346 | struct sock *sk = sock->sk; |
346 | struct pep_sock *pn = pep_sk(sk); | 347 | struct pep_sock *pn = pep_sk(sk); |
347 | __poll_t mask = 0; | 348 | __poll_t mask = 0; |
348 | 349 | ||
350 | poll_wait(file, sk_sleep(sk), wait); | ||
351 | |||
349 | if (sk->sk_state == TCP_CLOSE) | 352 | if (sk->sk_state == TCP_CLOSE) |
350 | return EPOLLERR; | 353 | return EPOLLERR; |
351 | if (!skb_queue_empty(&sk->sk_receive_queue)) | 354 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
@@ -445,7 +448,7 @@ const struct proto_ops phonet_dgram_ops = { | |||
445 | .socketpair = sock_no_socketpair, | 448 | .socketpair = sock_no_socketpair, |
446 | .accept = sock_no_accept, | 449 | .accept = sock_no_accept, |
447 | .getname = pn_socket_getname, | 450 | .getname = pn_socket_getname, |
448 | .poll_mask = datagram_poll_mask, | 451 | .poll = datagram_poll, |
449 | .ioctl = pn_socket_ioctl, | 452 | .ioctl = pn_socket_ioctl, |
450 | .listen = sock_no_listen, | 453 | .listen = sock_no_listen, |
451 | .shutdown = sock_no_shutdown, | 454 | .shutdown = sock_no_shutdown, |
@@ -470,7 +473,7 @@ const struct proto_ops phonet_stream_ops = { | |||
470 | .socketpair = sock_no_socketpair, | 473 | .socketpair = sock_no_socketpair, |
471 | .accept = pn_socket_accept, | 474 | .accept = pn_socket_accept, |
472 | .getname = pn_socket_getname, | 475 | .getname = pn_socket_getname, |
473 | .poll_mask = pn_socket_poll_mask, | 476 | .poll = pn_socket_poll, |
474 | .ioctl = pn_socket_ioctl, | 477 | .ioctl = pn_socket_ioctl, |
475 | .listen = pn_socket_listen, | 478 | .listen = pn_socket_listen, |
476 | .shutdown = sock_no_shutdown, | 479 | .shutdown = sock_no_shutdown, |
diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c index 1b5025ea5b04..2aa07b547b16 100644 --- a/net/qrtr/qrtr.c +++ b/net/qrtr/qrtr.c | |||
@@ -1023,7 +1023,7 @@ static const struct proto_ops qrtr_proto_ops = { | |||
1023 | .recvmsg = qrtr_recvmsg, | 1023 | .recvmsg = qrtr_recvmsg, |
1024 | .getname = qrtr_getname, | 1024 | .getname = qrtr_getname, |
1025 | .ioctl = qrtr_ioctl, | 1025 | .ioctl = qrtr_ioctl, |
1026 | .poll_mask = datagram_poll_mask, | 1026 | .poll = datagram_poll, |
1027 | .shutdown = sock_no_shutdown, | 1027 | .shutdown = sock_no_shutdown, |
1028 | .setsockopt = sock_no_setsockopt, | 1028 | .setsockopt = sock_no_setsockopt, |
1029 | .getsockopt = sock_no_getsockopt, | 1029 | .getsockopt = sock_no_getsockopt, |
diff --git a/net/rds/connection.c b/net/rds/connection.c index abef75da89a7..cfb05953b0e5 100644 --- a/net/rds/connection.c +++ b/net/rds/connection.c | |||
@@ -659,11 +659,19 @@ static void rds_conn_info(struct socket *sock, unsigned int len, | |||
659 | 659 | ||
660 | int rds_conn_init(void) | 660 | int rds_conn_init(void) |
661 | { | 661 | { |
662 | int ret; | ||
663 | |||
664 | ret = rds_loop_net_init(); /* register pernet callback */ | ||
665 | if (ret) | ||
666 | return ret; | ||
667 | |||
662 | rds_conn_slab = kmem_cache_create("rds_connection", | 668 | rds_conn_slab = kmem_cache_create("rds_connection", |
663 | sizeof(struct rds_connection), | 669 | sizeof(struct rds_connection), |
664 | 0, 0, NULL); | 670 | 0, 0, NULL); |
665 | if (!rds_conn_slab) | 671 | if (!rds_conn_slab) { |
672 | rds_loop_net_exit(); | ||
666 | return -ENOMEM; | 673 | return -ENOMEM; |
674 | } | ||
667 | 675 | ||
668 | rds_info_register_func(RDS_INFO_CONNECTIONS, rds_conn_info); | 676 | rds_info_register_func(RDS_INFO_CONNECTIONS, rds_conn_info); |
669 | rds_info_register_func(RDS_INFO_SEND_MESSAGES, | 677 | rds_info_register_func(RDS_INFO_SEND_MESSAGES, |
@@ -676,6 +684,7 @@ int rds_conn_init(void) | |||
676 | 684 | ||
677 | void rds_conn_exit(void) | 685 | void rds_conn_exit(void) |
678 | { | 686 | { |
687 | rds_loop_net_exit(); /* unregister pernet callback */ | ||
679 | rds_loop_exit(); | 688 | rds_loop_exit(); |
680 | 689 | ||
681 | WARN_ON(!hlist_empty(rds_conn_hash)); | 690 | WARN_ON(!hlist_empty(rds_conn_hash)); |
diff --git a/net/rds/loop.c b/net/rds/loop.c index dac6218a460e..feea1f96ee2a 100644 --- a/net/rds/loop.c +++ b/net/rds/loop.c | |||
@@ -33,6 +33,8 @@ | |||
33 | #include <linux/kernel.h> | 33 | #include <linux/kernel.h> |
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <linux/in.h> | 35 | #include <linux/in.h> |
36 | #include <net/net_namespace.h> | ||
37 | #include <net/netns/generic.h> | ||
36 | 38 | ||
37 | #include "rds_single_path.h" | 39 | #include "rds_single_path.h" |
38 | #include "rds.h" | 40 | #include "rds.h" |
@@ -40,6 +42,17 @@ | |||
40 | 42 | ||
41 | static DEFINE_SPINLOCK(loop_conns_lock); | 43 | static DEFINE_SPINLOCK(loop_conns_lock); |
42 | static LIST_HEAD(loop_conns); | 44 | static LIST_HEAD(loop_conns); |
45 | static atomic_t rds_loop_unloading = ATOMIC_INIT(0); | ||
46 | |||
47 | static void rds_loop_set_unloading(void) | ||
48 | { | ||
49 | atomic_set(&rds_loop_unloading, 1); | ||
50 | } | ||
51 | |||
52 | static bool rds_loop_is_unloading(struct rds_connection *conn) | ||
53 | { | ||
54 | return atomic_read(&rds_loop_unloading) != 0; | ||
55 | } | ||
43 | 56 | ||
44 | /* | 57 | /* |
45 | * This 'loopback' transport is a special case for flows that originate | 58 | * This 'loopback' transport is a special case for flows that originate |
@@ -165,6 +178,8 @@ void rds_loop_exit(void) | |||
165 | struct rds_loop_connection *lc, *_lc; | 178 | struct rds_loop_connection *lc, *_lc; |
166 | LIST_HEAD(tmp_list); | 179 | LIST_HEAD(tmp_list); |
167 | 180 | ||
181 | rds_loop_set_unloading(); | ||
182 | synchronize_rcu(); | ||
168 | /* avoid calling conn_destroy with irqs off */ | 183 | /* avoid calling conn_destroy with irqs off */ |
169 | spin_lock_irq(&loop_conns_lock); | 184 | spin_lock_irq(&loop_conns_lock); |
170 | list_splice(&loop_conns, &tmp_list); | 185 | list_splice(&loop_conns, &tmp_list); |
@@ -177,6 +192,46 @@ void rds_loop_exit(void) | |||
177 | } | 192 | } |
178 | } | 193 | } |
179 | 194 | ||
195 | static void rds_loop_kill_conns(struct net *net) | ||
196 | { | ||
197 | struct rds_loop_connection *lc, *_lc; | ||
198 | LIST_HEAD(tmp_list); | ||
199 | |||
200 | spin_lock_irq(&loop_conns_lock); | ||
201 | list_for_each_entry_safe(lc, _lc, &loop_conns, loop_node) { | ||
202 | struct net *c_net = read_pnet(&lc->conn->c_net); | ||
203 | |||
204 | if (net != c_net) | ||
205 | continue; | ||
206 | list_move_tail(&lc->loop_node, &tmp_list); | ||
207 | } | ||
208 | spin_unlock_irq(&loop_conns_lock); | ||
209 | |||
210 | list_for_each_entry_safe(lc, _lc, &tmp_list, loop_node) { | ||
211 | WARN_ON(lc->conn->c_passive); | ||
212 | rds_conn_destroy(lc->conn); | ||
213 | } | ||
214 | } | ||
215 | |||
216 | static void __net_exit rds_loop_exit_net(struct net *net) | ||
217 | { | ||
218 | rds_loop_kill_conns(net); | ||
219 | } | ||
220 | |||
221 | static struct pernet_operations rds_loop_net_ops = { | ||
222 | .exit = rds_loop_exit_net, | ||
223 | }; | ||
224 | |||
225 | int rds_loop_net_init(void) | ||
226 | { | ||
227 | return register_pernet_device(&rds_loop_net_ops); | ||
228 | } | ||
229 | |||
230 | void rds_loop_net_exit(void) | ||
231 | { | ||
232 | unregister_pernet_device(&rds_loop_net_ops); | ||
233 | } | ||
234 | |||
180 | /* | 235 | /* |
181 | * This is missing .xmit_* because loop doesn't go through generic | 236 | * This is missing .xmit_* because loop doesn't go through generic |
182 | * rds_send_xmit() and doesn't call rds_recv_incoming(). .listen_stop and | 237 | * rds_send_xmit() and doesn't call rds_recv_incoming(). .listen_stop and |
@@ -194,4 +249,5 @@ struct rds_transport rds_loop_transport = { | |||
194 | .inc_free = rds_loop_inc_free, | 249 | .inc_free = rds_loop_inc_free, |
195 | .t_name = "loopback", | 250 | .t_name = "loopback", |
196 | .t_type = RDS_TRANS_LOOP, | 251 | .t_type = RDS_TRANS_LOOP, |
252 | .t_unloading = rds_loop_is_unloading, | ||
197 | }; | 253 | }; |
diff --git a/net/rds/loop.h b/net/rds/loop.h index 469fa4b2da4f..bbc8cdd030df 100644 --- a/net/rds/loop.h +++ b/net/rds/loop.h | |||
@@ -5,6 +5,8 @@ | |||
5 | /* loop.c */ | 5 | /* loop.c */ |
6 | extern struct rds_transport rds_loop_transport; | 6 | extern struct rds_transport rds_loop_transport; |
7 | 7 | ||
8 | int rds_loop_net_init(void); | ||
9 | void rds_loop_net_exit(void); | ||
8 | void rds_loop_exit(void); | 10 | void rds_loop_exit(void); |
9 | 11 | ||
10 | #endif | 12 | #endif |
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index ebe42e7eb456..d00a0ef39a56 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c | |||
@@ -1470,7 +1470,7 @@ static const struct proto_ops rose_proto_ops = { | |||
1470 | .socketpair = sock_no_socketpair, | 1470 | .socketpair = sock_no_socketpair, |
1471 | .accept = rose_accept, | 1471 | .accept = rose_accept, |
1472 | .getname = rose_getname, | 1472 | .getname = rose_getname, |
1473 | .poll_mask = datagram_poll_mask, | 1473 | .poll = datagram_poll, |
1474 | .ioctl = rose_ioctl, | 1474 | .ioctl = rose_ioctl, |
1475 | .listen = rose_listen, | 1475 | .listen = rose_listen, |
1476 | .shutdown = sock_no_shutdown, | 1476 | .shutdown = sock_no_shutdown, |
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index 3b1ac93efee2..2b463047dd7b 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c | |||
@@ -734,11 +734,15 @@ static int rxrpc_getsockopt(struct socket *sock, int level, int optname, | |||
734 | /* | 734 | /* |
735 | * permit an RxRPC socket to be polled | 735 | * permit an RxRPC socket to be polled |
736 | */ | 736 | */ |
737 | static __poll_t rxrpc_poll_mask(struct socket *sock, __poll_t events) | 737 | static __poll_t rxrpc_poll(struct file *file, struct socket *sock, |
738 | poll_table *wait) | ||
738 | { | 739 | { |
739 | struct sock *sk = sock->sk; | 740 | struct sock *sk = sock->sk; |
740 | struct rxrpc_sock *rx = rxrpc_sk(sk); | 741 | struct rxrpc_sock *rx = rxrpc_sk(sk); |
741 | __poll_t mask = 0; | 742 | __poll_t mask; |
743 | |||
744 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
745 | mask = 0; | ||
742 | 746 | ||
743 | /* the socket is readable if there are any messages waiting on the Rx | 747 | /* the socket is readable if there are any messages waiting on the Rx |
744 | * queue */ | 748 | * queue */ |
@@ -945,7 +949,7 @@ static const struct proto_ops rxrpc_rpc_ops = { | |||
945 | .socketpair = sock_no_socketpair, | 949 | .socketpair = sock_no_socketpair, |
946 | .accept = sock_no_accept, | 950 | .accept = sock_no_accept, |
947 | .getname = sock_no_getname, | 951 | .getname = sock_no_getname, |
948 | .poll_mask = rxrpc_poll_mask, | 952 | .poll = rxrpc_poll, |
949 | .ioctl = sock_no_ioctl, | 953 | .ioctl = sock_no_ioctl, |
950 | .listen = rxrpc_listen, | 954 | .listen = rxrpc_listen, |
951 | .shutdown = rxrpc_shutdown, | 955 | .shutdown = rxrpc_shutdown, |
diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c index 8527cfdc446d..20d7d36b2fc9 100644 --- a/net/sched/act_ife.c +++ b/net/sched/act_ife.c | |||
@@ -415,7 +415,8 @@ static void tcf_ife_cleanup(struct tc_action *a) | |||
415 | spin_unlock_bh(&ife->tcf_lock); | 415 | spin_unlock_bh(&ife->tcf_lock); |
416 | 416 | ||
417 | p = rcu_dereference_protected(ife->params, 1); | 417 | p = rcu_dereference_protected(ife->params, 1); |
418 | kfree_rcu(p, rcu); | 418 | if (p) |
419 | kfree_rcu(p, rcu); | ||
419 | } | 420 | } |
420 | 421 | ||
421 | /* under ife->tcf_lock for existing action */ | 422 | /* under ife->tcf_lock for existing action */ |
@@ -516,8 +517,6 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla, | |||
516 | saddr = nla_data(tb[TCA_IFE_SMAC]); | 517 | saddr = nla_data(tb[TCA_IFE_SMAC]); |
517 | } | 518 | } |
518 | 519 | ||
519 | ife->tcf_action = parm->action; | ||
520 | |||
521 | if (parm->flags & IFE_ENCODE) { | 520 | if (parm->flags & IFE_ENCODE) { |
522 | if (daddr) | 521 | if (daddr) |
523 | ether_addr_copy(p->eth_dst, daddr); | 522 | ether_addr_copy(p->eth_dst, daddr); |
@@ -543,10 +542,8 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla, | |||
543 | NULL, NULL); | 542 | NULL, NULL); |
544 | if (err) { | 543 | if (err) { |
545 | metadata_parse_err: | 544 | metadata_parse_err: |
546 | if (exists) | ||
547 | tcf_idr_release(*a, bind); | ||
548 | if (ret == ACT_P_CREATED) | 545 | if (ret == ACT_P_CREATED) |
549 | _tcf_ife_cleanup(*a); | 546 | tcf_idr_release(*a, bind); |
550 | 547 | ||
551 | if (exists) | 548 | if (exists) |
552 | spin_unlock_bh(&ife->tcf_lock); | 549 | spin_unlock_bh(&ife->tcf_lock); |
@@ -567,7 +564,7 @@ metadata_parse_err: | |||
567 | err = use_all_metadata(ife); | 564 | err = use_all_metadata(ife); |
568 | if (err) { | 565 | if (err) { |
569 | if (ret == ACT_P_CREATED) | 566 | if (ret == ACT_P_CREATED) |
570 | _tcf_ife_cleanup(*a); | 567 | tcf_idr_release(*a, bind); |
571 | 568 | ||
572 | if (exists) | 569 | if (exists) |
573 | spin_unlock_bh(&ife->tcf_lock); | 570 | spin_unlock_bh(&ife->tcf_lock); |
@@ -576,6 +573,7 @@ metadata_parse_err: | |||
576 | } | 573 | } |
577 | } | 574 | } |
578 | 575 | ||
576 | ife->tcf_action = parm->action; | ||
579 | if (exists) | 577 | if (exists) |
580 | spin_unlock_bh(&ife->tcf_lock); | 578 | spin_unlock_bh(&ife->tcf_lock); |
581 | 579 | ||
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c index 2b5be42a9f1c..9e8b26a80fb3 100644 --- a/net/sched/cls_flower.c +++ b/net/sched/cls_flower.c | |||
@@ -66,7 +66,7 @@ struct fl_flow_mask { | |||
66 | struct rhashtable_params filter_ht_params; | 66 | struct rhashtable_params filter_ht_params; |
67 | struct flow_dissector dissector; | 67 | struct flow_dissector dissector; |
68 | struct list_head filters; | 68 | struct list_head filters; |
69 | struct rcu_head rcu; | 69 | struct rcu_work rwork; |
70 | struct list_head list; | 70 | struct list_head list; |
71 | }; | 71 | }; |
72 | 72 | ||
@@ -203,6 +203,20 @@ static int fl_init(struct tcf_proto *tp) | |||
203 | return rhashtable_init(&head->ht, &mask_ht_params); | 203 | return rhashtable_init(&head->ht, &mask_ht_params); |
204 | } | 204 | } |
205 | 205 | ||
206 | static void fl_mask_free(struct fl_flow_mask *mask) | ||
207 | { | ||
208 | rhashtable_destroy(&mask->ht); | ||
209 | kfree(mask); | ||
210 | } | ||
211 | |||
212 | static void fl_mask_free_work(struct work_struct *work) | ||
213 | { | ||
214 | struct fl_flow_mask *mask = container_of(to_rcu_work(work), | ||
215 | struct fl_flow_mask, rwork); | ||
216 | |||
217 | fl_mask_free(mask); | ||
218 | } | ||
219 | |||
206 | static bool fl_mask_put(struct cls_fl_head *head, struct fl_flow_mask *mask, | 220 | static bool fl_mask_put(struct cls_fl_head *head, struct fl_flow_mask *mask, |
207 | bool async) | 221 | bool async) |
208 | { | 222 | { |
@@ -210,12 +224,11 @@ static bool fl_mask_put(struct cls_fl_head *head, struct fl_flow_mask *mask, | |||
210 | return false; | 224 | return false; |
211 | 225 | ||
212 | rhashtable_remove_fast(&head->ht, &mask->ht_node, mask_ht_params); | 226 | rhashtable_remove_fast(&head->ht, &mask->ht_node, mask_ht_params); |
213 | rhashtable_destroy(&mask->ht); | ||
214 | list_del_rcu(&mask->list); | 227 | list_del_rcu(&mask->list); |
215 | if (async) | 228 | if (async) |
216 | kfree_rcu(mask, rcu); | 229 | tcf_queue_work(&mask->rwork, fl_mask_free_work); |
217 | else | 230 | else |
218 | kfree(mask); | 231 | fl_mask_free(mask); |
219 | 232 | ||
220 | return true; | 233 | return true; |
221 | } | 234 | } |
diff --git a/net/sched/sch_blackhole.c b/net/sched/sch_blackhole.c index c98a61e980ba..9c4c2bb547d7 100644 --- a/net/sched/sch_blackhole.c +++ b/net/sched/sch_blackhole.c | |||
@@ -21,7 +21,7 @@ static int blackhole_enqueue(struct sk_buff *skb, struct Qdisc *sch, | |||
21 | struct sk_buff **to_free) | 21 | struct sk_buff **to_free) |
22 | { | 22 | { |
23 | qdisc_drop(skb, sch, to_free); | 23 | qdisc_drop(skb, sch, to_free); |
24 | return NET_XMIT_SUCCESS; | 24 | return NET_XMIT_SUCCESS | __NET_XMIT_BYPASS; |
25 | } | 25 | } |
26 | 26 | ||
27 | static struct sk_buff *blackhole_dequeue(struct Qdisc *sch) | 27 | static struct sk_buff *blackhole_dequeue(struct Qdisc *sch) |
diff --git a/net/sched/sch_hfsc.c b/net/sched/sch_hfsc.c index 3ae9877ea205..3278a76f6861 100644 --- a/net/sched/sch_hfsc.c +++ b/net/sched/sch_hfsc.c | |||
@@ -1385,8 +1385,8 @@ hfsc_schedule_watchdog(struct Qdisc *sch) | |||
1385 | if (next_time == 0 || next_time > q->root.cl_cfmin) | 1385 | if (next_time == 0 || next_time > q->root.cl_cfmin) |
1386 | next_time = q->root.cl_cfmin; | 1386 | next_time = q->root.cl_cfmin; |
1387 | } | 1387 | } |
1388 | WARN_ON(next_time == 0); | 1388 | if (next_time) |
1389 | qdisc_watchdog_schedule(&q->watchdog, next_time); | 1389 | qdisc_watchdog_schedule(&q->watchdog, next_time); |
1390 | } | 1390 | } |
1391 | 1391 | ||
1392 | static int | 1392 | static int |
diff --git a/net/sctp/chunk.c b/net/sctp/chunk.c index 79daa98208c3..bfb9f812e2ef 100644 --- a/net/sctp/chunk.c +++ b/net/sctp/chunk.c | |||
@@ -237,7 +237,9 @@ struct sctp_datamsg *sctp_datamsg_from_user(struct sctp_association *asoc, | |||
237 | /* Account for a different sized first fragment */ | 237 | /* Account for a different sized first fragment */ |
238 | if (msg_len >= first_len) { | 238 | if (msg_len >= first_len) { |
239 | msg->can_delay = 0; | 239 | msg->can_delay = 0; |
240 | SCTP_INC_STATS(sock_net(asoc->base.sk), SCTP_MIB_FRAGUSRMSGS); | 240 | if (msg_len > first_len) |
241 | SCTP_INC_STATS(sock_net(asoc->base.sk), | ||
242 | SCTP_MIB_FRAGUSRMSGS); | ||
241 | } else { | 243 | } else { |
242 | /* Which may be the only one... */ | 244 | /* Which may be the only one... */ |
243 | first_len = msg_len; | 245 | first_len = msg_len; |
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index 7339918a805d..0cd2e764f47f 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -1010,7 +1010,7 @@ static const struct proto_ops inet6_seqpacket_ops = { | |||
1010 | .socketpair = sock_no_socketpair, | 1010 | .socketpair = sock_no_socketpair, |
1011 | .accept = inet_accept, | 1011 | .accept = inet_accept, |
1012 | .getname = sctp_getname, | 1012 | .getname = sctp_getname, |
1013 | .poll_mask = sctp_poll_mask, | 1013 | .poll = sctp_poll, |
1014 | .ioctl = inet6_ioctl, | 1014 | .ioctl = inet6_ioctl, |
1015 | .listen = sctp_inet_listen, | 1015 | .listen = sctp_inet_listen, |
1016 | .shutdown = inet_shutdown, | 1016 | .shutdown = inet_shutdown, |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 5dffbc493008..67f73d3a1356 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -1016,7 +1016,7 @@ static const struct proto_ops inet_seqpacket_ops = { | |||
1016 | .socketpair = sock_no_socketpair, | 1016 | .socketpair = sock_no_socketpair, |
1017 | .accept = inet_accept, | 1017 | .accept = inet_accept, |
1018 | .getname = inet_getname, /* Semantics are different. */ | 1018 | .getname = inet_getname, /* Semantics are different. */ |
1019 | .poll_mask = sctp_poll_mask, | 1019 | .poll = sctp_poll, |
1020 | .ioctl = inet_ioctl, | 1020 | .ioctl = inet_ioctl, |
1021 | .listen = sctp_inet_listen, | 1021 | .listen = sctp_inet_listen, |
1022 | .shutdown = inet_shutdown, /* Looks harmless. */ | 1022 | .shutdown = inet_shutdown, /* Looks harmless. */ |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index d20f7addee19..ce620e878538 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -7717,12 +7717,14 @@ out: | |||
7717 | * here, again, by modeling the current TCP/UDP code. We don't have | 7717 | * here, again, by modeling the current TCP/UDP code. We don't have |
7718 | * a good way to test with it yet. | 7718 | * a good way to test with it yet. |
7719 | */ | 7719 | */ |
7720 | __poll_t sctp_poll_mask(struct socket *sock, __poll_t events) | 7720 | __poll_t sctp_poll(struct file *file, struct socket *sock, poll_table *wait) |
7721 | { | 7721 | { |
7722 | struct sock *sk = sock->sk; | 7722 | struct sock *sk = sock->sk; |
7723 | struct sctp_sock *sp = sctp_sk(sk); | 7723 | struct sctp_sock *sp = sctp_sk(sk); |
7724 | __poll_t mask; | 7724 | __poll_t mask; |
7725 | 7725 | ||
7726 | poll_wait(file, sk_sleep(sk), wait); | ||
7727 | |||
7726 | sock_rps_record_flow(sk); | 7728 | sock_rps_record_flow(sk); |
7727 | 7729 | ||
7728 | /* A TCP-style listening socket becomes readable when the accept queue | 7730 | /* A TCP-style listening socket becomes readable when the accept queue |
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index da7f02edcd37..3c1405df936c 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c | |||
@@ -45,6 +45,7 @@ static DEFINE_MUTEX(smc_create_lgr_pending); /* serialize link group | |||
45 | */ | 45 | */ |
46 | 46 | ||
47 | static void smc_tcp_listen_work(struct work_struct *); | 47 | static void smc_tcp_listen_work(struct work_struct *); |
48 | static void smc_connect_work(struct work_struct *); | ||
48 | 49 | ||
49 | static void smc_set_keepalive(struct sock *sk, int val) | 50 | static void smc_set_keepalive(struct sock *sk, int val) |
50 | { | 51 | { |
@@ -122,6 +123,12 @@ static int smc_release(struct socket *sock) | |||
122 | goto out; | 123 | goto out; |
123 | 124 | ||
124 | smc = smc_sk(sk); | 125 | smc = smc_sk(sk); |
126 | |||
127 | /* cleanup for a dangling non-blocking connect */ | ||
128 | flush_work(&smc->connect_work); | ||
129 | kfree(smc->connect_info); | ||
130 | smc->connect_info = NULL; | ||
131 | |||
125 | if (sk->sk_state == SMC_LISTEN) | 132 | if (sk->sk_state == SMC_LISTEN) |
126 | /* smc_close_non_accepted() is called and acquires | 133 | /* smc_close_non_accepted() is called and acquires |
127 | * sock lock for child sockets again | 134 | * sock lock for child sockets again |
@@ -186,6 +193,7 @@ static struct sock *smc_sock_alloc(struct net *net, struct socket *sock, | |||
186 | sk->sk_protocol = protocol; | 193 | sk->sk_protocol = protocol; |
187 | smc = smc_sk(sk); | 194 | smc = smc_sk(sk); |
188 | INIT_WORK(&smc->tcp_listen_work, smc_tcp_listen_work); | 195 | INIT_WORK(&smc->tcp_listen_work, smc_tcp_listen_work); |
196 | INIT_WORK(&smc->connect_work, smc_connect_work); | ||
189 | INIT_DELAYED_WORK(&smc->conn.tx_work, smc_tx_work); | 197 | INIT_DELAYED_WORK(&smc->conn.tx_work, smc_tx_work); |
190 | INIT_LIST_HEAD(&smc->accept_q); | 198 | INIT_LIST_HEAD(&smc->accept_q); |
191 | spin_lock_init(&smc->accept_q_lock); | 199 | spin_lock_init(&smc->accept_q_lock); |
@@ -576,6 +584,35 @@ static int __smc_connect(struct smc_sock *smc) | |||
576 | return 0; | 584 | return 0; |
577 | } | 585 | } |
578 | 586 | ||
587 | static void smc_connect_work(struct work_struct *work) | ||
588 | { | ||
589 | struct smc_sock *smc = container_of(work, struct smc_sock, | ||
590 | connect_work); | ||
591 | int rc; | ||
592 | |||
593 | lock_sock(&smc->sk); | ||
594 | rc = kernel_connect(smc->clcsock, &smc->connect_info->addr, | ||
595 | smc->connect_info->alen, smc->connect_info->flags); | ||
596 | if (smc->clcsock->sk->sk_err) { | ||
597 | smc->sk.sk_err = smc->clcsock->sk->sk_err; | ||
598 | goto out; | ||
599 | } | ||
600 | if (rc < 0) { | ||
601 | smc->sk.sk_err = -rc; | ||
602 | goto out; | ||
603 | } | ||
604 | |||
605 | rc = __smc_connect(smc); | ||
606 | if (rc < 0) | ||
607 | smc->sk.sk_err = -rc; | ||
608 | |||
609 | out: | ||
610 | smc->sk.sk_state_change(&smc->sk); | ||
611 | kfree(smc->connect_info); | ||
612 | smc->connect_info = NULL; | ||
613 | release_sock(&smc->sk); | ||
614 | } | ||
615 | |||
579 | static int smc_connect(struct socket *sock, struct sockaddr *addr, | 616 | static int smc_connect(struct socket *sock, struct sockaddr *addr, |
580 | int alen, int flags) | 617 | int alen, int flags) |
581 | { | 618 | { |
@@ -605,15 +642,32 @@ static int smc_connect(struct socket *sock, struct sockaddr *addr, | |||
605 | 642 | ||
606 | smc_copy_sock_settings_to_clc(smc); | 643 | smc_copy_sock_settings_to_clc(smc); |
607 | tcp_sk(smc->clcsock->sk)->syn_smc = 1; | 644 | tcp_sk(smc->clcsock->sk)->syn_smc = 1; |
608 | rc = kernel_connect(smc->clcsock, addr, alen, flags); | 645 | if (flags & O_NONBLOCK) { |
609 | if (rc) | 646 | if (smc->connect_info) { |
610 | goto out; | 647 | rc = -EALREADY; |
648 | goto out; | ||
649 | } | ||
650 | smc->connect_info = kzalloc(alen + 2 * sizeof(int), GFP_KERNEL); | ||
651 | if (!smc->connect_info) { | ||
652 | rc = -ENOMEM; | ||
653 | goto out; | ||
654 | } | ||
655 | smc->connect_info->alen = alen; | ||
656 | smc->connect_info->flags = flags ^ O_NONBLOCK; | ||
657 | memcpy(&smc->connect_info->addr, addr, alen); | ||
658 | schedule_work(&smc->connect_work); | ||
659 | rc = -EINPROGRESS; | ||
660 | } else { | ||
661 | rc = kernel_connect(smc->clcsock, addr, alen, flags); | ||
662 | if (rc) | ||
663 | goto out; | ||
611 | 664 | ||
612 | rc = __smc_connect(smc); | 665 | rc = __smc_connect(smc); |
613 | if (rc < 0) | 666 | if (rc < 0) |
614 | goto out; | 667 | goto out; |
615 | else | 668 | else |
616 | rc = 0; /* success cases including fallback */ | 669 | rc = 0; /* success cases including fallback */ |
670 | } | ||
617 | 671 | ||
618 | out: | 672 | out: |
619 | release_sock(sk); | 673 | release_sock(sk); |
@@ -1273,40 +1327,26 @@ static __poll_t smc_accept_poll(struct sock *parent) | |||
1273 | return mask; | 1327 | return mask; |
1274 | } | 1328 | } |
1275 | 1329 | ||
1276 | static __poll_t smc_poll_mask(struct socket *sock, __poll_t events) | 1330 | static __poll_t smc_poll(struct file *file, struct socket *sock, |
1331 | poll_table *wait) | ||
1277 | { | 1332 | { |
1278 | struct sock *sk = sock->sk; | 1333 | struct sock *sk = sock->sk; |
1279 | __poll_t mask = 0; | 1334 | __poll_t mask = 0; |
1280 | struct smc_sock *smc; | 1335 | struct smc_sock *smc; |
1281 | int rc; | ||
1282 | 1336 | ||
1283 | if (!sk) | 1337 | if (!sk) |
1284 | return EPOLLNVAL; | 1338 | return EPOLLNVAL; |
1285 | 1339 | ||
1286 | smc = smc_sk(sock->sk); | 1340 | smc = smc_sk(sock->sk); |
1287 | sock_hold(sk); | ||
1288 | lock_sock(sk); | ||
1289 | if ((sk->sk_state == SMC_INIT) || smc->use_fallback) { | 1341 | if ((sk->sk_state == SMC_INIT) || smc->use_fallback) { |
1290 | /* delegate to CLC child sock */ | 1342 | /* delegate to CLC child sock */ |
1291 | release_sock(sk); | 1343 | mask = smc->clcsock->ops->poll(file, smc->clcsock, wait); |
1292 | mask = smc->clcsock->ops->poll_mask(smc->clcsock, events); | ||
1293 | lock_sock(sk); | ||
1294 | sk->sk_err = smc->clcsock->sk->sk_err; | 1344 | sk->sk_err = smc->clcsock->sk->sk_err; |
1295 | if (sk->sk_err) { | 1345 | if (sk->sk_err) |
1296 | mask |= EPOLLERR; | 1346 | mask |= EPOLLERR; |
1297 | } else { | ||
1298 | /* if non-blocking connect finished ... */ | ||
1299 | if (sk->sk_state == SMC_INIT && | ||
1300 | mask & EPOLLOUT && | ||
1301 | smc->clcsock->sk->sk_state != TCP_CLOSE) { | ||
1302 | rc = __smc_connect(smc); | ||
1303 | if (rc < 0) | ||
1304 | mask |= EPOLLERR; | ||
1305 | /* success cases including fallback */ | ||
1306 | mask |= EPOLLOUT | EPOLLWRNORM; | ||
1307 | } | ||
1308 | } | ||
1309 | } else { | 1347 | } else { |
1348 | if (sk->sk_state != SMC_CLOSED) | ||
1349 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
1310 | if (sk->sk_err) | 1350 | if (sk->sk_err) |
1311 | mask |= EPOLLERR; | 1351 | mask |= EPOLLERR; |
1312 | if ((sk->sk_shutdown == SHUTDOWN_MASK) || | 1352 | if ((sk->sk_shutdown == SHUTDOWN_MASK) || |
@@ -1332,10 +1372,7 @@ static __poll_t smc_poll_mask(struct socket *sock, __poll_t events) | |||
1332 | } | 1372 | } |
1333 | if (smc->conn.urg_state == SMC_URG_VALID) | 1373 | if (smc->conn.urg_state == SMC_URG_VALID) |
1334 | mask |= EPOLLPRI; | 1374 | mask |= EPOLLPRI; |
1335 | |||
1336 | } | 1375 | } |
1337 | release_sock(sk); | ||
1338 | sock_put(sk); | ||
1339 | 1376 | ||
1340 | return mask; | 1377 | return mask; |
1341 | } | 1378 | } |
@@ -1619,7 +1656,7 @@ static const struct proto_ops smc_sock_ops = { | |||
1619 | .socketpair = sock_no_socketpair, | 1656 | .socketpair = sock_no_socketpair, |
1620 | .accept = smc_accept, | 1657 | .accept = smc_accept, |
1621 | .getname = smc_getname, | 1658 | .getname = smc_getname, |
1622 | .poll_mask = smc_poll_mask, | 1659 | .poll = smc_poll, |
1623 | .ioctl = smc_ioctl, | 1660 | .ioctl = smc_ioctl, |
1624 | .listen = smc_listen, | 1661 | .listen = smc_listen, |
1625 | .shutdown = smc_shutdown, | 1662 | .shutdown = smc_shutdown, |
diff --git a/net/smc/smc.h b/net/smc/smc.h index 51ae1f10d81a..d7ca26570482 100644 --- a/net/smc/smc.h +++ b/net/smc/smc.h | |||
@@ -187,11 +187,19 @@ struct smc_connection { | |||
187 | struct work_struct close_work; /* peer sent some closing */ | 187 | struct work_struct close_work; /* peer sent some closing */ |
188 | }; | 188 | }; |
189 | 189 | ||
190 | struct smc_connect_info { | ||
191 | int flags; | ||
192 | int alen; | ||
193 | struct sockaddr addr; | ||
194 | }; | ||
195 | |||
190 | struct smc_sock { /* smc sock container */ | 196 | struct smc_sock { /* smc sock container */ |
191 | struct sock sk; | 197 | struct sock sk; |
192 | struct socket *clcsock; /* internal tcp socket */ | 198 | struct socket *clcsock; /* internal tcp socket */ |
193 | struct smc_connection conn; /* smc connection */ | 199 | struct smc_connection conn; /* smc connection */ |
194 | struct smc_sock *listen_smc; /* listen parent */ | 200 | struct smc_sock *listen_smc; /* listen parent */ |
201 | struct smc_connect_info *connect_info; /* connect address & flags */ | ||
202 | struct work_struct connect_work; /* handle non-blocking connect*/ | ||
195 | struct work_struct tcp_listen_work;/* handle tcp socket accepts */ | 203 | struct work_struct tcp_listen_work;/* handle tcp socket accepts */ |
196 | struct work_struct smc_listen_work;/* prepare new accept socket */ | 204 | struct work_struct smc_listen_work;/* prepare new accept socket */ |
197 | struct list_head accept_q; /* sockets to be accepted */ | 205 | struct list_head accept_q; /* sockets to be accepted */ |
diff --git a/net/socket.c b/net/socket.c index 8a109012608a..85633622c94d 100644 --- a/net/socket.c +++ b/net/socket.c | |||
@@ -117,10 +117,8 @@ static ssize_t sock_write_iter(struct kiocb *iocb, struct iov_iter *from); | |||
117 | static int sock_mmap(struct file *file, struct vm_area_struct *vma); | 117 | static int sock_mmap(struct file *file, struct vm_area_struct *vma); |
118 | 118 | ||
119 | static int sock_close(struct inode *inode, struct file *file); | 119 | static int sock_close(struct inode *inode, struct file *file); |
120 | static struct wait_queue_head *sock_get_poll_head(struct file *file, | 120 | static __poll_t sock_poll(struct file *file, |
121 | __poll_t events); | 121 | struct poll_table_struct *wait); |
122 | static __poll_t sock_poll_mask(struct file *file, __poll_t); | ||
123 | static __poll_t sock_poll(struct file *file, struct poll_table_struct *wait); | ||
124 | static long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | 122 | static long sock_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
125 | #ifdef CONFIG_COMPAT | 123 | #ifdef CONFIG_COMPAT |
126 | static long compat_sock_ioctl(struct file *file, | 124 | static long compat_sock_ioctl(struct file *file, |
@@ -143,8 +141,6 @@ static const struct file_operations socket_file_ops = { | |||
143 | .llseek = no_llseek, | 141 | .llseek = no_llseek, |
144 | .read_iter = sock_read_iter, | 142 | .read_iter = sock_read_iter, |
145 | .write_iter = sock_write_iter, | 143 | .write_iter = sock_write_iter, |
146 | .get_poll_head = sock_get_poll_head, | ||
147 | .poll_mask = sock_poll_mask, | ||
148 | .poll = sock_poll, | 144 | .poll = sock_poll, |
149 | .unlocked_ioctl = sock_ioctl, | 145 | .unlocked_ioctl = sock_ioctl, |
150 | #ifdef CONFIG_COMPAT | 146 | #ifdef CONFIG_COMPAT |
@@ -1130,48 +1126,16 @@ out_release: | |||
1130 | } | 1126 | } |
1131 | EXPORT_SYMBOL(sock_create_lite); | 1127 | EXPORT_SYMBOL(sock_create_lite); |
1132 | 1128 | ||
1133 | static struct wait_queue_head *sock_get_poll_head(struct file *file, | ||
1134 | __poll_t events) | ||
1135 | { | ||
1136 | struct socket *sock = file->private_data; | ||
1137 | |||
1138 | if (!sock->ops->poll_mask) | ||
1139 | return NULL; | ||
1140 | sock_poll_busy_loop(sock, events); | ||
1141 | return sk_sleep(sock->sk); | ||
1142 | } | ||
1143 | |||
1144 | static __poll_t sock_poll_mask(struct file *file, __poll_t events) | ||
1145 | { | ||
1146 | struct socket *sock = file->private_data; | ||
1147 | |||
1148 | /* | ||
1149 | * We need to be sure we are in sync with the socket flags modification. | ||
1150 | * | ||
1151 | * This memory barrier is paired in the wq_has_sleeper. | ||
1152 | */ | ||
1153 | smp_mb(); | ||
1154 | |||
1155 | /* this socket can poll_ll so tell the system call */ | ||
1156 | return sock->ops->poll_mask(sock, events) | | ||
1157 | (sk_can_busy_loop(sock->sk) ? POLL_BUSY_LOOP : 0); | ||
1158 | } | ||
1159 | |||
1160 | /* No kernel lock held - perfect */ | 1129 | /* No kernel lock held - perfect */ |
1161 | static __poll_t sock_poll(struct file *file, poll_table *wait) | 1130 | static __poll_t sock_poll(struct file *file, poll_table *wait) |
1162 | { | 1131 | { |
1163 | struct socket *sock = file->private_data; | 1132 | struct socket *sock = file->private_data; |
1164 | __poll_t events = poll_requested_events(wait), mask = 0; | 1133 | __poll_t events = poll_requested_events(wait); |
1165 | |||
1166 | if (sock->ops->poll) { | ||
1167 | sock_poll_busy_loop(sock, events); | ||
1168 | mask = sock->ops->poll(file, sock, wait); | ||
1169 | } else if (sock->ops->poll_mask) { | ||
1170 | sock_poll_wait(file, sock_get_poll_head(file, events), wait); | ||
1171 | mask = sock->ops->poll_mask(sock, events); | ||
1172 | } | ||
1173 | 1134 | ||
1174 | return mask | sock_poll_busy_flag(sock); | 1135 | sock_poll_busy_loop(sock, events); |
1136 | if (!sock->ops->poll) | ||
1137 | return 0; | ||
1138 | return sock->ops->poll(file, sock, wait) | sock_poll_busy_flag(sock); | ||
1175 | } | 1139 | } |
1176 | 1140 | ||
1177 | static int sock_mmap(struct file *file, struct vm_area_struct *vma) | 1141 | static int sock_mmap(struct file *file, struct vm_area_struct *vma) |
diff --git a/net/strparser/strparser.c b/net/strparser/strparser.c index 1a9695183599..625acb27efcc 100644 --- a/net/strparser/strparser.c +++ b/net/strparser/strparser.c | |||
@@ -35,7 +35,6 @@ struct _strp_msg { | |||
35 | */ | 35 | */ |
36 | struct strp_msg strp; | 36 | struct strp_msg strp; |
37 | int accum_len; | 37 | int accum_len; |
38 | int early_eaten; | ||
39 | }; | 38 | }; |
40 | 39 | ||
41 | static inline struct _strp_msg *_strp_msg(struct sk_buff *skb) | 40 | static inline struct _strp_msg *_strp_msg(struct sk_buff *skb) |
@@ -115,20 +114,6 @@ static int __strp_recv(read_descriptor_t *desc, struct sk_buff *orig_skb, | |||
115 | head = strp->skb_head; | 114 | head = strp->skb_head; |
116 | if (head) { | 115 | if (head) { |
117 | /* Message already in progress */ | 116 | /* Message already in progress */ |
118 | |||
119 | stm = _strp_msg(head); | ||
120 | if (unlikely(stm->early_eaten)) { | ||
121 | /* Already some number of bytes on the receive sock | ||
122 | * data saved in skb_head, just indicate they | ||
123 | * are consumed. | ||
124 | */ | ||
125 | eaten = orig_len <= stm->early_eaten ? | ||
126 | orig_len : stm->early_eaten; | ||
127 | stm->early_eaten -= eaten; | ||
128 | |||
129 | return eaten; | ||
130 | } | ||
131 | |||
132 | if (unlikely(orig_offset)) { | 117 | if (unlikely(orig_offset)) { |
133 | /* Getting data with a non-zero offset when a message is | 118 | /* Getting data with a non-zero offset when a message is |
134 | * in progress is not expected. If it does happen, we | 119 | * in progress is not expected. If it does happen, we |
@@ -297,9 +282,9 @@ static int __strp_recv(read_descriptor_t *desc, struct sk_buff *orig_skb, | |||
297 | } | 282 | } |
298 | 283 | ||
299 | stm->accum_len += cand_len; | 284 | stm->accum_len += cand_len; |
285 | eaten += cand_len; | ||
300 | strp->need_bytes = stm->strp.full_len - | 286 | strp->need_bytes = stm->strp.full_len - |
301 | stm->accum_len; | 287 | stm->accum_len; |
302 | stm->early_eaten = cand_len; | ||
303 | STRP_STATS_ADD(strp->stats.bytes, cand_len); | 288 | STRP_STATS_ADD(strp->stats.bytes, cand_len); |
304 | desc->count = 0; /* Stop reading socket */ | 289 | desc->count = 0; /* Stop reading socket */ |
305 | break; | 290 | break; |
@@ -392,7 +377,7 @@ static int strp_read_sock(struct strparser *strp) | |||
392 | /* Lower sock lock held */ | 377 | /* Lower sock lock held */ |
393 | void strp_data_ready(struct strparser *strp) | 378 | void strp_data_ready(struct strparser *strp) |
394 | { | 379 | { |
395 | if (unlikely(strp->stopped)) | 380 | if (unlikely(strp->stopped) || strp->paused) |
396 | return; | 381 | return; |
397 | 382 | ||
398 | /* This check is needed to synchronize with do_strp_work. | 383 | /* This check is needed to synchronize with do_strp_work. |
@@ -407,9 +392,6 @@ void strp_data_ready(struct strparser *strp) | |||
407 | return; | 392 | return; |
408 | } | 393 | } |
409 | 394 | ||
410 | if (strp->paused) | ||
411 | return; | ||
412 | |||
413 | if (strp->need_bytes) { | 395 | if (strp->need_bytes) { |
414 | if (strp_peek_len(strp) < strp->need_bytes) | 396 | if (strp_peek_len(strp) < strp->need_bytes) |
415 | return; | 397 | return; |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 3c85af058227..3fabf9f6a0f9 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -987,8 +987,6 @@ bool xprt_prepare_transmit(struct rpc_task *task) | |||
987 | task->tk_status = -EAGAIN; | 987 | task->tk_status = -EAGAIN; |
988 | goto out_unlock; | 988 | goto out_unlock; |
989 | } | 989 | } |
990 | if (!bc_prealloc(req) && !req->rq_xmit_bytes_sent) | ||
991 | req->rq_xid = xprt_alloc_xid(xprt); | ||
992 | ret = true; | 990 | ret = true; |
993 | out_unlock: | 991 | out_unlock: |
994 | spin_unlock_bh(&xprt->transport_lock); | 992 | spin_unlock_bh(&xprt->transport_lock); |
@@ -1298,7 +1296,12 @@ void xprt_retry_reserve(struct rpc_task *task) | |||
1298 | 1296 | ||
1299 | static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt) | 1297 | static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt) |
1300 | { | 1298 | { |
1301 | return (__force __be32)xprt->xid++; | 1299 | __be32 xid; |
1300 | |||
1301 | spin_lock(&xprt->reserve_lock); | ||
1302 | xid = (__force __be32)xprt->xid++; | ||
1303 | spin_unlock(&xprt->reserve_lock); | ||
1304 | return xid; | ||
1302 | } | 1305 | } |
1303 | 1306 | ||
1304 | static inline void xprt_init_xid(struct rpc_xprt *xprt) | 1307 | static inline void xprt_init_xid(struct rpc_xprt *xprt) |
@@ -1316,6 +1319,7 @@ void xprt_request_init(struct rpc_task *task) | |||
1316 | req->rq_task = task; | 1319 | req->rq_task = task; |
1317 | req->rq_xprt = xprt; | 1320 | req->rq_xprt = xprt; |
1318 | req->rq_buffer = NULL; | 1321 | req->rq_buffer = NULL; |
1322 | req->rq_xid = xprt_alloc_xid(xprt); | ||
1319 | req->rq_connect_cookie = xprt->connect_cookie - 1; | 1323 | req->rq_connect_cookie = xprt->connect_cookie - 1; |
1320 | req->rq_bytes_sent = 0; | 1324 | req->rq_bytes_sent = 0; |
1321 | req->rq_snd_buf.len = 0; | 1325 | req->rq_snd_buf.len = 0; |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 14a5d055717d..930852c54d7a 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -692,9 +692,10 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr, | |||
692 | } | 692 | } |
693 | 693 | ||
694 | /** | 694 | /** |
695 | * tipc_poll - read pollmask | 695 | * tipc_poll - read and possibly block on pollmask |
696 | * @file: file structure associated with the socket | 696 | * @file: file structure associated with the socket |
697 | * @sock: socket for which to calculate the poll bits | 697 | * @sock: socket for which to calculate the poll bits |
698 | * @wait: ??? | ||
698 | * | 699 | * |
699 | * Returns pollmask value | 700 | * Returns pollmask value |
700 | * | 701 | * |
@@ -708,12 +709,15 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr, | |||
708 | * imply that the operation will succeed, merely that it should be performed | 709 | * imply that the operation will succeed, merely that it should be performed |
709 | * and will not block. | 710 | * and will not block. |
710 | */ | 711 | */ |
711 | static __poll_t tipc_poll_mask(struct socket *sock, __poll_t events) | 712 | static __poll_t tipc_poll(struct file *file, struct socket *sock, |
713 | poll_table *wait) | ||
712 | { | 714 | { |
713 | struct sock *sk = sock->sk; | 715 | struct sock *sk = sock->sk; |
714 | struct tipc_sock *tsk = tipc_sk(sk); | 716 | struct tipc_sock *tsk = tipc_sk(sk); |
715 | __poll_t revents = 0; | 717 | __poll_t revents = 0; |
716 | 718 | ||
719 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
720 | |||
717 | if (sk->sk_shutdown & RCV_SHUTDOWN) | 721 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
718 | revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM; | 722 | revents |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM; |
719 | if (sk->sk_shutdown == SHUTDOWN_MASK) | 723 | if (sk->sk_shutdown == SHUTDOWN_MASK) |
@@ -3033,7 +3037,7 @@ static const struct proto_ops msg_ops = { | |||
3033 | .socketpair = tipc_socketpair, | 3037 | .socketpair = tipc_socketpair, |
3034 | .accept = sock_no_accept, | 3038 | .accept = sock_no_accept, |
3035 | .getname = tipc_getname, | 3039 | .getname = tipc_getname, |
3036 | .poll_mask = tipc_poll_mask, | 3040 | .poll = tipc_poll, |
3037 | .ioctl = tipc_ioctl, | 3041 | .ioctl = tipc_ioctl, |
3038 | .listen = sock_no_listen, | 3042 | .listen = sock_no_listen, |
3039 | .shutdown = tipc_shutdown, | 3043 | .shutdown = tipc_shutdown, |
@@ -3054,7 +3058,7 @@ static const struct proto_ops packet_ops = { | |||
3054 | .socketpair = tipc_socketpair, | 3058 | .socketpair = tipc_socketpair, |
3055 | .accept = tipc_accept, | 3059 | .accept = tipc_accept, |
3056 | .getname = tipc_getname, | 3060 | .getname = tipc_getname, |
3057 | .poll_mask = tipc_poll_mask, | 3061 | .poll = tipc_poll, |
3058 | .ioctl = tipc_ioctl, | 3062 | .ioctl = tipc_ioctl, |
3059 | .listen = tipc_listen, | 3063 | .listen = tipc_listen, |
3060 | .shutdown = tipc_shutdown, | 3064 | .shutdown = tipc_shutdown, |
@@ -3075,7 +3079,7 @@ static const struct proto_ops stream_ops = { | |||
3075 | .socketpair = tipc_socketpair, | 3079 | .socketpair = tipc_socketpair, |
3076 | .accept = tipc_accept, | 3080 | .accept = tipc_accept, |
3077 | .getname = tipc_getname, | 3081 | .getname = tipc_getname, |
3078 | .poll_mask = tipc_poll_mask, | 3082 | .poll = tipc_poll, |
3079 | .ioctl = tipc_ioctl, | 3083 | .ioctl = tipc_ioctl, |
3080 | .listen = tipc_listen, | 3084 | .listen = tipc_listen, |
3081 | .shutdown = tipc_shutdown, | 3085 | .shutdown = tipc_shutdown, |
diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c index a127d61e8af9..301f22430469 100644 --- a/net/tls/tls_main.c +++ b/net/tls/tls_main.c | |||
@@ -712,7 +712,7 @@ static int __init tls_register(void) | |||
712 | build_protos(tls_prots[TLSV4], &tcp_prot); | 712 | build_protos(tls_prots[TLSV4], &tcp_prot); |
713 | 713 | ||
714 | tls_sw_proto_ops = inet_stream_ops; | 714 | tls_sw_proto_ops = inet_stream_ops; |
715 | tls_sw_proto_ops.poll_mask = tls_sw_poll_mask; | 715 | tls_sw_proto_ops.poll = tls_sw_poll; |
716 | tls_sw_proto_ops.splice_read = tls_sw_splice_read; | 716 | tls_sw_proto_ops.splice_read = tls_sw_splice_read; |
717 | 717 | ||
718 | #ifdef CONFIG_TLS_DEVICE | 718 | #ifdef CONFIG_TLS_DEVICE |
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index f127fac88acf..d2380548f8f6 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c | |||
@@ -919,22 +919,23 @@ splice_read_end: | |||
919 | return copied ? : err; | 919 | return copied ? : err; |
920 | } | 920 | } |
921 | 921 | ||
922 | __poll_t tls_sw_poll_mask(struct socket *sock, __poll_t events) | 922 | unsigned int tls_sw_poll(struct file *file, struct socket *sock, |
923 | struct poll_table_struct *wait) | ||
923 | { | 924 | { |
925 | unsigned int ret; | ||
924 | struct sock *sk = sock->sk; | 926 | struct sock *sk = sock->sk; |
925 | struct tls_context *tls_ctx = tls_get_ctx(sk); | 927 | struct tls_context *tls_ctx = tls_get_ctx(sk); |
926 | struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx); | 928 | struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx); |
927 | __poll_t mask; | ||
928 | 929 | ||
929 | /* Grab EPOLLOUT and EPOLLHUP from the underlying socket */ | 930 | /* Grab POLLOUT and POLLHUP from the underlying socket */ |
930 | mask = ctx->sk_poll_mask(sock, events); | 931 | ret = ctx->sk_poll(file, sock, wait); |
931 | 932 | ||
932 | /* Clear EPOLLIN bits, and set based on recv_pkt */ | 933 | /* Clear POLLIN bits, and set based on recv_pkt */ |
933 | mask &= ~(EPOLLIN | EPOLLRDNORM); | 934 | ret &= ~(POLLIN | POLLRDNORM); |
934 | if (ctx->recv_pkt) | 935 | if (ctx->recv_pkt) |
935 | mask |= EPOLLIN | EPOLLRDNORM; | 936 | ret |= POLLIN | POLLRDNORM; |
936 | 937 | ||
937 | return mask; | 938 | return ret; |
938 | } | 939 | } |
939 | 940 | ||
940 | static int tls_read_size(struct strparser *strp, struct sk_buff *skb) | 941 | static int tls_read_size(struct strparser *strp, struct sk_buff *skb) |
@@ -1191,7 +1192,7 @@ int tls_set_sw_offload(struct sock *sk, struct tls_context *ctx, int tx) | |||
1191 | sk->sk_data_ready = tls_data_ready; | 1192 | sk->sk_data_ready = tls_data_ready; |
1192 | write_unlock_bh(&sk->sk_callback_lock); | 1193 | write_unlock_bh(&sk->sk_callback_lock); |
1193 | 1194 | ||
1194 | sw_ctx_rx->sk_poll_mask = sk->sk_socket->ops->poll_mask; | 1195 | sw_ctx_rx->sk_poll = sk->sk_socket->ops->poll; |
1195 | 1196 | ||
1196 | strp_check_rcv(&sw_ctx_rx->strp); | 1197 | strp_check_rcv(&sw_ctx_rx->strp); |
1197 | } | 1198 | } |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 95b02a71fd47..e5473c03d667 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -638,8 +638,9 @@ static int unix_stream_connect(struct socket *, struct sockaddr *, | |||
638 | static int unix_socketpair(struct socket *, struct socket *); | 638 | static int unix_socketpair(struct socket *, struct socket *); |
639 | static int unix_accept(struct socket *, struct socket *, int, bool); | 639 | static int unix_accept(struct socket *, struct socket *, int, bool); |
640 | static int unix_getname(struct socket *, struct sockaddr *, int); | 640 | static int unix_getname(struct socket *, struct sockaddr *, int); |
641 | static __poll_t unix_poll_mask(struct socket *, __poll_t); | 641 | static __poll_t unix_poll(struct file *, struct socket *, poll_table *); |
642 | static __poll_t unix_dgram_poll_mask(struct socket *, __poll_t); | 642 | static __poll_t unix_dgram_poll(struct file *, struct socket *, |
643 | poll_table *); | ||
643 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); | 644 | static int unix_ioctl(struct socket *, unsigned int, unsigned long); |
644 | static int unix_shutdown(struct socket *, int); | 645 | static int unix_shutdown(struct socket *, int); |
645 | static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t); | 646 | static int unix_stream_sendmsg(struct socket *, struct msghdr *, size_t); |
@@ -680,7 +681,7 @@ static const struct proto_ops unix_stream_ops = { | |||
680 | .socketpair = unix_socketpair, | 681 | .socketpair = unix_socketpair, |
681 | .accept = unix_accept, | 682 | .accept = unix_accept, |
682 | .getname = unix_getname, | 683 | .getname = unix_getname, |
683 | .poll_mask = unix_poll_mask, | 684 | .poll = unix_poll, |
684 | .ioctl = unix_ioctl, | 685 | .ioctl = unix_ioctl, |
685 | .listen = unix_listen, | 686 | .listen = unix_listen, |
686 | .shutdown = unix_shutdown, | 687 | .shutdown = unix_shutdown, |
@@ -703,7 +704,7 @@ static const struct proto_ops unix_dgram_ops = { | |||
703 | .socketpair = unix_socketpair, | 704 | .socketpair = unix_socketpair, |
704 | .accept = sock_no_accept, | 705 | .accept = sock_no_accept, |
705 | .getname = unix_getname, | 706 | .getname = unix_getname, |
706 | .poll_mask = unix_dgram_poll_mask, | 707 | .poll = unix_dgram_poll, |
707 | .ioctl = unix_ioctl, | 708 | .ioctl = unix_ioctl, |
708 | .listen = sock_no_listen, | 709 | .listen = sock_no_listen, |
709 | .shutdown = unix_shutdown, | 710 | .shutdown = unix_shutdown, |
@@ -725,7 +726,7 @@ static const struct proto_ops unix_seqpacket_ops = { | |||
725 | .socketpair = unix_socketpair, | 726 | .socketpair = unix_socketpair, |
726 | .accept = unix_accept, | 727 | .accept = unix_accept, |
727 | .getname = unix_getname, | 728 | .getname = unix_getname, |
728 | .poll_mask = unix_dgram_poll_mask, | 729 | .poll = unix_dgram_poll, |
729 | .ioctl = unix_ioctl, | 730 | .ioctl = unix_ioctl, |
730 | .listen = unix_listen, | 731 | .listen = unix_listen, |
731 | .shutdown = unix_shutdown, | 732 | .shutdown = unix_shutdown, |
@@ -2629,10 +2630,13 @@ static int unix_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
2629 | return err; | 2630 | return err; |
2630 | } | 2631 | } |
2631 | 2632 | ||
2632 | static __poll_t unix_poll_mask(struct socket *sock, __poll_t events) | 2633 | static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wait) |
2633 | { | 2634 | { |
2634 | struct sock *sk = sock->sk; | 2635 | struct sock *sk = sock->sk; |
2635 | __poll_t mask = 0; | 2636 | __poll_t mask; |
2637 | |||
2638 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
2639 | mask = 0; | ||
2636 | 2640 | ||
2637 | /* exceptional events? */ | 2641 | /* exceptional events? */ |
2638 | if (sk->sk_err) | 2642 | if (sk->sk_err) |
@@ -2661,11 +2665,15 @@ static __poll_t unix_poll_mask(struct socket *sock, __poll_t events) | |||
2661 | return mask; | 2665 | return mask; |
2662 | } | 2666 | } |
2663 | 2667 | ||
2664 | static __poll_t unix_dgram_poll_mask(struct socket *sock, __poll_t events) | 2668 | static __poll_t unix_dgram_poll(struct file *file, struct socket *sock, |
2669 | poll_table *wait) | ||
2665 | { | 2670 | { |
2666 | struct sock *sk = sock->sk, *other; | 2671 | struct sock *sk = sock->sk, *other; |
2667 | int writable; | 2672 | unsigned int writable; |
2668 | __poll_t mask = 0; | 2673 | __poll_t mask; |
2674 | |||
2675 | sock_poll_wait(file, sk_sleep(sk), wait); | ||
2676 | mask = 0; | ||
2669 | 2677 | ||
2670 | /* exceptional events? */ | 2678 | /* exceptional events? */ |
2671 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) | 2679 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) |
@@ -2691,7 +2699,7 @@ static __poll_t unix_dgram_poll_mask(struct socket *sock, __poll_t events) | |||
2691 | } | 2699 | } |
2692 | 2700 | ||
2693 | /* No write status requested, avoid expensive OUT tests. */ | 2701 | /* No write status requested, avoid expensive OUT tests. */ |
2694 | if (!(events & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT))) | 2702 | if (!(poll_requested_events(wait) & (EPOLLWRBAND|EPOLLWRNORM|EPOLLOUT))) |
2695 | return mask; | 2703 | return mask; |
2696 | 2704 | ||
2697 | writable = unix_writable(sk); | 2705 | writable = unix_writable(sk); |
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index bb5d5fa68c35..c1076c19b858 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c | |||
@@ -850,11 +850,18 @@ static int vsock_shutdown(struct socket *sock, int mode) | |||
850 | return err; | 850 | return err; |
851 | } | 851 | } |
852 | 852 | ||
853 | static __poll_t vsock_poll_mask(struct socket *sock, __poll_t events) | 853 | static __poll_t vsock_poll(struct file *file, struct socket *sock, |
854 | poll_table *wait) | ||
854 | { | 855 | { |
855 | struct sock *sk = sock->sk; | 856 | struct sock *sk; |
856 | struct vsock_sock *vsk = vsock_sk(sk); | 857 | __poll_t mask; |
857 | __poll_t mask = 0; | 858 | struct vsock_sock *vsk; |
859 | |||
860 | sk = sock->sk; | ||
861 | vsk = vsock_sk(sk); | ||
862 | |||
863 | poll_wait(file, sk_sleep(sk), wait); | ||
864 | mask = 0; | ||
858 | 865 | ||
859 | if (sk->sk_err) | 866 | if (sk->sk_err) |
860 | /* Signify that there has been an error on this socket. */ | 867 | /* Signify that there has been an error on this socket. */ |
@@ -1084,7 +1091,7 @@ static const struct proto_ops vsock_dgram_ops = { | |||
1084 | .socketpair = sock_no_socketpair, | 1091 | .socketpair = sock_no_socketpair, |
1085 | .accept = sock_no_accept, | 1092 | .accept = sock_no_accept, |
1086 | .getname = vsock_getname, | 1093 | .getname = vsock_getname, |
1087 | .poll_mask = vsock_poll_mask, | 1094 | .poll = vsock_poll, |
1088 | .ioctl = sock_no_ioctl, | 1095 | .ioctl = sock_no_ioctl, |
1089 | .listen = sock_no_listen, | 1096 | .listen = sock_no_listen, |
1090 | .shutdown = vsock_shutdown, | 1097 | .shutdown = vsock_shutdown, |
@@ -1842,7 +1849,7 @@ static const struct proto_ops vsock_stream_ops = { | |||
1842 | .socketpair = sock_no_socketpair, | 1849 | .socketpair = sock_no_socketpair, |
1843 | .accept = vsock_accept, | 1850 | .accept = vsock_accept, |
1844 | .getname = vsock_getname, | 1851 | .getname = vsock_getname, |
1845 | .poll_mask = vsock_poll_mask, | 1852 | .poll = vsock_poll, |
1846 | .ioctl = sock_no_ioctl, | 1853 | .ioctl = sock_no_ioctl, |
1847 | .listen = vsock_listen, | 1854 | .listen = vsock_listen, |
1848 | .shutdown = vsock_shutdown, | 1855 | .shutdown = vsock_shutdown, |
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c index 8e03bd3f3668..5d3cce9e8744 100644 --- a/net/vmw_vsock/virtio_transport.c +++ b/net/vmw_vsock/virtio_transport.c | |||
@@ -201,7 +201,7 @@ virtio_transport_send_pkt(struct virtio_vsock_pkt *pkt) | |||
201 | return -ENODEV; | 201 | return -ENODEV; |
202 | } | 202 | } |
203 | 203 | ||
204 | if (le32_to_cpu(pkt->hdr.dst_cid) == vsock->guest_cid) | 204 | if (le64_to_cpu(pkt->hdr.dst_cid) == vsock->guest_cid) |
205 | return virtio_transport_send_pkt_loopback(vsock, pkt); | 205 | return virtio_transport_send_pkt_loopback(vsock, pkt); |
206 | 206 | ||
207 | if (pkt->reply) | 207 | if (pkt->reply) |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index c7bbe5f0aae8..4eece06be1e7 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -6231,7 +6231,7 @@ do { \ | |||
6231 | nl80211_check_s32); | 6231 | nl80211_check_s32); |
6232 | /* | 6232 | /* |
6233 | * Check HT operation mode based on | 6233 | * Check HT operation mode based on |
6234 | * IEEE 802.11 2012 8.4.2.59 HT Operation element. | 6234 | * IEEE 802.11-2016 9.4.2.57 HT Operation element. |
6235 | */ | 6235 | */ |
6236 | if (tb[NL80211_MESHCONF_HT_OPMODE]) { | 6236 | if (tb[NL80211_MESHCONF_HT_OPMODE]) { |
6237 | ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); | 6237 | ht_opmode = nla_get_u16(tb[NL80211_MESHCONF_HT_OPMODE]); |
@@ -6241,22 +6241,9 @@ do { \ | |||
6241 | IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) | 6241 | IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) |
6242 | return -EINVAL; | 6242 | return -EINVAL; |
6243 | 6243 | ||
6244 | if ((ht_opmode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT) && | 6244 | /* NON_HT_STA bit is reserved, but some programs set it */ |
6245 | (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) | 6245 | ht_opmode &= ~IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT; |
6246 | return -EINVAL; | ||
6247 | 6246 | ||
6248 | switch (ht_opmode & IEEE80211_HT_OP_MODE_PROTECTION) { | ||
6249 | case IEEE80211_HT_OP_MODE_PROTECTION_NONE: | ||
6250 | case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ: | ||
6251 | if (ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT) | ||
6252 | return -EINVAL; | ||
6253 | break; | ||
6254 | case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER: | ||
6255 | case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED: | ||
6256 | if (!(ht_opmode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT)) | ||
6257 | return -EINVAL; | ||
6258 | break; | ||
6259 | } | ||
6260 | cfg->ht_opmode = ht_opmode; | 6247 | cfg->ht_opmode = ht_opmode; |
6261 | mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); | 6248 | mask |= (1 << (NL80211_MESHCONF_HT_OPMODE - 1)); |
6262 | } | 6249 | } |
@@ -10962,9 +10949,12 @@ static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) | |||
10962 | rem) { | 10949 | rem) { |
10963 | u8 *mask_pat; | 10950 | u8 *mask_pat; |
10964 | 10951 | ||
10965 | nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, | 10952 | err = nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, |
10966 | nl80211_packet_pattern_policy, | 10953 | nl80211_packet_pattern_policy, |
10967 | info->extack); | 10954 | info->extack); |
10955 | if (err) | ||
10956 | goto error; | ||
10957 | |||
10968 | err = -EINVAL; | 10958 | err = -EINVAL; |
10969 | if (!pat_tb[NL80211_PKTPAT_MASK] || | 10959 | if (!pat_tb[NL80211_PKTPAT_MASK] || |
10970 | !pat_tb[NL80211_PKTPAT_PATTERN]) | 10960 | !pat_tb[NL80211_PKTPAT_PATTERN]) |
@@ -11213,8 +11203,11 @@ static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, | |||
11213 | rem) { | 11203 | rem) { |
11214 | u8 *mask_pat; | 11204 | u8 *mask_pat; |
11215 | 11205 | ||
11216 | nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, | 11206 | err = nla_parse_nested(pat_tb, MAX_NL80211_PKTPAT, pat, |
11217 | nl80211_packet_pattern_policy, NULL); | 11207 | nl80211_packet_pattern_policy, NULL); |
11208 | if (err) | ||
11209 | return err; | ||
11210 | |||
11218 | if (!pat_tb[NL80211_PKTPAT_MASK] || | 11211 | if (!pat_tb[NL80211_PKTPAT_MASK] || |
11219 | !pat_tb[NL80211_PKTPAT_PATTERN]) | 11212 | !pat_tb[NL80211_PKTPAT_PATTERN]) |
11220 | return -EINVAL; | 11213 | return -EINVAL; |
diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c index f93365ae0fdd..d49aa79b7997 100644 --- a/net/x25/af_x25.c +++ b/net/x25/af_x25.c | |||
@@ -1750,7 +1750,7 @@ static const struct proto_ops x25_proto_ops = { | |||
1750 | .socketpair = sock_no_socketpair, | 1750 | .socketpair = sock_no_socketpair, |
1751 | .accept = x25_accept, | 1751 | .accept = x25_accept, |
1752 | .getname = x25_getname, | 1752 | .getname = x25_getname, |
1753 | .poll_mask = datagram_poll_mask, | 1753 | .poll = datagram_poll, |
1754 | .ioctl = x25_ioctl, | 1754 | .ioctl = x25_ioctl, |
1755 | #ifdef CONFIG_COMPAT | 1755 | #ifdef CONFIG_COMPAT |
1756 | .compat_ioctl = compat_x25_ioctl, | 1756 | .compat_ioctl = compat_x25_ioctl, |
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 36919a254ba3..59fb7d3c36a3 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c | |||
@@ -118,6 +118,9 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) | |||
118 | u64 addr; | 118 | u64 addr; |
119 | int err; | 119 | int err; |
120 | 120 | ||
121 | if (xs->dev != xdp->rxq->dev || xs->queue_id != xdp->rxq->queue_index) | ||
122 | return -EINVAL; | ||
123 | |||
121 | if (!xskq_peek_addr(xs->umem->fq, &addr) || | 124 | if (!xskq_peek_addr(xs->umem->fq, &addr) || |
122 | len > xs->umem->chunk_size_nohr) { | 125 | len > xs->umem->chunk_size_nohr) { |
123 | xs->rx_dropped++; | 126 | xs->rx_dropped++; |
@@ -300,9 +303,10 @@ static int xsk_sendmsg(struct socket *sock, struct msghdr *m, size_t total_len) | |||
300 | return (xs->zc) ? xsk_zc_xmit(sk) : xsk_generic_xmit(sk, m, total_len); | 303 | return (xs->zc) ? xsk_zc_xmit(sk) : xsk_generic_xmit(sk, m, total_len); |
301 | } | 304 | } |
302 | 305 | ||
303 | static __poll_t xsk_poll_mask(struct socket *sock, __poll_t events) | 306 | static unsigned int xsk_poll(struct file *file, struct socket *sock, |
307 | struct poll_table_struct *wait) | ||
304 | { | 308 | { |
305 | __poll_t mask = datagram_poll_mask(sock, events); | 309 | unsigned int mask = datagram_poll(file, sock, wait); |
306 | struct sock *sk = sock->sk; | 310 | struct sock *sk = sock->sk; |
307 | struct xdp_sock *xs = xdp_sk(sk); | 311 | struct xdp_sock *xs = xdp_sk(sk); |
308 | 312 | ||
@@ -693,7 +697,7 @@ static const struct proto_ops xsk_proto_ops = { | |||
693 | .socketpair = sock_no_socketpair, | 697 | .socketpair = sock_no_socketpair, |
694 | .accept = sock_no_accept, | 698 | .accept = sock_no_accept, |
695 | .getname = sock_no_getname, | 699 | .getname = sock_no_getname, |
696 | .poll_mask = xsk_poll_mask, | 700 | .poll = xsk_poll, |
697 | .ioctl = sock_no_ioctl, | 701 | .ioctl = sock_no_ioctl, |
698 | .listen = sock_no_listen, | 702 | .listen = sock_no_listen, |
699 | .shutdown = sock_no_shutdown, | 703 | .shutdown = sock_no_shutdown, |