diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-07-29 17:57:51 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-07-29 17:57:51 -0400 |
commit | 3431e490b50356b56084305a2e93b3a980802b22 (patch) | |
tree | da5213c3c05df56711a097c95e8a1410a46df78d /net | |
parent | 5af310a8ee70dd6a588c8ee1d4487a230a7b7b65 (diff) | |
parent | 1dcc3d3362b0c97e48290f7786be85b4cec2a147 (diff) |
Merge branch 'acpi-scan' into acpi-pm
Conflicts:
drivers/acpi/scan.c
The conflict is resolved by moving the just introduced
acpi_device_is_first_physical_node() to bus.c and using
the existing acpi_companion_match() from there.
There will be an additional commit to combine the two.
Diffstat (limited to 'net')
-rw-r--r-- | net/bridge/br_forward.c | 1 | ||||
-rw-r--r-- | net/bridge/br_mdb.c | 16 | ||||
-rw-r--r-- | net/bridge/br_netfilter_hooks.c | 16 | ||||
-rw-r--r-- | net/bridge/br_netfilter_ipv6.c | 2 | ||||
-rw-r--r-- | net/bridge/br_netlink.c | 2 | ||||
-rw-r--r-- | net/can/af_can.c | 12 | ||||
-rw-r--r-- | net/can/bcm.c | 2 | ||||
-rw-r--r-- | net/can/raw.c | 7 | ||||
-rw-r--r-- | net/core/dev.c | 45 | ||||
-rw-r--r-- | net/core/gen_estimator.c | 13 | ||||
-rw-r--r-- | net/core/pktgen.c | 9 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 187 | ||||
-rw-r--r-- | net/dsa/dsa.c | 6 | ||||
-rw-r--r-- | net/ipv4/devinet.c | 13 | ||||
-rw-r--r-- | net/ipv4/inet_diag.c | 4 | ||||
-rw-r--r-- | net/ipv4/ip_tunnel.c | 8 | ||||
-rw-r--r-- | net/ipv4/netfilter/arp_tables.c | 25 | ||||
-rw-r--r-- | net/ipv6/ip6_input.c | 6 | ||||
-rw-r--r-- | net/ipv6/route.c | 5 | ||||
-rw-r--r-- | net/netfilter/nf_queue.c | 2 | ||||
-rw-r--r-- | net/netfilter/nfnetlink.c | 38 | ||||
-rw-r--r-- | net/netlink/af_netlink.c | 2 | ||||
-rw-r--r-- | net/rds/ib_rdma.c | 4 | ||||
-rw-r--r-- | net/rds/transport.c | 2 | ||||
-rw-r--r-- | net/switchdev/switchdev.c | 12 | ||||
-rw-r--r-- | net/tipc/socket.c | 1 |
26 files changed, 245 insertions, 195 deletions
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index e97572b5d2cc..0ff6e1bbca91 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c | |||
@@ -42,6 +42,7 @@ int br_dev_queue_push_xmit(struct sock *sk, struct sk_buff *skb) | |||
42 | } else { | 42 | } else { |
43 | skb_push(skb, ETH_HLEN); | 43 | skb_push(skb, ETH_HLEN); |
44 | br_drop_fake_rtable(skb); | 44 | br_drop_fake_rtable(skb); |
45 | skb_sender_cpu_clear(skb); | ||
45 | dev_queue_xmit(skb); | 46 | dev_queue_xmit(skb); |
46 | } | 47 | } |
47 | 48 | ||
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index e29ad70b3000..c11cf2611db0 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c | |||
@@ -323,6 +323,7 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port, | |||
323 | struct net_bridge_port_group *p; | 323 | struct net_bridge_port_group *p; |
324 | struct net_bridge_port_group __rcu **pp; | 324 | struct net_bridge_port_group __rcu **pp; |
325 | struct net_bridge_mdb_htable *mdb; | 325 | struct net_bridge_mdb_htable *mdb; |
326 | unsigned long now = jiffies; | ||
326 | int err; | 327 | int err; |
327 | 328 | ||
328 | mdb = mlock_dereference(br->mdb, br); | 329 | mdb = mlock_dereference(br->mdb, br); |
@@ -347,6 +348,8 @@ static int br_mdb_add_group(struct net_bridge *br, struct net_bridge_port *port, | |||
347 | if (unlikely(!p)) | 348 | if (unlikely(!p)) |
348 | return -ENOMEM; | 349 | return -ENOMEM; |
349 | rcu_assign_pointer(*pp, p); | 350 | rcu_assign_pointer(*pp, p); |
351 | if (state == MDB_TEMPORARY) | ||
352 | mod_timer(&p->timer, now + br->multicast_membership_interval); | ||
350 | 353 | ||
351 | br_mdb_notify(br->dev, port, group, RTM_NEWMDB); | 354 | br_mdb_notify(br->dev, port, group, RTM_NEWMDB); |
352 | return 0; | 355 | return 0; |
@@ -371,6 +374,7 @@ static int __br_mdb_add(struct net *net, struct net_bridge *br, | |||
371 | if (!p || p->br != br || p->state == BR_STATE_DISABLED) | 374 | if (!p || p->br != br || p->state == BR_STATE_DISABLED) |
372 | return -EINVAL; | 375 | return -EINVAL; |
373 | 376 | ||
377 | memset(&ip, 0, sizeof(ip)); | ||
374 | ip.proto = entry->addr.proto; | 378 | ip.proto = entry->addr.proto; |
375 | if (ip.proto == htons(ETH_P_IP)) | 379 | if (ip.proto == htons(ETH_P_IP)) |
376 | ip.u.ip4 = entry->addr.u.ip4; | 380 | ip.u.ip4 = entry->addr.u.ip4; |
@@ -417,20 +421,14 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry) | |||
417 | if (!netif_running(br->dev) || br->multicast_disabled) | 421 | if (!netif_running(br->dev) || br->multicast_disabled) |
418 | return -EINVAL; | 422 | return -EINVAL; |
419 | 423 | ||
424 | memset(&ip, 0, sizeof(ip)); | ||
420 | ip.proto = entry->addr.proto; | 425 | ip.proto = entry->addr.proto; |
421 | if (ip.proto == htons(ETH_P_IP)) { | 426 | if (ip.proto == htons(ETH_P_IP)) |
422 | if (timer_pending(&br->ip4_other_query.timer)) | ||
423 | return -EBUSY; | ||
424 | |||
425 | ip.u.ip4 = entry->addr.u.ip4; | 427 | ip.u.ip4 = entry->addr.u.ip4; |
426 | #if IS_ENABLED(CONFIG_IPV6) | 428 | #if IS_ENABLED(CONFIG_IPV6) |
427 | } else { | 429 | else |
428 | if (timer_pending(&br->ip6_other_query.timer)) | ||
429 | return -EBUSY; | ||
430 | |||
431 | ip.u.ip6 = entry->addr.u.ip6; | 430 | ip.u.ip6 = entry->addr.u.ip6; |
432 | #endif | 431 | #endif |
433 | } | ||
434 | 432 | ||
435 | spin_lock_bh(&br->multicast_lock); | 433 | spin_lock_bh(&br->multicast_lock); |
436 | mdb = mlock_dereference(br->mdb, br); | 434 | mdb = mlock_dereference(br->mdb, br); |
diff --git a/net/bridge/br_netfilter_hooks.c b/net/bridge/br_netfilter_hooks.c index d89f4fac0bc5..c8b9bcfe997e 100644 --- a/net/bridge/br_netfilter_hooks.c +++ b/net/bridge/br_netfilter_hooks.c | |||
@@ -111,7 +111,7 @@ static inline __be16 pppoe_proto(const struct sk_buff *skb) | |||
111 | /* largest possible L2 header, see br_nf_dev_queue_xmit() */ | 111 | /* largest possible L2 header, see br_nf_dev_queue_xmit() */ |
112 | #define NF_BRIDGE_MAX_MAC_HEADER_LENGTH (PPPOE_SES_HLEN + ETH_HLEN) | 112 | #define NF_BRIDGE_MAX_MAC_HEADER_LENGTH (PPPOE_SES_HLEN + ETH_HLEN) |
113 | 113 | ||
114 | #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV4) | 114 | #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV4) || IS_ENABLED(CONFIG_NF_DEFRAG_IPV6) |
115 | struct brnf_frag_data { | 115 | struct brnf_frag_data { |
116 | char mac[NF_BRIDGE_MAX_MAC_HEADER_LENGTH]; | 116 | char mac[NF_BRIDGE_MAX_MAC_HEADER_LENGTH]; |
117 | u8 encap_size; | 117 | u8 encap_size; |
@@ -694,6 +694,7 @@ static int br_nf_push_frag_xmit(struct sock *sk, struct sk_buff *skb) | |||
694 | } | 694 | } |
695 | #endif | 695 | #endif |
696 | 696 | ||
697 | #if IS_ENABLED(CONFIG_NF_DEFRAG_IPV4) | ||
697 | static int br_nf_ip_fragment(struct sock *sk, struct sk_buff *skb, | 698 | static int br_nf_ip_fragment(struct sock *sk, struct sk_buff *skb, |
698 | int (*output)(struct sock *, struct sk_buff *)) | 699 | int (*output)(struct sock *, struct sk_buff *)) |
699 | { | 700 | { |
@@ -712,6 +713,7 @@ static int br_nf_ip_fragment(struct sock *sk, struct sk_buff *skb, | |||
712 | 713 | ||
713 | return ip_do_fragment(sk, skb, output); | 714 | return ip_do_fragment(sk, skb, output); |
714 | } | 715 | } |
716 | #endif | ||
715 | 717 | ||
716 | static unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) | 718 | static unsigned int nf_bridge_mtu_reduction(const struct sk_buff *skb) |
717 | { | 719 | { |
@@ -742,7 +744,7 @@ static int br_nf_dev_queue_xmit(struct sock *sk, struct sk_buff *skb) | |||
742 | struct brnf_frag_data *data; | 744 | struct brnf_frag_data *data; |
743 | 745 | ||
744 | if (br_validate_ipv4(skb)) | 746 | if (br_validate_ipv4(skb)) |
745 | return NF_DROP; | 747 | goto drop; |
746 | 748 | ||
747 | IPCB(skb)->frag_max_size = nf_bridge->frag_max_size; | 749 | IPCB(skb)->frag_max_size = nf_bridge->frag_max_size; |
748 | 750 | ||
@@ -767,7 +769,7 @@ static int br_nf_dev_queue_xmit(struct sock *sk, struct sk_buff *skb) | |||
767 | struct brnf_frag_data *data; | 769 | struct brnf_frag_data *data; |
768 | 770 | ||
769 | if (br_validate_ipv6(skb)) | 771 | if (br_validate_ipv6(skb)) |
770 | return NF_DROP; | 772 | goto drop; |
771 | 773 | ||
772 | IP6CB(skb)->frag_max_size = nf_bridge->frag_max_size; | 774 | IP6CB(skb)->frag_max_size = nf_bridge->frag_max_size; |
773 | 775 | ||
@@ -782,12 +784,16 @@ static int br_nf_dev_queue_xmit(struct sock *sk, struct sk_buff *skb) | |||
782 | 784 | ||
783 | if (v6ops) | 785 | if (v6ops) |
784 | return v6ops->fragment(sk, skb, br_nf_push_frag_xmit); | 786 | return v6ops->fragment(sk, skb, br_nf_push_frag_xmit); |
785 | else | 787 | |
786 | return -EMSGSIZE; | 788 | kfree_skb(skb); |
789 | return -EMSGSIZE; | ||
787 | } | 790 | } |
788 | #endif | 791 | #endif |
789 | nf_bridge_info_free(skb); | 792 | nf_bridge_info_free(skb); |
790 | return br_dev_queue_push_xmit(sk, skb); | 793 | return br_dev_queue_push_xmit(sk, skb); |
794 | drop: | ||
795 | kfree_skb(skb); | ||
796 | return 0; | ||
791 | } | 797 | } |
792 | 798 | ||
793 | /* PF_BRIDGE/POST_ROUTING ********************************************/ | 799 | /* PF_BRIDGE/POST_ROUTING ********************************************/ |
diff --git a/net/bridge/br_netfilter_ipv6.c b/net/bridge/br_netfilter_ipv6.c index 6d12d2675c80..13b7d1e3d185 100644 --- a/net/bridge/br_netfilter_ipv6.c +++ b/net/bridge/br_netfilter_ipv6.c | |||
@@ -104,7 +104,7 @@ int br_validate_ipv6(struct sk_buff *skb) | |||
104 | { | 104 | { |
105 | const struct ipv6hdr *hdr; | 105 | const struct ipv6hdr *hdr; |
106 | struct net_device *dev = skb->dev; | 106 | struct net_device *dev = skb->dev; |
107 | struct inet6_dev *idev = in6_dev_get(skb->dev); | 107 | struct inet6_dev *idev = __in6_dev_get(skb->dev); |
108 | u32 pkt_len; | 108 | u32 pkt_len; |
109 | u8 ip6h_len = sizeof(struct ipv6hdr); | 109 | u8 ip6h_len = sizeof(struct ipv6hdr); |
110 | 110 | ||
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index 6b67ed3831de..364bdc98bd9b 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -457,6 +457,8 @@ static int br_afspec(struct net_bridge *br, | |||
457 | if (nla_len(attr) != sizeof(struct bridge_vlan_info)) | 457 | if (nla_len(attr) != sizeof(struct bridge_vlan_info)) |
458 | return -EINVAL; | 458 | return -EINVAL; |
459 | vinfo = nla_data(attr); | 459 | vinfo = nla_data(attr); |
460 | if (!vinfo->vid || vinfo->vid >= VLAN_VID_MASK) | ||
461 | return -EINVAL; | ||
460 | if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) { | 462 | if (vinfo->flags & BRIDGE_VLAN_INFO_RANGE_BEGIN) { |
461 | if (vinfo_start) | 463 | if (vinfo_start) |
462 | return -EINVAL; | 464 | return -EINVAL; |
diff --git a/net/can/af_can.c b/net/can/af_can.c index 7933e62a7318..166d436196c1 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c | |||
@@ -89,6 +89,8 @@ struct timer_list can_stattimer; /* timer for statistics update */ | |||
89 | struct s_stats can_stats; /* packet statistics */ | 89 | struct s_stats can_stats; /* packet statistics */ |
90 | struct s_pstats can_pstats; /* receive list statistics */ | 90 | struct s_pstats can_pstats; /* receive list statistics */ |
91 | 91 | ||
92 | static atomic_t skbcounter = ATOMIC_INIT(0); | ||
93 | |||
92 | /* | 94 | /* |
93 | * af_can socket functions | 95 | * af_can socket functions |
94 | */ | 96 | */ |
@@ -310,12 +312,8 @@ int can_send(struct sk_buff *skb, int loop) | |||
310 | return err; | 312 | return err; |
311 | } | 313 | } |
312 | 314 | ||
313 | if (newskb) { | 315 | if (newskb) |
314 | if (!(newskb->tstamp.tv64)) | ||
315 | __net_timestamp(newskb); | ||
316 | |||
317 | netif_rx_ni(newskb); | 316 | netif_rx_ni(newskb); |
318 | } | ||
319 | 317 | ||
320 | /* update statistics */ | 318 | /* update statistics */ |
321 | can_stats.tx_frames++; | 319 | can_stats.tx_frames++; |
@@ -683,6 +681,10 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev) | |||
683 | can_stats.rx_frames++; | 681 | can_stats.rx_frames++; |
684 | can_stats.rx_frames_delta++; | 682 | can_stats.rx_frames_delta++; |
685 | 683 | ||
684 | /* create non-zero unique skb identifier together with *skb */ | ||
685 | while (!(can_skb_prv(skb)->skbcnt)) | ||
686 | can_skb_prv(skb)->skbcnt = atomic_inc_return(&skbcounter); | ||
687 | |||
686 | rcu_read_lock(); | 688 | rcu_read_lock(); |
687 | 689 | ||
688 | /* deliver the packet to sockets listening on all devices */ | 690 | /* deliver the packet to sockets listening on all devices */ |
diff --git a/net/can/bcm.c b/net/can/bcm.c index b523453585be..a1ba6875c2a2 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
@@ -261,6 +261,7 @@ static void bcm_can_tx(struct bcm_op *op) | |||
261 | 261 | ||
262 | can_skb_reserve(skb); | 262 | can_skb_reserve(skb); |
263 | can_skb_prv(skb)->ifindex = dev->ifindex; | 263 | can_skb_prv(skb)->ifindex = dev->ifindex; |
264 | can_skb_prv(skb)->skbcnt = 0; | ||
264 | 265 | ||
265 | memcpy(skb_put(skb, CFSIZ), cf, CFSIZ); | 266 | memcpy(skb_put(skb, CFSIZ), cf, CFSIZ); |
266 | 267 | ||
@@ -1217,6 +1218,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk) | |||
1217 | } | 1218 | } |
1218 | 1219 | ||
1219 | can_skb_prv(skb)->ifindex = dev->ifindex; | 1220 | can_skb_prv(skb)->ifindex = dev->ifindex; |
1221 | can_skb_prv(skb)->skbcnt = 0; | ||
1220 | skb->dev = dev; | 1222 | skb->dev = dev; |
1221 | can_skb_set_owner(skb, sk); | 1223 | can_skb_set_owner(skb, sk); |
1222 | err = can_send(skb, 1); /* send with loopback */ | 1224 | err = can_send(skb, 1); /* send with loopback */ |
diff --git a/net/can/raw.c b/net/can/raw.c index 31b9748cbb4e..2e67b1423cd3 100644 --- a/net/can/raw.c +++ b/net/can/raw.c | |||
@@ -75,7 +75,7 @@ MODULE_ALIAS("can-proto-1"); | |||
75 | */ | 75 | */ |
76 | 76 | ||
77 | struct uniqframe { | 77 | struct uniqframe { |
78 | ktime_t tstamp; | 78 | int skbcnt; |
79 | const struct sk_buff *skb; | 79 | const struct sk_buff *skb; |
80 | unsigned int join_rx_count; | 80 | unsigned int join_rx_count; |
81 | }; | 81 | }; |
@@ -133,7 +133,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data) | |||
133 | 133 | ||
134 | /* eliminate multiple filter matches for the same skb */ | 134 | /* eliminate multiple filter matches for the same skb */ |
135 | if (this_cpu_ptr(ro->uniq)->skb == oskb && | 135 | if (this_cpu_ptr(ro->uniq)->skb == oskb && |
136 | ktime_equal(this_cpu_ptr(ro->uniq)->tstamp, oskb->tstamp)) { | 136 | this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) { |
137 | if (ro->join_filters) { | 137 | if (ro->join_filters) { |
138 | this_cpu_inc(ro->uniq->join_rx_count); | 138 | this_cpu_inc(ro->uniq->join_rx_count); |
139 | /* drop frame until all enabled filters matched */ | 139 | /* drop frame until all enabled filters matched */ |
@@ -144,7 +144,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data) | |||
144 | } | 144 | } |
145 | } else { | 145 | } else { |
146 | this_cpu_ptr(ro->uniq)->skb = oskb; | 146 | this_cpu_ptr(ro->uniq)->skb = oskb; |
147 | this_cpu_ptr(ro->uniq)->tstamp = oskb->tstamp; | 147 | this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt; |
148 | this_cpu_ptr(ro->uniq)->join_rx_count = 1; | 148 | this_cpu_ptr(ro->uniq)->join_rx_count = 1; |
149 | /* drop first frame to check all enabled filters? */ | 149 | /* drop first frame to check all enabled filters? */ |
150 | if (ro->join_filters && ro->count > 1) | 150 | if (ro->join_filters && ro->count > 1) |
@@ -749,6 +749,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) | |||
749 | 749 | ||
750 | can_skb_reserve(skb); | 750 | can_skb_reserve(skb); |
751 | can_skb_prv(skb)->ifindex = dev->ifindex; | 751 | can_skb_prv(skb)->ifindex = dev->ifindex; |
752 | can_skb_prv(skb)->skbcnt = 0; | ||
752 | 753 | ||
753 | err = memcpy_from_msg(skb_put(skb, size), msg, size); | 754 | err = memcpy_from_msg(skb_put(skb, size), msg, size); |
754 | if (err < 0) | 755 | if (err < 0) |
diff --git a/net/core/dev.c b/net/core/dev.c index 6778a9999d52..a8e4dd430285 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -677,10 +677,6 @@ int dev_get_iflink(const struct net_device *dev) | |||
677 | if (dev->netdev_ops && dev->netdev_ops->ndo_get_iflink) | 677 | if (dev->netdev_ops && dev->netdev_ops->ndo_get_iflink) |
678 | return dev->netdev_ops->ndo_get_iflink(dev); | 678 | return dev->netdev_ops->ndo_get_iflink(dev); |
679 | 679 | ||
680 | /* If dev->rtnl_link_ops is set, it's a virtual interface. */ | ||
681 | if (dev->rtnl_link_ops) | ||
682 | return 0; | ||
683 | |||
684 | return dev->ifindex; | 680 | return dev->ifindex; |
685 | } | 681 | } |
686 | EXPORT_SYMBOL(dev_get_iflink); | 682 | EXPORT_SYMBOL(dev_get_iflink); |
@@ -3452,6 +3448,8 @@ static int enqueue_to_backlog(struct sk_buff *skb, int cpu, | |||
3452 | local_irq_save(flags); | 3448 | local_irq_save(flags); |
3453 | 3449 | ||
3454 | rps_lock(sd); | 3450 | rps_lock(sd); |
3451 | if (!netif_running(skb->dev)) | ||
3452 | goto drop; | ||
3455 | qlen = skb_queue_len(&sd->input_pkt_queue); | 3453 | qlen = skb_queue_len(&sd->input_pkt_queue); |
3456 | if (qlen <= netdev_max_backlog && !skb_flow_limit(skb, qlen)) { | 3454 | if (qlen <= netdev_max_backlog && !skb_flow_limit(skb, qlen)) { |
3457 | if (qlen) { | 3455 | if (qlen) { |
@@ -3473,6 +3471,7 @@ enqueue: | |||
3473 | goto enqueue; | 3471 | goto enqueue; |
3474 | } | 3472 | } |
3475 | 3473 | ||
3474 | drop: | ||
3476 | sd->dropped++; | 3475 | sd->dropped++; |
3477 | rps_unlock(sd); | 3476 | rps_unlock(sd); |
3478 | 3477 | ||
@@ -3775,8 +3774,6 @@ static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc) | |||
3775 | 3774 | ||
3776 | pt_prev = NULL; | 3775 | pt_prev = NULL; |
3777 | 3776 | ||
3778 | rcu_read_lock(); | ||
3779 | |||
3780 | another_round: | 3777 | another_round: |
3781 | skb->skb_iif = skb->dev->ifindex; | 3778 | skb->skb_iif = skb->dev->ifindex; |
3782 | 3779 | ||
@@ -3786,7 +3783,7 @@ another_round: | |||
3786 | skb->protocol == cpu_to_be16(ETH_P_8021AD)) { | 3783 | skb->protocol == cpu_to_be16(ETH_P_8021AD)) { |
3787 | skb = skb_vlan_untag(skb); | 3784 | skb = skb_vlan_untag(skb); |
3788 | if (unlikely(!skb)) | 3785 | if (unlikely(!skb)) |
3789 | goto unlock; | 3786 | goto out; |
3790 | } | 3787 | } |
3791 | 3788 | ||
3792 | #ifdef CONFIG_NET_CLS_ACT | 3789 | #ifdef CONFIG_NET_CLS_ACT |
@@ -3816,10 +3813,10 @@ skip_taps: | |||
3816 | if (static_key_false(&ingress_needed)) { | 3813 | if (static_key_false(&ingress_needed)) { |
3817 | skb = handle_ing(skb, &pt_prev, &ret, orig_dev); | 3814 | skb = handle_ing(skb, &pt_prev, &ret, orig_dev); |
3818 | if (!skb) | 3815 | if (!skb) |
3819 | goto unlock; | 3816 | goto out; |
3820 | 3817 | ||
3821 | if (nf_ingress(skb, &pt_prev, &ret, orig_dev) < 0) | 3818 | if (nf_ingress(skb, &pt_prev, &ret, orig_dev) < 0) |
3822 | goto unlock; | 3819 | goto out; |
3823 | } | 3820 | } |
3824 | #endif | 3821 | #endif |
3825 | #ifdef CONFIG_NET_CLS_ACT | 3822 | #ifdef CONFIG_NET_CLS_ACT |
@@ -3837,7 +3834,7 @@ ncls: | |||
3837 | if (vlan_do_receive(&skb)) | 3834 | if (vlan_do_receive(&skb)) |
3838 | goto another_round; | 3835 | goto another_round; |
3839 | else if (unlikely(!skb)) | 3836 | else if (unlikely(!skb)) |
3840 | goto unlock; | 3837 | goto out; |
3841 | } | 3838 | } |
3842 | 3839 | ||
3843 | rx_handler = rcu_dereference(skb->dev->rx_handler); | 3840 | rx_handler = rcu_dereference(skb->dev->rx_handler); |
@@ -3849,7 +3846,7 @@ ncls: | |||
3849 | switch (rx_handler(&skb)) { | 3846 | switch (rx_handler(&skb)) { |
3850 | case RX_HANDLER_CONSUMED: | 3847 | case RX_HANDLER_CONSUMED: |
3851 | ret = NET_RX_SUCCESS; | 3848 | ret = NET_RX_SUCCESS; |
3852 | goto unlock; | 3849 | goto out; |
3853 | case RX_HANDLER_ANOTHER: | 3850 | case RX_HANDLER_ANOTHER: |
3854 | goto another_round; | 3851 | goto another_round; |
3855 | case RX_HANDLER_EXACT: | 3852 | case RX_HANDLER_EXACT: |
@@ -3903,8 +3900,7 @@ drop: | |||
3903 | ret = NET_RX_DROP; | 3900 | ret = NET_RX_DROP; |
3904 | } | 3901 | } |
3905 | 3902 | ||
3906 | unlock: | 3903 | out: |
3907 | rcu_read_unlock(); | ||
3908 | return ret; | 3904 | return ret; |
3909 | } | 3905 | } |
3910 | 3906 | ||
@@ -3935,29 +3931,30 @@ static int __netif_receive_skb(struct sk_buff *skb) | |||
3935 | 3931 | ||
3936 | static int netif_receive_skb_internal(struct sk_buff *skb) | 3932 | static int netif_receive_skb_internal(struct sk_buff *skb) |
3937 | { | 3933 | { |
3934 | int ret; | ||
3935 | |||
3938 | net_timestamp_check(netdev_tstamp_prequeue, skb); | 3936 | net_timestamp_check(netdev_tstamp_prequeue, skb); |
3939 | 3937 | ||
3940 | if (skb_defer_rx_timestamp(skb)) | 3938 | if (skb_defer_rx_timestamp(skb)) |
3941 | return NET_RX_SUCCESS; | 3939 | return NET_RX_SUCCESS; |
3942 | 3940 | ||
3941 | rcu_read_lock(); | ||
3942 | |||
3943 | #ifdef CONFIG_RPS | 3943 | #ifdef CONFIG_RPS |
3944 | if (static_key_false(&rps_needed)) { | 3944 | if (static_key_false(&rps_needed)) { |
3945 | struct rps_dev_flow voidflow, *rflow = &voidflow; | 3945 | struct rps_dev_flow voidflow, *rflow = &voidflow; |
3946 | int cpu, ret; | 3946 | int cpu = get_rps_cpu(skb->dev, skb, &rflow); |
3947 | |||
3948 | rcu_read_lock(); | ||
3949 | |||
3950 | cpu = get_rps_cpu(skb->dev, skb, &rflow); | ||
3951 | 3947 | ||
3952 | if (cpu >= 0) { | 3948 | if (cpu >= 0) { |
3953 | ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); | 3949 | ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail); |
3954 | rcu_read_unlock(); | 3950 | rcu_read_unlock(); |
3955 | return ret; | 3951 | return ret; |
3956 | } | 3952 | } |
3957 | rcu_read_unlock(); | ||
3958 | } | 3953 | } |
3959 | #endif | 3954 | #endif |
3960 | return __netif_receive_skb(skb); | 3955 | ret = __netif_receive_skb(skb); |
3956 | rcu_read_unlock(); | ||
3957 | return ret; | ||
3961 | } | 3958 | } |
3962 | 3959 | ||
3963 | /** | 3960 | /** |
@@ -4502,8 +4499,10 @@ static int process_backlog(struct napi_struct *napi, int quota) | |||
4502 | struct sk_buff *skb; | 4499 | struct sk_buff *skb; |
4503 | 4500 | ||
4504 | while ((skb = __skb_dequeue(&sd->process_queue))) { | 4501 | while ((skb = __skb_dequeue(&sd->process_queue))) { |
4502 | rcu_read_lock(); | ||
4505 | local_irq_enable(); | 4503 | local_irq_enable(); |
4506 | __netif_receive_skb(skb); | 4504 | __netif_receive_skb(skb); |
4505 | rcu_read_unlock(); | ||
4507 | local_irq_disable(); | 4506 | local_irq_disable(); |
4508 | input_queue_head_incr(sd); | 4507 | input_queue_head_incr(sd); |
4509 | if (++work >= quota) { | 4508 | if (++work >= quota) { |
@@ -6139,6 +6138,7 @@ static void rollback_registered_many(struct list_head *head) | |||
6139 | unlist_netdevice(dev); | 6138 | unlist_netdevice(dev); |
6140 | 6139 | ||
6141 | dev->reg_state = NETREG_UNREGISTERING; | 6140 | dev->reg_state = NETREG_UNREGISTERING; |
6141 | on_each_cpu(flush_backlog, dev, 1); | ||
6142 | } | 6142 | } |
6143 | 6143 | ||
6144 | synchronize_net(); | 6144 | synchronize_net(); |
@@ -6409,7 +6409,8 @@ static int netif_alloc_netdev_queues(struct net_device *dev) | |||
6409 | struct netdev_queue *tx; | 6409 | struct netdev_queue *tx; |
6410 | size_t sz = count * sizeof(*tx); | 6410 | size_t sz = count * sizeof(*tx); |
6411 | 6411 | ||
6412 | BUG_ON(count < 1 || count > 0xffff); | 6412 | if (count < 1 || count > 0xffff) |
6413 | return -EINVAL; | ||
6413 | 6414 | ||
6414 | tx = kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); | 6415 | tx = kzalloc(sz, GFP_KERNEL | __GFP_NOWARN | __GFP_REPEAT); |
6415 | if (!tx) { | 6416 | if (!tx) { |
@@ -6773,8 +6774,6 @@ void netdev_run_todo(void) | |||
6773 | 6774 | ||
6774 | dev->reg_state = NETREG_UNREGISTERED; | 6775 | dev->reg_state = NETREG_UNREGISTERED; |
6775 | 6776 | ||
6776 | on_each_cpu(flush_backlog, dev, 1); | ||
6777 | |||
6778 | netdev_wait_allrefs(dev); | 6777 | netdev_wait_allrefs(dev); |
6779 | 6778 | ||
6780 | /* paranoia */ | 6779 | /* paranoia */ |
diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c index 9dfb88a933e7..92d886f4adcb 100644 --- a/net/core/gen_estimator.c +++ b/net/core/gen_estimator.c | |||
@@ -66,7 +66,7 @@ | |||
66 | 66 | ||
67 | NOTES. | 67 | NOTES. |
68 | 68 | ||
69 | * avbps is scaled by 2^5, avpps is scaled by 2^10. | 69 | * avbps and avpps are scaled by 2^5. |
70 | * both values are reported as 32 bit unsigned values. bps can | 70 | * both values are reported as 32 bit unsigned values. bps can |
71 | overflow for fast links : max speed being 34360Mbit/sec | 71 | overflow for fast links : max speed being 34360Mbit/sec |
72 | * Minimal interval is HZ/4=250msec (it is the greatest common divisor | 72 | * Minimal interval is HZ/4=250msec (it is the greatest common divisor |
@@ -85,10 +85,10 @@ struct gen_estimator | |||
85 | struct gnet_stats_rate_est64 *rate_est; | 85 | struct gnet_stats_rate_est64 *rate_est; |
86 | spinlock_t *stats_lock; | 86 | spinlock_t *stats_lock; |
87 | int ewma_log; | 87 | int ewma_log; |
88 | u32 last_packets; | ||
89 | unsigned long avpps; | ||
88 | u64 last_bytes; | 90 | u64 last_bytes; |
89 | u64 avbps; | 91 | u64 avbps; |
90 | u32 last_packets; | ||
91 | u32 avpps; | ||
92 | struct rcu_head e_rcu; | 92 | struct rcu_head e_rcu; |
93 | struct rb_node node; | 93 | struct rb_node node; |
94 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; | 94 | struct gnet_stats_basic_cpu __percpu *cpu_bstats; |
@@ -118,8 +118,8 @@ static void est_timer(unsigned long arg) | |||
118 | rcu_read_lock(); | 118 | rcu_read_lock(); |
119 | list_for_each_entry_rcu(e, &elist[idx].list, list) { | 119 | list_for_each_entry_rcu(e, &elist[idx].list, list) { |
120 | struct gnet_stats_basic_packed b = {0}; | 120 | struct gnet_stats_basic_packed b = {0}; |
121 | unsigned long rate; | ||
121 | u64 brate; | 122 | u64 brate; |
122 | u32 rate; | ||
123 | 123 | ||
124 | spin_lock(e->stats_lock); | 124 | spin_lock(e->stats_lock); |
125 | read_lock(&est_lock); | 125 | read_lock(&est_lock); |
@@ -133,10 +133,11 @@ static void est_timer(unsigned long arg) | |||
133 | e->avbps += (brate >> e->ewma_log) - (e->avbps >> e->ewma_log); | 133 | e->avbps += (brate >> e->ewma_log) - (e->avbps >> e->ewma_log); |
134 | e->rate_est->bps = (e->avbps+0xF)>>5; | 134 | e->rate_est->bps = (e->avbps+0xF)>>5; |
135 | 135 | ||
136 | rate = (b.packets - e->last_packets)<<(12 - idx); | 136 | rate = b.packets - e->last_packets; |
137 | rate <<= (7 - idx); | ||
137 | e->last_packets = b.packets; | 138 | e->last_packets = b.packets; |
138 | e->avpps += (rate >> e->ewma_log) - (e->avpps >> e->ewma_log); | 139 | e->avpps += (rate >> e->ewma_log) - (e->avpps >> e->ewma_log); |
139 | e->rate_est->pps = (e->avpps+0x1FF)>>10; | 140 | e->rate_est->pps = (e->avpps + 0xF) >> 5; |
140 | skip: | 141 | skip: |
141 | read_unlock(&est_lock); | 142 | read_unlock(&est_lock); |
142 | spin_unlock(e->stats_lock); | 143 | spin_unlock(e->stats_lock); |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 05badbb58865..1ebdf1c0d118 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -3571,13 +3571,6 @@ static int pktgen_thread_worker(void *arg) | |||
3571 | pr_debug("%s removing thread\n", t->tsk->comm); | 3571 | pr_debug("%s removing thread\n", t->tsk->comm); |
3572 | pktgen_rem_thread(t); | 3572 | pktgen_rem_thread(t); |
3573 | 3573 | ||
3574 | /* Wait for kthread_stop */ | ||
3575 | while (!kthread_should_stop()) { | ||
3576 | set_current_state(TASK_INTERRUPTIBLE); | ||
3577 | schedule(); | ||
3578 | } | ||
3579 | __set_current_state(TASK_RUNNING); | ||
3580 | |||
3581 | return 0; | 3574 | return 0; |
3582 | } | 3575 | } |
3583 | 3576 | ||
@@ -3769,6 +3762,7 @@ static int __net_init pktgen_create_thread(int cpu, struct pktgen_net *pn) | |||
3769 | } | 3762 | } |
3770 | 3763 | ||
3771 | t->net = pn; | 3764 | t->net = pn; |
3765 | get_task_struct(p); | ||
3772 | wake_up_process(p); | 3766 | wake_up_process(p); |
3773 | wait_for_completion(&t->start_done); | 3767 | wait_for_completion(&t->start_done); |
3774 | 3768 | ||
@@ -3891,6 +3885,7 @@ static void __net_exit pg_net_exit(struct net *net) | |||
3891 | t = list_entry(q, struct pktgen_thread, th_list); | 3885 | t = list_entry(q, struct pktgen_thread, th_list); |
3892 | list_del(&t->th_list); | 3886 | list_del(&t->th_list); |
3893 | kthread_stop(t->tsk); | 3887 | kthread_stop(t->tsk); |
3888 | put_task_struct(t->tsk); | ||
3894 | kfree(t); | 3889 | kfree(t); |
3895 | } | 3890 | } |
3896 | 3891 | ||
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 01ced4a889e0..9e433d58d265 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1328,10 +1328,6 @@ static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = { | |||
1328 | [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, | 1328 | [IFLA_INFO_SLAVE_DATA] = { .type = NLA_NESTED }, |
1329 | }; | 1329 | }; |
1330 | 1330 | ||
1331 | static const struct nla_policy ifla_vfinfo_policy[IFLA_VF_INFO_MAX+1] = { | ||
1332 | [IFLA_VF_INFO] = { .type = NLA_NESTED }, | ||
1333 | }; | ||
1334 | |||
1335 | static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { | 1331 | static const struct nla_policy ifla_vf_policy[IFLA_VF_MAX+1] = { |
1336 | [IFLA_VF_MAC] = { .len = sizeof(struct ifla_vf_mac) }, | 1332 | [IFLA_VF_MAC] = { .len = sizeof(struct ifla_vf_mac) }, |
1337 | [IFLA_VF_VLAN] = { .len = sizeof(struct ifla_vf_vlan) }, | 1333 | [IFLA_VF_VLAN] = { .len = sizeof(struct ifla_vf_vlan) }, |
@@ -1488,96 +1484,98 @@ static int validate_linkmsg(struct net_device *dev, struct nlattr *tb[]) | |||
1488 | return 0; | 1484 | return 0; |
1489 | } | 1485 | } |
1490 | 1486 | ||
1491 | static int do_setvfinfo(struct net_device *dev, struct nlattr *attr) | 1487 | static int do_setvfinfo(struct net_device *dev, struct nlattr **tb) |
1492 | { | 1488 | { |
1493 | int rem, err = -EINVAL; | ||
1494 | struct nlattr *vf; | ||
1495 | const struct net_device_ops *ops = dev->netdev_ops; | 1489 | const struct net_device_ops *ops = dev->netdev_ops; |
1490 | int err = -EINVAL; | ||
1496 | 1491 | ||
1497 | nla_for_each_nested(vf, attr, rem) { | 1492 | if (tb[IFLA_VF_MAC]) { |
1498 | switch (nla_type(vf)) { | 1493 | struct ifla_vf_mac *ivm = nla_data(tb[IFLA_VF_MAC]); |
1499 | case IFLA_VF_MAC: { | ||
1500 | struct ifla_vf_mac *ivm; | ||
1501 | ivm = nla_data(vf); | ||
1502 | err = -EOPNOTSUPP; | ||
1503 | if (ops->ndo_set_vf_mac) | ||
1504 | err = ops->ndo_set_vf_mac(dev, ivm->vf, | ||
1505 | ivm->mac); | ||
1506 | break; | ||
1507 | } | ||
1508 | case IFLA_VF_VLAN: { | ||
1509 | struct ifla_vf_vlan *ivv; | ||
1510 | ivv = nla_data(vf); | ||
1511 | err = -EOPNOTSUPP; | ||
1512 | if (ops->ndo_set_vf_vlan) | ||
1513 | err = ops->ndo_set_vf_vlan(dev, ivv->vf, | ||
1514 | ivv->vlan, | ||
1515 | ivv->qos); | ||
1516 | break; | ||
1517 | } | ||
1518 | case IFLA_VF_TX_RATE: { | ||
1519 | struct ifla_vf_tx_rate *ivt; | ||
1520 | struct ifla_vf_info ivf; | ||
1521 | ivt = nla_data(vf); | ||
1522 | err = -EOPNOTSUPP; | ||
1523 | if (ops->ndo_get_vf_config) | ||
1524 | err = ops->ndo_get_vf_config(dev, ivt->vf, | ||
1525 | &ivf); | ||
1526 | if (err) | ||
1527 | break; | ||
1528 | err = -EOPNOTSUPP; | ||
1529 | if (ops->ndo_set_vf_rate) | ||
1530 | err = ops->ndo_set_vf_rate(dev, ivt->vf, | ||
1531 | ivf.min_tx_rate, | ||
1532 | ivt->rate); | ||
1533 | break; | ||
1534 | } | ||
1535 | case IFLA_VF_RATE: { | ||
1536 | struct ifla_vf_rate *ivt; | ||
1537 | ivt = nla_data(vf); | ||
1538 | err = -EOPNOTSUPP; | ||
1539 | if (ops->ndo_set_vf_rate) | ||
1540 | err = ops->ndo_set_vf_rate(dev, ivt->vf, | ||
1541 | ivt->min_tx_rate, | ||
1542 | ivt->max_tx_rate); | ||
1543 | break; | ||
1544 | } | ||
1545 | case IFLA_VF_SPOOFCHK: { | ||
1546 | struct ifla_vf_spoofchk *ivs; | ||
1547 | ivs = nla_data(vf); | ||
1548 | err = -EOPNOTSUPP; | ||
1549 | if (ops->ndo_set_vf_spoofchk) | ||
1550 | err = ops->ndo_set_vf_spoofchk(dev, ivs->vf, | ||
1551 | ivs->setting); | ||
1552 | break; | ||
1553 | } | ||
1554 | case IFLA_VF_LINK_STATE: { | ||
1555 | struct ifla_vf_link_state *ivl; | ||
1556 | ivl = nla_data(vf); | ||
1557 | err = -EOPNOTSUPP; | ||
1558 | if (ops->ndo_set_vf_link_state) | ||
1559 | err = ops->ndo_set_vf_link_state(dev, ivl->vf, | ||
1560 | ivl->link_state); | ||
1561 | break; | ||
1562 | } | ||
1563 | case IFLA_VF_RSS_QUERY_EN: { | ||
1564 | struct ifla_vf_rss_query_en *ivrssq_en; | ||
1565 | 1494 | ||
1566 | ivrssq_en = nla_data(vf); | 1495 | err = -EOPNOTSUPP; |
1567 | err = -EOPNOTSUPP; | 1496 | if (ops->ndo_set_vf_mac) |
1568 | if (ops->ndo_set_vf_rss_query_en) | 1497 | err = ops->ndo_set_vf_mac(dev, ivm->vf, |
1569 | err = ops->ndo_set_vf_rss_query_en(dev, | 1498 | ivm->mac); |
1570 | ivrssq_en->vf, | 1499 | if (err < 0) |
1571 | ivrssq_en->setting); | 1500 | return err; |
1572 | break; | 1501 | } |
1573 | } | 1502 | |
1574 | default: | 1503 | if (tb[IFLA_VF_VLAN]) { |
1575 | err = -EINVAL; | 1504 | struct ifla_vf_vlan *ivv = nla_data(tb[IFLA_VF_VLAN]); |
1576 | break; | 1505 | |
1577 | } | 1506 | err = -EOPNOTSUPP; |
1578 | if (err) | 1507 | if (ops->ndo_set_vf_vlan) |
1579 | break; | 1508 | err = ops->ndo_set_vf_vlan(dev, ivv->vf, ivv->vlan, |
1509 | ivv->qos); | ||
1510 | if (err < 0) | ||
1511 | return err; | ||
1512 | } | ||
1513 | |||
1514 | if (tb[IFLA_VF_TX_RATE]) { | ||
1515 | struct ifla_vf_tx_rate *ivt = nla_data(tb[IFLA_VF_TX_RATE]); | ||
1516 | struct ifla_vf_info ivf; | ||
1517 | |||
1518 | err = -EOPNOTSUPP; | ||
1519 | if (ops->ndo_get_vf_config) | ||
1520 | err = ops->ndo_get_vf_config(dev, ivt->vf, &ivf); | ||
1521 | if (err < 0) | ||
1522 | return err; | ||
1523 | |||
1524 | err = -EOPNOTSUPP; | ||
1525 | if (ops->ndo_set_vf_rate) | ||
1526 | err = ops->ndo_set_vf_rate(dev, ivt->vf, | ||
1527 | ivf.min_tx_rate, | ||
1528 | ivt->rate); | ||
1529 | if (err < 0) | ||
1530 | return err; | ||
1531 | } | ||
1532 | |||
1533 | if (tb[IFLA_VF_RATE]) { | ||
1534 | struct ifla_vf_rate *ivt = nla_data(tb[IFLA_VF_RATE]); | ||
1535 | |||
1536 | err = -EOPNOTSUPP; | ||
1537 | if (ops->ndo_set_vf_rate) | ||
1538 | err = ops->ndo_set_vf_rate(dev, ivt->vf, | ||
1539 | ivt->min_tx_rate, | ||
1540 | ivt->max_tx_rate); | ||
1541 | if (err < 0) | ||
1542 | return err; | ||
1580 | } | 1543 | } |
1544 | |||
1545 | if (tb[IFLA_VF_SPOOFCHK]) { | ||
1546 | struct ifla_vf_spoofchk *ivs = nla_data(tb[IFLA_VF_SPOOFCHK]); | ||
1547 | |||
1548 | err = -EOPNOTSUPP; | ||
1549 | if (ops->ndo_set_vf_spoofchk) | ||
1550 | err = ops->ndo_set_vf_spoofchk(dev, ivs->vf, | ||
1551 | ivs->setting); | ||
1552 | if (err < 0) | ||
1553 | return err; | ||
1554 | } | ||
1555 | |||
1556 | if (tb[IFLA_VF_LINK_STATE]) { | ||
1557 | struct ifla_vf_link_state *ivl = nla_data(tb[IFLA_VF_LINK_STATE]); | ||
1558 | |||
1559 | err = -EOPNOTSUPP; | ||
1560 | if (ops->ndo_set_vf_link_state) | ||
1561 | err = ops->ndo_set_vf_link_state(dev, ivl->vf, | ||
1562 | ivl->link_state); | ||
1563 | if (err < 0) | ||
1564 | return err; | ||
1565 | } | ||
1566 | |||
1567 | if (tb[IFLA_VF_RSS_QUERY_EN]) { | ||
1568 | struct ifla_vf_rss_query_en *ivrssq_en; | ||
1569 | |||
1570 | err = -EOPNOTSUPP; | ||
1571 | ivrssq_en = nla_data(tb[IFLA_VF_RSS_QUERY_EN]); | ||
1572 | if (ops->ndo_set_vf_rss_query_en) | ||
1573 | err = ops->ndo_set_vf_rss_query_en(dev, ivrssq_en->vf, | ||
1574 | ivrssq_en->setting); | ||
1575 | if (err < 0) | ||
1576 | return err; | ||
1577 | } | ||
1578 | |||
1581 | return err; | 1579 | return err; |
1582 | } | 1580 | } |
1583 | 1581 | ||
@@ -1773,14 +1771,21 @@ static int do_setlink(const struct sk_buff *skb, | |||
1773 | } | 1771 | } |
1774 | 1772 | ||
1775 | if (tb[IFLA_VFINFO_LIST]) { | 1773 | if (tb[IFLA_VFINFO_LIST]) { |
1774 | struct nlattr *vfinfo[IFLA_VF_MAX + 1]; | ||
1776 | struct nlattr *attr; | 1775 | struct nlattr *attr; |
1777 | int rem; | 1776 | int rem; |
1777 | |||
1778 | nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) { | 1778 | nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) { |
1779 | if (nla_type(attr) != IFLA_VF_INFO) { | 1779 | if (nla_type(attr) != IFLA_VF_INFO || |
1780 | nla_len(attr) < NLA_HDRLEN) { | ||
1780 | err = -EINVAL; | 1781 | err = -EINVAL; |
1781 | goto errout; | 1782 | goto errout; |
1782 | } | 1783 | } |
1783 | err = do_setvfinfo(dev, attr); | 1784 | err = nla_parse_nested(vfinfo, IFLA_VF_MAX, attr, |
1785 | ifla_vf_policy); | ||
1786 | if (err < 0) | ||
1787 | goto errout; | ||
1788 | err = do_setvfinfo(dev, vfinfo); | ||
1784 | if (err < 0) | 1789 | if (err < 0) |
1785 | goto errout; | 1790 | goto errout; |
1786 | status |= DO_SETLINK_NOTIFY; | 1791 | status |= DO_SETLINK_NOTIFY; |
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index 392e29a0227d..b445d492c115 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c | |||
@@ -630,7 +630,7 @@ static int dsa_of_probe(struct device *dev) | |||
630 | continue; | 630 | continue; |
631 | 631 | ||
632 | cd->sw_addr = be32_to_cpup(sw_addr); | 632 | cd->sw_addr = be32_to_cpup(sw_addr); |
633 | if (cd->sw_addr > PHY_MAX_ADDR) | 633 | if (cd->sw_addr >= PHY_MAX_ADDR) |
634 | continue; | 634 | continue; |
635 | 635 | ||
636 | if (!of_property_read_u32(child, "eeprom-length", &eeprom_len)) | 636 | if (!of_property_read_u32(child, "eeprom-length", &eeprom_len)) |
@@ -642,6 +642,8 @@ static int dsa_of_probe(struct device *dev) | |||
642 | continue; | 642 | continue; |
643 | 643 | ||
644 | port_index = be32_to_cpup(port_reg); | 644 | port_index = be32_to_cpup(port_reg); |
645 | if (port_index >= DSA_MAX_PORTS) | ||
646 | break; | ||
645 | 647 | ||
646 | port_name = of_get_property(port, "label", NULL); | 648 | port_name = of_get_property(port, "label", NULL); |
647 | if (!port_name) | 649 | if (!port_name) |
@@ -666,8 +668,6 @@ static int dsa_of_probe(struct device *dev) | |||
666 | goto out_free_chip; | 668 | goto out_free_chip; |
667 | } | 669 | } |
668 | 670 | ||
669 | if (port_index == DSA_MAX_PORTS) | ||
670 | break; | ||
671 | } | 671 | } |
672 | } | 672 | } |
673 | 673 | ||
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 7498716e8f54..e813196c91c7 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
@@ -1740,6 +1740,8 @@ static int inet_netconf_msgsize_devconf(int type) | |||
1740 | size += nla_total_size(4); | 1740 | size += nla_total_size(4); |
1741 | if (type == -1 || type == NETCONFA_PROXY_NEIGH) | 1741 | if (type == -1 || type == NETCONFA_PROXY_NEIGH) |
1742 | size += nla_total_size(4); | 1742 | size += nla_total_size(4); |
1743 | if (type == -1 || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN) | ||
1744 | size += nla_total_size(4); | ||
1743 | 1745 | ||
1744 | return size; | 1746 | return size; |
1745 | } | 1747 | } |
@@ -1780,6 +1782,10 @@ static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex, | |||
1780 | nla_put_s32(skb, NETCONFA_PROXY_NEIGH, | 1782 | nla_put_s32(skb, NETCONFA_PROXY_NEIGH, |
1781 | IPV4_DEVCONF(*devconf, PROXY_ARP)) < 0) | 1783 | IPV4_DEVCONF(*devconf, PROXY_ARP)) < 0) |
1782 | goto nla_put_failure; | 1784 | goto nla_put_failure; |
1785 | if ((type == -1 || type == NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN) && | ||
1786 | nla_put_s32(skb, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, | ||
1787 | IPV4_DEVCONF(*devconf, IGNORE_ROUTES_WITH_LINKDOWN)) < 0) | ||
1788 | goto nla_put_failure; | ||
1783 | 1789 | ||
1784 | nlmsg_end(skb, nlh); | 1790 | nlmsg_end(skb, nlh); |
1785 | return 0; | 1791 | return 0; |
@@ -1819,6 +1825,7 @@ static const struct nla_policy devconf_ipv4_policy[NETCONFA_MAX+1] = { | |||
1819 | [NETCONFA_FORWARDING] = { .len = sizeof(int) }, | 1825 | [NETCONFA_FORWARDING] = { .len = sizeof(int) }, |
1820 | [NETCONFA_RP_FILTER] = { .len = sizeof(int) }, | 1826 | [NETCONFA_RP_FILTER] = { .len = sizeof(int) }, |
1821 | [NETCONFA_PROXY_NEIGH] = { .len = sizeof(int) }, | 1827 | [NETCONFA_PROXY_NEIGH] = { .len = sizeof(int) }, |
1828 | [NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN] = { .len = sizeof(int) }, | ||
1822 | }; | 1829 | }; |
1823 | 1830 | ||
1824 | static int inet_netconf_get_devconf(struct sk_buff *in_skb, | 1831 | static int inet_netconf_get_devconf(struct sk_buff *in_skb, |
@@ -2048,6 +2055,12 @@ static int devinet_conf_proc(struct ctl_table *ctl, int write, | |||
2048 | inet_netconf_notify_devconf(net, NETCONFA_PROXY_NEIGH, | 2055 | inet_netconf_notify_devconf(net, NETCONFA_PROXY_NEIGH, |
2049 | ifindex, cnf); | 2056 | ifindex, cnf); |
2050 | } | 2057 | } |
2058 | if (i == IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN - 1 && | ||
2059 | new_value != old_value) { | ||
2060 | ifindex = devinet_conf_ifindex(net, cnf); | ||
2061 | inet_netconf_notify_devconf(net, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, | ||
2062 | ifindex, cnf); | ||
2063 | } | ||
2051 | } | 2064 | } |
2052 | 2065 | ||
2053 | return ret; | 2066 | return ret; |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 9bc26677058e..c3b1f3a0f4cf 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
@@ -152,8 +152,8 @@ int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, | |||
152 | inet6_sk(sk)->tclass) < 0) | 152 | inet6_sk(sk)->tclass) < 0) |
153 | goto errout; | 153 | goto errout; |
154 | 154 | ||
155 | if (ipv6_only_sock(sk) && | 155 | if (((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) && |
156 | nla_put_u8(skb, INET_DIAG_SKV6ONLY, 1)) | 156 | nla_put_u8(skb, INET_DIAG_SKV6ONLY, ipv6_only_sock(sk))) |
157 | goto errout; | 157 | goto errout; |
158 | } | 158 | } |
159 | #endif | 159 | #endif |
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index 4c2c3ba4ba65..626d9e56a6bd 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c | |||
@@ -586,7 +586,8 @@ int ip_tunnel_encap(struct sk_buff *skb, struct ip_tunnel *t, | |||
586 | EXPORT_SYMBOL(ip_tunnel_encap); | 586 | EXPORT_SYMBOL(ip_tunnel_encap); |
587 | 587 | ||
588 | static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb, | 588 | static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb, |
589 | struct rtable *rt, __be16 df) | 589 | struct rtable *rt, __be16 df, |
590 | const struct iphdr *inner_iph) | ||
590 | { | 591 | { |
591 | struct ip_tunnel *tunnel = netdev_priv(dev); | 592 | struct ip_tunnel *tunnel = netdev_priv(dev); |
592 | int pkt_size = skb->len - tunnel->hlen - dev->hard_header_len; | 593 | int pkt_size = skb->len - tunnel->hlen - dev->hard_header_len; |
@@ -603,7 +604,8 @@ static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb, | |||
603 | 604 | ||
604 | if (skb->protocol == htons(ETH_P_IP)) { | 605 | if (skb->protocol == htons(ETH_P_IP)) { |
605 | if (!skb_is_gso(skb) && | 606 | if (!skb_is_gso(skb) && |
606 | (df & htons(IP_DF)) && mtu < pkt_size) { | 607 | (inner_iph->frag_off & htons(IP_DF)) && |
608 | mtu < pkt_size) { | ||
607 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); | 609 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); |
608 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); | 610 | icmp_send(skb, ICMP_DEST_UNREACH, ICMP_FRAG_NEEDED, htonl(mtu)); |
609 | return -E2BIG; | 611 | return -E2BIG; |
@@ -737,7 +739,7 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | |||
737 | goto tx_error; | 739 | goto tx_error; |
738 | } | 740 | } |
739 | 741 | ||
740 | if (tnl_update_pmtu(dev, skb, rt, tnl_params->frag_off)) { | 742 | if (tnl_update_pmtu(dev, skb, rt, tnl_params->frag_off, inner_iph)) { |
741 | ip_rt_put(rt); | 743 | ip_rt_put(rt); |
742 | goto tx_error; | 744 | goto tx_error; |
743 | } | 745 | } |
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index 95c9b6eece25..92305a1a021a 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
@@ -254,9 +254,10 @@ unsigned int arpt_do_table(struct sk_buff *skb, | |||
254 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); | 254 | static const char nulldevname[IFNAMSIZ] __attribute__((aligned(sizeof(long)))); |
255 | unsigned int verdict = NF_DROP; | 255 | unsigned int verdict = NF_DROP; |
256 | const struct arphdr *arp; | 256 | const struct arphdr *arp; |
257 | struct arpt_entry *e, *back; | 257 | struct arpt_entry *e, **jumpstack; |
258 | const char *indev, *outdev; | 258 | const char *indev, *outdev; |
259 | const void *table_base; | 259 | const void *table_base; |
260 | unsigned int cpu, stackidx = 0; | ||
260 | const struct xt_table_info *private; | 261 | const struct xt_table_info *private; |
261 | struct xt_action_param acpar; | 262 | struct xt_action_param acpar; |
262 | unsigned int addend; | 263 | unsigned int addend; |
@@ -270,15 +271,16 @@ unsigned int arpt_do_table(struct sk_buff *skb, | |||
270 | local_bh_disable(); | 271 | local_bh_disable(); |
271 | addend = xt_write_recseq_begin(); | 272 | addend = xt_write_recseq_begin(); |
272 | private = table->private; | 273 | private = table->private; |
274 | cpu = smp_processor_id(); | ||
273 | /* | 275 | /* |
274 | * Ensure we load private-> members after we've fetched the base | 276 | * Ensure we load private-> members after we've fetched the base |
275 | * pointer. | 277 | * pointer. |
276 | */ | 278 | */ |
277 | smp_read_barrier_depends(); | 279 | smp_read_barrier_depends(); |
278 | table_base = private->entries; | 280 | table_base = private->entries; |
281 | jumpstack = (struct arpt_entry **)private->jumpstack[cpu]; | ||
279 | 282 | ||
280 | e = get_entry(table_base, private->hook_entry[hook]); | 283 | e = get_entry(table_base, private->hook_entry[hook]); |
281 | back = get_entry(table_base, private->underflow[hook]); | ||
282 | 284 | ||
283 | acpar.in = state->in; | 285 | acpar.in = state->in; |
284 | acpar.out = state->out; | 286 | acpar.out = state->out; |
@@ -312,18 +314,23 @@ unsigned int arpt_do_table(struct sk_buff *skb, | |||
312 | verdict = (unsigned int)(-v) - 1; | 314 | verdict = (unsigned int)(-v) - 1; |
313 | break; | 315 | break; |
314 | } | 316 | } |
315 | e = back; | 317 | if (stackidx == 0) { |
316 | back = get_entry(table_base, back->comefrom); | 318 | e = get_entry(table_base, |
319 | private->underflow[hook]); | ||
320 | } else { | ||
321 | e = jumpstack[--stackidx]; | ||
322 | e = arpt_next_entry(e); | ||
323 | } | ||
317 | continue; | 324 | continue; |
318 | } | 325 | } |
319 | if (table_base + v | 326 | if (table_base + v |
320 | != arpt_next_entry(e)) { | 327 | != arpt_next_entry(e)) { |
321 | /* Save old back ptr in next entry */ | ||
322 | struct arpt_entry *next = arpt_next_entry(e); | ||
323 | next->comefrom = (void *)back - table_base; | ||
324 | 328 | ||
325 | /* set back pointer to next entry */ | 329 | if (stackidx >= private->stacksize) { |
326 | back = next; | 330 | verdict = NF_DROP; |
331 | break; | ||
332 | } | ||
333 | jumpstack[stackidx++] = e; | ||
327 | } | 334 | } |
328 | 335 | ||
329 | e = get_entry(table_base, v); | 336 | e = get_entry(table_base, v); |
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index f2e464eba5ef..57990c929cd8 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c | |||
@@ -331,10 +331,10 @@ int ip6_mc_input(struct sk_buff *skb) | |||
331 | if (offset < 0) | 331 | if (offset < 0) |
332 | goto out; | 332 | goto out; |
333 | 333 | ||
334 | if (!ipv6_is_mld(skb, nexthdr, offset)) | 334 | if (ipv6_is_mld(skb, nexthdr, offset)) |
335 | goto out; | 335 | deliver = true; |
336 | 336 | ||
337 | deliver = true; | 337 | goto out; |
338 | } | 338 | } |
339 | /* unknown RA - process it normally */ | 339 | /* unknown RA - process it normally */ |
340 | } | 340 | } |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 1a1122a6bbf5..6090969937f8 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -369,10 +369,7 @@ static void ip6_dst_destroy(struct dst_entry *dst) | |||
369 | struct inet6_dev *idev; | 369 | struct inet6_dev *idev; |
370 | 370 | ||
371 | dst_destroy_metrics_generic(dst); | 371 | dst_destroy_metrics_generic(dst); |
372 | 372 | free_percpu(rt->rt6i_pcpu); | |
373 | if (rt->rt6i_pcpu) | ||
374 | free_percpu(rt->rt6i_pcpu); | ||
375 | |||
376 | rt6_uncached_list_del(rt); | 373 | rt6_uncached_list_del(rt); |
377 | 374 | ||
378 | idev = rt->rt6i_idev; | 375 | idev = rt->rt6i_idev; |
diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c index cd60d397fe05..8a8b2abc35ff 100644 --- a/net/netfilter/nf_queue.c +++ b/net/netfilter/nf_queue.c | |||
@@ -213,7 +213,7 @@ void nf_reinject(struct nf_queue_entry *entry, unsigned int verdict) | |||
213 | 213 | ||
214 | if (verdict == NF_ACCEPT) { | 214 | if (verdict == NF_ACCEPT) { |
215 | next_hook: | 215 | next_hook: |
216 | verdict = nf_iterate(&nf_hooks[entry->state.pf][entry->state.hook], | 216 | verdict = nf_iterate(entry->state.hook_list, |
217 | skb, &entry->state, &elem); | 217 | skb, &entry->state, &elem); |
218 | } | 218 | } |
219 | 219 | ||
diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index 8b117c90ecd7..0c0e8ecf02ab 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c | |||
@@ -269,6 +269,12 @@ static void nfnl_err_deliver(struct list_head *err_list, struct sk_buff *skb) | |||
269 | } | 269 | } |
270 | } | 270 | } |
271 | 271 | ||
272 | enum { | ||
273 | NFNL_BATCH_FAILURE = (1 << 0), | ||
274 | NFNL_BATCH_DONE = (1 << 1), | ||
275 | NFNL_BATCH_REPLAY = (1 << 2), | ||
276 | }; | ||
277 | |||
272 | static void nfnetlink_rcv_batch(struct sk_buff *skb, struct nlmsghdr *nlh, | 278 | static void nfnetlink_rcv_batch(struct sk_buff *skb, struct nlmsghdr *nlh, |
273 | u_int16_t subsys_id) | 279 | u_int16_t subsys_id) |
274 | { | 280 | { |
@@ -276,13 +282,15 @@ static void nfnetlink_rcv_batch(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
276 | struct net *net = sock_net(skb->sk); | 282 | struct net *net = sock_net(skb->sk); |
277 | const struct nfnetlink_subsystem *ss; | 283 | const struct nfnetlink_subsystem *ss; |
278 | const struct nfnl_callback *nc; | 284 | const struct nfnl_callback *nc; |
279 | bool success = true, done = false; | ||
280 | static LIST_HEAD(err_list); | 285 | static LIST_HEAD(err_list); |
286 | u32 status; | ||
281 | int err; | 287 | int err; |
282 | 288 | ||
283 | if (subsys_id >= NFNL_SUBSYS_COUNT) | 289 | if (subsys_id >= NFNL_SUBSYS_COUNT) |
284 | return netlink_ack(skb, nlh, -EINVAL); | 290 | return netlink_ack(skb, nlh, -EINVAL); |
285 | replay: | 291 | replay: |
292 | status = 0; | ||
293 | |||
286 | skb = netlink_skb_clone(oskb, GFP_KERNEL); | 294 | skb = netlink_skb_clone(oskb, GFP_KERNEL); |
287 | if (!skb) | 295 | if (!skb) |
288 | return netlink_ack(oskb, nlh, -ENOMEM); | 296 | return netlink_ack(oskb, nlh, -ENOMEM); |
@@ -336,10 +344,10 @@ replay: | |||
336 | if (type == NFNL_MSG_BATCH_BEGIN) { | 344 | if (type == NFNL_MSG_BATCH_BEGIN) { |
337 | /* Malformed: Batch begin twice */ | 345 | /* Malformed: Batch begin twice */ |
338 | nfnl_err_reset(&err_list); | 346 | nfnl_err_reset(&err_list); |
339 | success = false; | 347 | status |= NFNL_BATCH_FAILURE; |
340 | goto done; | 348 | goto done; |
341 | } else if (type == NFNL_MSG_BATCH_END) { | 349 | } else if (type == NFNL_MSG_BATCH_END) { |
342 | done = true; | 350 | status |= NFNL_BATCH_DONE; |
343 | goto done; | 351 | goto done; |
344 | } else if (type < NLMSG_MIN_TYPE) { | 352 | } else if (type < NLMSG_MIN_TYPE) { |
345 | err = -EINVAL; | 353 | err = -EINVAL; |
@@ -382,11 +390,8 @@ replay: | |||
382 | * original skb. | 390 | * original skb. |
383 | */ | 391 | */ |
384 | if (err == -EAGAIN) { | 392 | if (err == -EAGAIN) { |
385 | nfnl_err_reset(&err_list); | 393 | status |= NFNL_BATCH_REPLAY; |
386 | ss->abort(oskb); | 394 | goto next; |
387 | nfnl_unlock(subsys_id); | ||
388 | kfree_skb(skb); | ||
389 | goto replay; | ||
390 | } | 395 | } |
391 | } | 396 | } |
392 | ack: | 397 | ack: |
@@ -402,7 +407,7 @@ ack: | |||
402 | */ | 407 | */ |
403 | nfnl_err_reset(&err_list); | 408 | nfnl_err_reset(&err_list); |
404 | netlink_ack(skb, nlmsg_hdr(oskb), -ENOMEM); | 409 | netlink_ack(skb, nlmsg_hdr(oskb), -ENOMEM); |
405 | success = false; | 410 | status |= NFNL_BATCH_FAILURE; |
406 | goto done; | 411 | goto done; |
407 | } | 412 | } |
408 | /* We don't stop processing the batch on errors, thus, | 413 | /* We don't stop processing the batch on errors, thus, |
@@ -410,19 +415,26 @@ ack: | |||
410 | * triggers. | 415 | * triggers. |
411 | */ | 416 | */ |
412 | if (err) | 417 | if (err) |
413 | success = false; | 418 | status |= NFNL_BATCH_FAILURE; |
414 | } | 419 | } |
415 | 420 | next: | |
416 | msglen = NLMSG_ALIGN(nlh->nlmsg_len); | 421 | msglen = NLMSG_ALIGN(nlh->nlmsg_len); |
417 | if (msglen > skb->len) | 422 | if (msglen > skb->len) |
418 | msglen = skb->len; | 423 | msglen = skb->len; |
419 | skb_pull(skb, msglen); | 424 | skb_pull(skb, msglen); |
420 | } | 425 | } |
421 | done: | 426 | done: |
422 | if (success && done) | 427 | if (status & NFNL_BATCH_REPLAY) { |
428 | ss->abort(oskb); | ||
429 | nfnl_err_reset(&err_list); | ||
430 | nfnl_unlock(subsys_id); | ||
431 | kfree_skb(skb); | ||
432 | goto replay; | ||
433 | } else if (status == NFNL_BATCH_DONE) { | ||
423 | ss->commit(oskb); | 434 | ss->commit(oskb); |
424 | else | 435 | } else { |
425 | ss->abort(oskb); | 436 | ss->abort(oskb); |
437 | } | ||
426 | 438 | ||
427 | nfnl_err_deliver(&err_list, oskb); | 439 | nfnl_err_deliver(&err_list, oskb); |
428 | nfnl_unlock(subsys_id); | 440 | nfnl_unlock(subsys_id); |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index dea925388a5b..9a0ae7172f92 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
@@ -158,7 +158,7 @@ static int __netlink_remove_tap(struct netlink_tap *nt) | |||
158 | out: | 158 | out: |
159 | spin_unlock(&netlink_tap_lock); | 159 | spin_unlock(&netlink_tap_lock); |
160 | 160 | ||
161 | if (found && nt->module) | 161 | if (found) |
162 | module_put(nt->module); | 162 | module_put(nt->module); |
163 | 163 | ||
164 | return found ? 0 : -ENODEV; | 164 | return found ? 0 : -ENODEV; |
diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c index 273b8bff6ba4..657ba9f5d308 100644 --- a/net/rds/ib_rdma.c +++ b/net/rds/ib_rdma.c | |||
@@ -759,8 +759,10 @@ void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents, | |||
759 | } | 759 | } |
760 | 760 | ||
761 | ibmr = rds_ib_alloc_fmr(rds_ibdev); | 761 | ibmr = rds_ib_alloc_fmr(rds_ibdev); |
762 | if (IS_ERR(ibmr)) | 762 | if (IS_ERR(ibmr)) { |
763 | rds_ib_dev_put(rds_ibdev); | ||
763 | return ibmr; | 764 | return ibmr; |
765 | } | ||
764 | 766 | ||
765 | ret = rds_ib_map_fmr(rds_ibdev, ibmr, sg, nents); | 767 | ret = rds_ib_map_fmr(rds_ibdev, ibmr, sg, nents); |
766 | if (ret == 0) | 768 | if (ret == 0) |
diff --git a/net/rds/transport.c b/net/rds/transport.c index 8b4a6cd2c3a7..83498e1c75b8 100644 --- a/net/rds/transport.c +++ b/net/rds/transport.c | |||
@@ -73,7 +73,7 @@ EXPORT_SYMBOL_GPL(rds_trans_unregister); | |||
73 | 73 | ||
74 | void rds_trans_put(struct rds_transport *trans) | 74 | void rds_trans_put(struct rds_transport *trans) |
75 | { | 75 | { |
76 | if (trans && trans->t_owner) | 76 | if (trans) |
77 | module_put(trans->t_owner); | 77 | module_put(trans->t_owner); |
78 | } | 78 | } |
79 | 79 | ||
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c index 84f77a054025..9f2add3cba26 100644 --- a/net/switchdev/switchdev.c +++ b/net/switchdev/switchdev.c | |||
@@ -171,8 +171,10 @@ int switchdev_port_attr_set(struct net_device *dev, struct switchdev_attr *attr) | |||
171 | * released. | 171 | * released. |
172 | */ | 172 | */ |
173 | 173 | ||
174 | attr->trans = SWITCHDEV_TRANS_ABORT; | 174 | if (err != -EOPNOTSUPP) { |
175 | __switchdev_port_attr_set(dev, attr); | 175 | attr->trans = SWITCHDEV_TRANS_ABORT; |
176 | __switchdev_port_attr_set(dev, attr); | ||
177 | } | ||
176 | 178 | ||
177 | return err; | 179 | return err; |
178 | } | 180 | } |
@@ -249,8 +251,10 @@ int switchdev_port_obj_add(struct net_device *dev, struct switchdev_obj *obj) | |||
249 | * released. | 251 | * released. |
250 | */ | 252 | */ |
251 | 253 | ||
252 | obj->trans = SWITCHDEV_TRANS_ABORT; | 254 | if (err != -EOPNOTSUPP) { |
253 | __switchdev_port_obj_add(dev, obj); | 255 | obj->trans = SWITCHDEV_TRANS_ABORT; |
256 | __switchdev_port_obj_add(dev, obj); | ||
257 | } | ||
254 | 258 | ||
255 | return err; | 259 | return err; |
256 | } | 260 | } |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 46b6ed534ef2..3a7567f690f3 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
@@ -2007,6 +2007,7 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags) | |||
2007 | res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, 1); | 2007 | res = tipc_sk_create(sock_net(sock->sk), new_sock, 0, 1); |
2008 | if (res) | 2008 | if (res) |
2009 | goto exit; | 2009 | goto exit; |
2010 | security_sk_clone(sock->sk, new_sock->sk); | ||
2010 | 2011 | ||
2011 | new_sk = new_sock->sk; | 2012 | new_sk = new_sock->sk; |
2012 | new_tsock = tipc_sk(new_sk); | 2013 | new_tsock = tipc_sk(new_sk); |