aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-06-13 02:54:16 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-06-13 02:54:16 -0400
commitc8d17b451aa18b07b60e771addf17a5fdd4138c7 (patch)
tree18f1303630dd890b45cfc37fd53033422dda7d44 /net
parentb85dfd30cb37318587018ee430c2c1cfabf3dabc (diff)
parentb07d496177cd3bc4b70fb8a5e85ede24cb403a11 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) Fix uninitialized struct station_info in cfg80211_wireless_stats(), from Johannes Berg. 2) Revert commit attempt to fix ipv6 protocol resubmission, it adds regressions. 3) Endless loops can be created in bridge port lists, fix from Nikolay Aleksandrov. 4) Don't WARN_ON() if sk->sk_forward_alloc is non-zero in sk_clear_memalloc, it is a legal situation during swap deactivation. Fix from Mel Gorman. 5) Fix order of disabling interrupts and unlocking NAPI in enic driver to avoid a race. From Govindarajulu Varadarajan. 6) High and low register writes are swapped when programming the start of periodic output in igb driver. From Richard Cochran. 7) Fix device rename handling in mpls stack, from Robert Shearman. 8) Do not trigger compaction synchronously when optimistically trying to allocate an order 3 page in alloc_skb_with_frags() and skb_page_frag_refill(). From Shaohua Li. 9) Authentication with COOKIE_ECHO is not handled properly in SCTP, fix from Marcelo Ricardo Leitner. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: Doc: networking: Fix URL for wiki.wireshark.org in udplite.txt sctp: allow authenticating DATA chunks that are bundled with COOKIE_ECHO net: don't wait for order-3 page allocation mpls: handle device renames for per-device sysctls net: igb: fix the start time for periodic output signals enic: fix memory leak in rq_clean enic: check return value for stat dump enic: unlock napi busy poll before unmasking intr net, swap: Remove a warning and clarify why sk_mem_reclaim is required when deactivating swap bridge: fix multicast router rlist endless loop tipc: disconnect socket directly after probe failure Revert "ipv6: Fix protocol resubmission" cfg80211: wext: clear sinfo struct before calling driver
Diffstat (limited to 'net')
-rw-r--r--net/bridge/br_multicast.c7
-rw-r--r--net/core/skbuff.c2
-rw-r--r--net/core/sock.c15
-rw-r--r--net/ipv6/ip6_input.c8
-rw-r--r--net/mpls/af_mpls.c11
-rw-r--r--net/sctp/auth.c11
-rw-r--r--net/tipc/socket.c16
-rw-r--r--net/wireless/wext-compat.c2
8 files changed, 47 insertions, 25 deletions
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index 22fd0419b314..ff667e18b2d6 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -1167,6 +1167,9 @@ static void br_multicast_add_router(struct net_bridge *br,
1167 struct net_bridge_port *p; 1167 struct net_bridge_port *p;
1168 struct hlist_node *slot = NULL; 1168 struct hlist_node *slot = NULL;
1169 1169
1170 if (!hlist_unhashed(&port->rlist))
1171 return;
1172
1170 hlist_for_each_entry(p, &br->router_list, rlist) { 1173 hlist_for_each_entry(p, &br->router_list, rlist) {
1171 if ((unsigned long) port >= (unsigned long) p) 1174 if ((unsigned long) port >= (unsigned long) p)
1172 break; 1175 break;
@@ -1194,12 +1197,8 @@ static void br_multicast_mark_router(struct net_bridge *br,
1194 if (port->multicast_router != 1) 1197 if (port->multicast_router != 1)
1195 return; 1198 return;
1196 1199
1197 if (!hlist_unhashed(&port->rlist))
1198 goto timer;
1199
1200 br_multicast_add_router(br, port); 1200 br_multicast_add_router(br, port);
1201 1201
1202timer:
1203 mod_timer(&port->multicast_router_timer, 1202 mod_timer(&port->multicast_router_timer,
1204 now + br->multicast_querier_interval); 1203 now + br->multicast_querier_interval);
1205} 1204}
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 3cfff2a3d651..41ec02242ea7 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -4398,7 +4398,7 @@ struct sk_buff *alloc_skb_with_frags(unsigned long header_len,
4398 4398
4399 while (order) { 4399 while (order) {
4400 if (npages >= 1 << order) { 4400 if (npages >= 1 << order) {
4401 page = alloc_pages(gfp_mask | 4401 page = alloc_pages((gfp_mask & ~__GFP_WAIT) |
4402 __GFP_COMP | 4402 __GFP_COMP |
4403 __GFP_NOWARN | 4403 __GFP_NOWARN |
4404 __GFP_NORETRY, 4404 __GFP_NORETRY,
diff --git a/net/core/sock.c b/net/core/sock.c
index 292f42228bfb..dc30dc5bb1b8 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -354,15 +354,12 @@ void sk_clear_memalloc(struct sock *sk)
354 354
355 /* 355 /*
356 * SOCK_MEMALLOC is allowed to ignore rmem limits to ensure forward 356 * SOCK_MEMALLOC is allowed to ignore rmem limits to ensure forward
357 * progress of swapping. However, if SOCK_MEMALLOC is cleared while 357 * progress of swapping. SOCK_MEMALLOC may be cleared while
358 * it has rmem allocations there is a risk that the user of the 358 * it has rmem allocations due to the last swapfile being deactivated
359 * socket cannot make forward progress due to exceeding the rmem 359 * but there is a risk that the socket is unusable due to exceeding
360 * limits. By rights, sk_clear_memalloc() should only be called 360 * the rmem limits. Reclaim the reserves and obey rmem limits again.
361 * on sockets being torn down but warn and reset the accounting if
362 * that assumption breaks.
363 */ 361 */
364 if (WARN_ON(sk->sk_forward_alloc)) 362 sk_mem_reclaim(sk);
365 sk_mem_reclaim(sk);
366} 363}
367EXPORT_SYMBOL_GPL(sk_clear_memalloc); 364EXPORT_SYMBOL_GPL(sk_clear_memalloc);
368 365
@@ -1883,7 +1880,7 @@ bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t gfp)
1883 1880
1884 pfrag->offset = 0; 1881 pfrag->offset = 0;
1885 if (SKB_FRAG_PAGE_ORDER) { 1882 if (SKB_FRAG_PAGE_ORDER) {
1886 pfrag->page = alloc_pages(gfp | __GFP_COMP | 1883 pfrag->page = alloc_pages((gfp & ~__GFP_WAIT) | __GFP_COMP |
1887 __GFP_NOWARN | __GFP_NORETRY, 1884 __GFP_NOWARN | __GFP_NORETRY,
1888 SKB_FRAG_PAGE_ORDER); 1885 SKB_FRAG_PAGE_ORDER);
1889 if (likely(pfrag->page)) { 1886 if (likely(pfrag->page)) {
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c
index 41a73da371a9..f2e464eba5ef 100644
--- a/net/ipv6/ip6_input.c
+++ b/net/ipv6/ip6_input.c
@@ -212,13 +212,13 @@ static int ip6_input_finish(struct sock *sk, struct sk_buff *skb)
212 */ 212 */
213 213
214 rcu_read_lock(); 214 rcu_read_lock();
215resubmit:
215 idev = ip6_dst_idev(skb_dst(skb)); 216 idev = ip6_dst_idev(skb_dst(skb));
216 if (!pskb_pull(skb, skb_transport_offset(skb))) 217 if (!pskb_pull(skb, skb_transport_offset(skb)))
217 goto discard; 218 goto discard;
218 nhoff = IP6CB(skb)->nhoff; 219 nhoff = IP6CB(skb)->nhoff;
219 nexthdr = skb_network_header(skb)[nhoff]; 220 nexthdr = skb_network_header(skb)[nhoff];
220 221
221resubmit:
222 raw = raw6_local_deliver(skb, nexthdr); 222 raw = raw6_local_deliver(skb, nexthdr);
223 ipprot = rcu_dereference(inet6_protos[nexthdr]); 223 ipprot = rcu_dereference(inet6_protos[nexthdr]);
224 if (ipprot) { 224 if (ipprot) {
@@ -246,12 +246,10 @@ resubmit:
246 goto discard; 246 goto discard;
247 247
248 ret = ipprot->handler(skb); 248 ret = ipprot->handler(skb);
249 if (ret < 0) { 249 if (ret > 0)
250 nexthdr = -ret;
251 goto resubmit; 250 goto resubmit;
252 } else if (ret == 0) { 251 else if (ret == 0)
253 IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_INDELIVERS); 252 IP6_INC_STATS_BH(net, idev, IPSTATS_MIB_INDELIVERS);
254 }
255 } else { 253 } else {
256 if (!raw) { 254 if (!raw) {
257 if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) { 255 if (xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) {
diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c
index bff427f31924..1f93a5978f2a 100644
--- a/net/mpls/af_mpls.c
+++ b/net/mpls/af_mpls.c
@@ -564,6 +564,17 @@ static int mpls_dev_notify(struct notifier_block *this, unsigned long event,
564 case NETDEV_UNREGISTER: 564 case NETDEV_UNREGISTER:
565 mpls_ifdown(dev); 565 mpls_ifdown(dev);
566 break; 566 break;
567 case NETDEV_CHANGENAME:
568 mdev = mpls_dev_get(dev);
569 if (mdev) {
570 int err;
571
572 mpls_dev_sysctl_unregister(mdev);
573 err = mpls_dev_sysctl_register(dev, mdev);
574 if (err)
575 return notifier_from_errno(err);
576 }
577 break;
567 } 578 }
568 return NOTIFY_OK; 579 return NOTIFY_OK;
569} 580}
diff --git a/net/sctp/auth.c b/net/sctp/auth.c
index fb7976aee61c..4f15b7d730e1 100644
--- a/net/sctp/auth.c
+++ b/net/sctp/auth.c
@@ -381,13 +381,14 @@ nomem:
381} 381}
382 382
383 383
384/* Public interface to creat the association shared key. 384/* Public interface to create the association shared key.
385 * See code above for the algorithm. 385 * See code above for the algorithm.
386 */ 386 */
387int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp) 387int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp)
388{ 388{
389 struct sctp_auth_bytes *secret; 389 struct sctp_auth_bytes *secret;
390 struct sctp_shared_key *ep_key; 390 struct sctp_shared_key *ep_key;
391 struct sctp_chunk *chunk;
391 392
392 /* If we don't support AUTH, or peer is not capable 393 /* If we don't support AUTH, or peer is not capable
393 * we don't need to do anything. 394 * we don't need to do anything.
@@ -410,6 +411,14 @@ int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp)
410 sctp_auth_key_put(asoc->asoc_shared_key); 411 sctp_auth_key_put(asoc->asoc_shared_key);
411 asoc->asoc_shared_key = secret; 412 asoc->asoc_shared_key = secret;
412 413
414 /* Update send queue in case any chunk already in there now
415 * needs authenticating
416 */
417 list_for_each_entry(chunk, &asoc->outqueue.out_chunk_list, list) {
418 if (sctp_auth_send_cid(chunk->chunk_hdr->type, asoc))
419 chunk->auth = 1;
420 }
421
413 return 0; 422 return 0;
414} 423}
415 424
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 9074b5cede38..f485600c4507 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -2142,11 +2142,17 @@ static void tipc_sk_timeout(unsigned long data)
2142 peer_node = tsk_peer_node(tsk); 2142 peer_node = tsk_peer_node(tsk);
2143 2143
2144 if (tsk->probing_state == TIPC_CONN_PROBING) { 2144 if (tsk->probing_state == TIPC_CONN_PROBING) {
2145 /* Previous probe not answered -> self abort */ 2145 if (!sock_owned_by_user(sk)) {
2146 skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE, 2146 sk->sk_socket->state = SS_DISCONNECTING;
2147 TIPC_CONN_MSG, SHORT_H_SIZE, 0, 2147 tsk->connected = 0;
2148 own_node, peer_node, tsk->portid, 2148 tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk),
2149 peer_port, TIPC_ERR_NO_PORT); 2149 tsk_peer_port(tsk));
2150 sk->sk_state_change(sk);
2151 } else {
2152 /* Try again later */
2153 sk_reset_timer(sk, &sk->sk_timer, (HZ / 20));
2154 }
2155
2150 } else { 2156 } else {
2151 skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE, 2157 skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE,
2152 INT_H_SIZE, 0, peer_node, own_node, 2158 INT_H_SIZE, 0, peer_node, own_node,
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
index fff1bef6ed6d..fd682832a0e3 100644
--- a/net/wireless/wext-compat.c
+++ b/net/wireless/wext-compat.c
@@ -1333,6 +1333,8 @@ static struct iw_statistics *cfg80211_wireless_stats(struct net_device *dev)
1333 memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN); 1333 memcpy(bssid, wdev->current_bss->pub.bssid, ETH_ALEN);
1334 wdev_unlock(wdev); 1334 wdev_unlock(wdev);
1335 1335
1336 memset(&sinfo, 0, sizeof(sinfo));
1337
1336 if (rdev_get_station(rdev, dev, bssid, &sinfo)) 1338 if (rdev_get_station(rdev, dev, bssid, &sinfo))
1337 return NULL; 1339 return NULL;
1338 1340