aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/8021q/vlan.c6
-rw-r--r--net/dsa/switch.c4
-rw-r--r--net/ipv4/tcp_input.c3
-rw-r--r--net/ipv4/tcp_offload.c12
-rw-r--r--net/rds/ib_recv.c10
5 files changed, 23 insertions, 12 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 9649579b5b9f..4a72ee4e2ae9 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -376,6 +376,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
376 dev->name); 376 dev->name);
377 vlan_vid_add(dev, htons(ETH_P_8021Q), 0); 377 vlan_vid_add(dev, htons(ETH_P_8021Q), 0);
378 } 378 }
379 if (event == NETDEV_DOWN &&
380 (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
381 vlan_vid_del(dev, htons(ETH_P_8021Q), 0);
379 382
380 vlan_info = rtnl_dereference(dev->vlan_info); 383 vlan_info = rtnl_dereference(dev->vlan_info);
381 if (!vlan_info) 384 if (!vlan_info)
@@ -423,9 +426,6 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
423 struct net_device *tmp; 426 struct net_device *tmp;
424 LIST_HEAD(close_list); 427 LIST_HEAD(close_list);
425 428
426 if (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)
427 vlan_vid_del(dev, htons(ETH_P_8021Q), 0);
428
429 /* Put all VLANs for this dev in the down state too. */ 429 /* Put all VLANs for this dev in the down state too. */
430 vlan_group_for_each_dev(grp, i, vlandev) { 430 vlan_group_for_each_dev(grp, i, vlandev) {
431 flgs = vlandev->flags; 431 flgs = vlandev->flags;
diff --git a/net/dsa/switch.c b/net/dsa/switch.c
index e6c06aa349a6..1e2929f4290a 100644
--- a/net/dsa/switch.c
+++ b/net/dsa/switch.c
@@ -133,6 +133,8 @@ static int dsa_switch_mdb_add(struct dsa_switch *ds,
133 if (err) 133 if (err)
134 return err; 134 return err;
135 } 135 }
136
137 return 0;
136 } 138 }
137 139
138 for_each_set_bit(port, group, ds->num_ports) 140 for_each_set_bit(port, group, ds->num_ports)
@@ -180,6 +182,8 @@ static int dsa_switch_vlan_add(struct dsa_switch *ds,
180 if (err) 182 if (err)
181 return err; 183 return err;
182 } 184 }
185
186 return 0;
183 } 187 }
184 188
185 for_each_set_bit(port, members, ds->num_ports) 189 for_each_set_bit(port, members, ds->num_ports)
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index b2fc7163bd40..b6bb3cdfad09 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -2615,7 +2615,6 @@ void tcp_simple_retransmit(struct sock *sk)
2615 struct tcp_sock *tp = tcp_sk(sk); 2615 struct tcp_sock *tp = tcp_sk(sk);
2616 struct sk_buff *skb; 2616 struct sk_buff *skb;
2617 unsigned int mss = tcp_current_mss(sk); 2617 unsigned int mss = tcp_current_mss(sk);
2618 u32 prior_lost = tp->lost_out;
2619 2618
2620 tcp_for_write_queue(skb, sk) { 2619 tcp_for_write_queue(skb, sk) {
2621 if (skb == tcp_send_head(sk)) 2620 if (skb == tcp_send_head(sk))
@@ -2632,7 +2631,7 @@ void tcp_simple_retransmit(struct sock *sk)
2632 2631
2633 tcp_clear_retrans_hints_partial(tp); 2632 tcp_clear_retrans_hints_partial(tp);
2634 2633
2635 if (prior_lost == tp->lost_out) 2634 if (!tp->lost_out)
2636 return; 2635 return;
2637 2636
2638 if (tcp_is_reno(tp)) 2637 if (tcp_is_reno(tp))
diff --git a/net/ipv4/tcp_offload.c b/net/ipv4/tcp_offload.c
index 11f69bbf9307..b6a2aa1dcf56 100644
--- a/net/ipv4/tcp_offload.c
+++ b/net/ipv4/tcp_offload.c
@@ -149,11 +149,19 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
149 * is freed by GSO engine 149 * is freed by GSO engine
150 */ 150 */
151 if (copy_destructor) { 151 if (copy_destructor) {
152 int delta;
153
152 swap(gso_skb->sk, skb->sk); 154 swap(gso_skb->sk, skb->sk);
153 swap(gso_skb->destructor, skb->destructor); 155 swap(gso_skb->destructor, skb->destructor);
154 sum_truesize += skb->truesize; 156 sum_truesize += skb->truesize;
155 refcount_add(sum_truesize - gso_skb->truesize, 157 delta = sum_truesize - gso_skb->truesize;
156 &skb->sk->sk_wmem_alloc); 158 /* In some pathological cases, delta can be negative.
159 * We need to either use refcount_add() or refcount_sub_and_test()
160 */
161 if (likely(delta >= 0))
162 refcount_add(delta, &skb->sk->sk_wmem_alloc);
163 else
164 WARN_ON_ONCE(refcount_sub_and_test(-delta, &skb->sk->sk_wmem_alloc));
157 } 165 }
158 166
159 delta = htonl(oldlen + (skb_tail_pointer(skb) - 167 delta = htonl(oldlen + (skb_tail_pointer(skb) -
diff --git a/net/rds/ib_recv.c b/net/rds/ib_recv.c
index 9722bf839d9d..b4e421aa9727 100644
--- a/net/rds/ib_recv.c
+++ b/net/rds/ib_recv.c
@@ -410,14 +410,14 @@ void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp)
410 break; 410 break;
411 } 411 }
412 412
413 /* XXX when can this fail? */ 413 rdsdebug("recv %p ibinc %p page %p addr %lu\n", recv,
414 ret = ib_post_recv(ic->i_cm_id->qp, &recv->r_wr, &failed_wr);
415 rdsdebug("recv %p ibinc %p page %p addr %lu ret %d\n", recv,
416 recv->r_ibinc, sg_page(&recv->r_frag->f_sg), 414 recv->r_ibinc, sg_page(&recv->r_frag->f_sg),
417 (long) ib_sg_dma_address( 415 (long) ib_sg_dma_address(
418 ic->i_cm_id->device, 416 ic->i_cm_id->device,
419 &recv->r_frag->f_sg), 417 &recv->r_frag->f_sg));
420 ret); 418
419 /* XXX when can this fail? */
420 ret = ib_post_recv(ic->i_cm_id->qp, &recv->r_wr, &failed_wr);
421 if (ret) { 421 if (ret) {
422 rds_ib_conn_error(conn, "recv post on " 422 rds_ib_conn_error(conn, "recv post on "
423 "%pI4 returned %d, disconnecting and " 423 "%pI4 returned %d, disconnecting and "