diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-04-07 05:15:40 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-07 05:15:40 -0400 |
commit | 5e34437840d33554f69380584311743b39e8fbeb (patch) | |
tree | e081135619ee146af5efb9ee883afca950df5757 /net/core/dev.c | |
parent | 77d05632baee21b1cef8730d7c06aa69601e4dca (diff) | |
parent | d508afb437daee7cf07da085b635c44a4ebf9b38 (diff) |
Merge branch 'linus' into core/softlockup
Conflicts:
kernel/sysctl.c
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 328 |
1 files changed, 197 insertions, 131 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index a17e00662363..91d792d17e09 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1457,7 +1457,9 @@ static bool can_checksum_protocol(unsigned long features, __be16 protocol) | |||
1457 | ((features & NETIF_F_IP_CSUM) && | 1457 | ((features & NETIF_F_IP_CSUM) && |
1458 | protocol == htons(ETH_P_IP)) || | 1458 | protocol == htons(ETH_P_IP)) || |
1459 | ((features & NETIF_F_IPV6_CSUM) && | 1459 | ((features & NETIF_F_IPV6_CSUM) && |
1460 | protocol == htons(ETH_P_IPV6))); | 1460 | protocol == htons(ETH_P_IPV6)) || |
1461 | ((features & NETIF_F_FCOE_CRC) && | ||
1462 | protocol == htons(ETH_P_FCOE))); | ||
1461 | } | 1463 | } |
1462 | 1464 | ||
1463 | static bool dev_can_checksum(struct net_device *dev, struct sk_buff *skb) | 1465 | static bool dev_can_checksum(struct net_device *dev, struct sk_buff *skb) |
@@ -1668,8 +1670,8 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
1668 | struct netdev_queue *txq) | 1670 | struct netdev_queue *txq) |
1669 | { | 1671 | { |
1670 | const struct net_device_ops *ops = dev->netdev_ops; | 1672 | const struct net_device_ops *ops = dev->netdev_ops; |
1673 | int rc; | ||
1671 | 1674 | ||
1672 | prefetch(&dev->netdev_ops->ndo_start_xmit); | ||
1673 | if (likely(!skb->next)) { | 1675 | if (likely(!skb->next)) { |
1674 | if (!list_empty(&ptype_all)) | 1676 | if (!list_empty(&ptype_all)) |
1675 | dev_queue_xmit_nit(skb, dev); | 1677 | dev_queue_xmit_nit(skb, dev); |
@@ -1681,13 +1683,27 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev, | |||
1681 | goto gso; | 1683 | goto gso; |
1682 | } | 1684 | } |
1683 | 1685 | ||
1684 | return ops->ndo_start_xmit(skb, dev); | 1686 | rc = ops->ndo_start_xmit(skb, dev); |
1687 | /* | ||
1688 | * TODO: if skb_orphan() was called by | ||
1689 | * dev->hard_start_xmit() (for example, the unmodified | ||
1690 | * igb driver does that; bnx2 doesn't), then | ||
1691 | * skb_tx_software_timestamp() will be unable to send | ||
1692 | * back the time stamp. | ||
1693 | * | ||
1694 | * How can this be prevented? Always create another | ||
1695 | * reference to the socket before calling | ||
1696 | * dev->hard_start_xmit()? Prevent that skb_orphan() | ||
1697 | * does anything in dev->hard_start_xmit() by clearing | ||
1698 | * the skb destructor before the call and restoring it | ||
1699 | * afterwards, then doing the skb_orphan() ourselves? | ||
1700 | */ | ||
1701 | return rc; | ||
1685 | } | 1702 | } |
1686 | 1703 | ||
1687 | gso: | 1704 | gso: |
1688 | do { | 1705 | do { |
1689 | struct sk_buff *nskb = skb->next; | 1706 | struct sk_buff *nskb = skb->next; |
1690 | int rc; | ||
1691 | 1707 | ||
1692 | skb->next = nskb->next; | 1708 | skb->next = nskb->next; |
1693 | nskb->next = NULL; | 1709 | nskb->next = NULL; |
@@ -1708,59 +1724,24 @@ out_kfree_skb: | |||
1708 | return 0; | 1724 | return 0; |
1709 | } | 1725 | } |
1710 | 1726 | ||
1711 | static u32 simple_tx_hashrnd; | 1727 | static u32 skb_tx_hashrnd; |
1712 | static int simple_tx_hashrnd_initialized = 0; | ||
1713 | 1728 | ||
1714 | static u16 simple_tx_hash(struct net_device *dev, struct sk_buff *skb) | 1729 | u16 skb_tx_hash(const struct net_device *dev, const struct sk_buff *skb) |
1715 | { | 1730 | { |
1716 | u32 addr1, addr2, ports; | 1731 | u32 hash; |
1717 | u32 hash, ihl; | ||
1718 | u8 ip_proto = 0; | ||
1719 | |||
1720 | if (unlikely(!simple_tx_hashrnd_initialized)) { | ||
1721 | get_random_bytes(&simple_tx_hashrnd, 4); | ||
1722 | simple_tx_hashrnd_initialized = 1; | ||
1723 | } | ||
1724 | |||
1725 | switch (skb->protocol) { | ||
1726 | case htons(ETH_P_IP): | ||
1727 | if (!(ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET))) | ||
1728 | ip_proto = ip_hdr(skb)->protocol; | ||
1729 | addr1 = ip_hdr(skb)->saddr; | ||
1730 | addr2 = ip_hdr(skb)->daddr; | ||
1731 | ihl = ip_hdr(skb)->ihl; | ||
1732 | break; | ||
1733 | case htons(ETH_P_IPV6): | ||
1734 | ip_proto = ipv6_hdr(skb)->nexthdr; | ||
1735 | addr1 = ipv6_hdr(skb)->saddr.s6_addr32[3]; | ||
1736 | addr2 = ipv6_hdr(skb)->daddr.s6_addr32[3]; | ||
1737 | ihl = (40 >> 2); | ||
1738 | break; | ||
1739 | default: | ||
1740 | return 0; | ||
1741 | } | ||
1742 | |||
1743 | |||
1744 | switch (ip_proto) { | ||
1745 | case IPPROTO_TCP: | ||
1746 | case IPPROTO_UDP: | ||
1747 | case IPPROTO_DCCP: | ||
1748 | case IPPROTO_ESP: | ||
1749 | case IPPROTO_AH: | ||
1750 | case IPPROTO_SCTP: | ||
1751 | case IPPROTO_UDPLITE: | ||
1752 | ports = *((u32 *) (skb_network_header(skb) + (ihl * 4))); | ||
1753 | break; | ||
1754 | 1732 | ||
1755 | default: | 1733 | if (skb_rx_queue_recorded(skb)) { |
1756 | ports = 0; | 1734 | hash = skb_get_rx_queue(skb); |
1757 | break; | 1735 | } else if (skb->sk && skb->sk->sk_hash) { |
1758 | } | 1736 | hash = skb->sk->sk_hash; |
1737 | } else | ||
1738 | hash = skb->protocol; | ||
1759 | 1739 | ||
1760 | hash = jhash_3words(addr1, addr2, ports, simple_tx_hashrnd); | 1740 | hash = jhash_1word(hash, skb_tx_hashrnd); |
1761 | 1741 | ||
1762 | return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32); | 1742 | return (u16) (((u64) hash * dev->real_num_tx_queues) >> 32); |
1763 | } | 1743 | } |
1744 | EXPORT_SYMBOL(skb_tx_hash); | ||
1764 | 1745 | ||
1765 | static struct netdev_queue *dev_pick_tx(struct net_device *dev, | 1746 | static struct netdev_queue *dev_pick_tx(struct net_device *dev, |
1766 | struct sk_buff *skb) | 1747 | struct sk_buff *skb) |
@@ -1771,7 +1752,7 @@ static struct netdev_queue *dev_pick_tx(struct net_device *dev, | |||
1771 | if (ops->ndo_select_queue) | 1752 | if (ops->ndo_select_queue) |
1772 | queue_index = ops->ndo_select_queue(dev, skb); | 1753 | queue_index = ops->ndo_select_queue(dev, skb); |
1773 | else if (dev->real_num_tx_queues > 1) | 1754 | else if (dev->real_num_tx_queues > 1) |
1774 | queue_index = simple_tx_hash(dev, skb); | 1755 | queue_index = skb_tx_hash(dev, skb); |
1775 | 1756 | ||
1776 | skb_set_queue_mapping(skb, queue_index); | 1757 | skb_set_queue_mapping(skb, queue_index); |
1777 | return netdev_get_tx_queue(dev, queue_index); | 1758 | return netdev_get_tx_queue(dev, queue_index); |
@@ -2267,12 +2248,6 @@ int netif_receive_skb(struct sk_buff *skb) | |||
2267 | 2248 | ||
2268 | rcu_read_lock(); | 2249 | rcu_read_lock(); |
2269 | 2250 | ||
2270 | /* Don't receive packets in an exiting network namespace */ | ||
2271 | if (!net_alive(dev_net(skb->dev))) { | ||
2272 | kfree_skb(skb); | ||
2273 | goto out; | ||
2274 | } | ||
2275 | |||
2276 | #ifdef CONFIG_NET_CLS_ACT | 2251 | #ifdef CONFIG_NET_CLS_ACT |
2277 | if (skb->tc_verd & TC_NCLS) { | 2252 | if (skb->tc_verd & TC_NCLS) { |
2278 | skb->tc_verd = CLR_TC_NCLS(skb->tc_verd); | 2253 | skb->tc_verd = CLR_TC_NCLS(skb->tc_verd); |
@@ -2303,6 +2278,8 @@ ncls: | |||
2303 | if (!skb) | 2278 | if (!skb) |
2304 | goto out; | 2279 | goto out; |
2305 | 2280 | ||
2281 | skb_orphan(skb); | ||
2282 | |||
2306 | type = skb->protocol; | 2283 | type = skb->protocol; |
2307 | list_for_each_entry_rcu(ptype, | 2284 | list_for_each_entry_rcu(ptype, |
2308 | &ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) { | 2285 | &ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) { |
@@ -2372,7 +2349,6 @@ static int napi_gro_complete(struct sk_buff *skb) | |||
2372 | 2349 | ||
2373 | out: | 2350 | out: |
2374 | skb_shinfo(skb)->gso_size = 0; | 2351 | skb_shinfo(skb)->gso_size = 0; |
2375 | __skb_push(skb, -skb_network_offset(skb)); | ||
2376 | return netif_receive_skb(skb); | 2352 | return netif_receive_skb(skb); |
2377 | } | 2353 | } |
2378 | 2354 | ||
@@ -2386,20 +2362,40 @@ void napi_gro_flush(struct napi_struct *napi) | |||
2386 | napi_gro_complete(skb); | 2362 | napi_gro_complete(skb); |
2387 | } | 2363 | } |
2388 | 2364 | ||
2365 | napi->gro_count = 0; | ||
2389 | napi->gro_list = NULL; | 2366 | napi->gro_list = NULL; |
2390 | } | 2367 | } |
2391 | EXPORT_SYMBOL(napi_gro_flush); | 2368 | EXPORT_SYMBOL(napi_gro_flush); |
2392 | 2369 | ||
2370 | void *skb_gro_header(struct sk_buff *skb, unsigned int hlen) | ||
2371 | { | ||
2372 | unsigned int offset = skb_gro_offset(skb); | ||
2373 | |||
2374 | hlen += offset; | ||
2375 | if (hlen <= skb_headlen(skb)) | ||
2376 | return skb->data + offset; | ||
2377 | |||
2378 | if (unlikely(!skb_shinfo(skb)->nr_frags || | ||
2379 | skb_shinfo(skb)->frags[0].size <= | ||
2380 | hlen - skb_headlen(skb) || | ||
2381 | PageHighMem(skb_shinfo(skb)->frags[0].page))) | ||
2382 | return pskb_may_pull(skb, hlen) ? skb->data + offset : NULL; | ||
2383 | |||
2384 | return page_address(skb_shinfo(skb)->frags[0].page) + | ||
2385 | skb_shinfo(skb)->frags[0].page_offset + | ||
2386 | offset - skb_headlen(skb); | ||
2387 | } | ||
2388 | EXPORT_SYMBOL(skb_gro_header); | ||
2389 | |||
2393 | int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | 2390 | int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) |
2394 | { | 2391 | { |
2395 | struct sk_buff **pp = NULL; | 2392 | struct sk_buff **pp = NULL; |
2396 | struct packet_type *ptype; | 2393 | struct packet_type *ptype; |
2397 | __be16 type = skb->protocol; | 2394 | __be16 type = skb->protocol; |
2398 | struct list_head *head = &ptype_base[ntohs(type) & PTYPE_HASH_MASK]; | 2395 | struct list_head *head = &ptype_base[ntohs(type) & PTYPE_HASH_MASK]; |
2399 | int count = 0; | ||
2400 | int same_flow; | 2396 | int same_flow; |
2401 | int mac_len; | 2397 | int mac_len; |
2402 | int free; | 2398 | int ret; |
2403 | 2399 | ||
2404 | if (!(skb->dev->features & NETIF_F_GRO)) | 2400 | if (!(skb->dev->features & NETIF_F_GRO)) |
2405 | goto normal; | 2401 | goto normal; |
@@ -2409,30 +2405,16 @@ int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | |||
2409 | 2405 | ||
2410 | rcu_read_lock(); | 2406 | rcu_read_lock(); |
2411 | list_for_each_entry_rcu(ptype, head, list) { | 2407 | list_for_each_entry_rcu(ptype, head, list) { |
2412 | struct sk_buff *p; | ||
2413 | |||
2414 | if (ptype->type != type || ptype->dev || !ptype->gro_receive) | 2408 | if (ptype->type != type || ptype->dev || !ptype->gro_receive) |
2415 | continue; | 2409 | continue; |
2416 | 2410 | ||
2417 | skb_reset_network_header(skb); | 2411 | skb_set_network_header(skb, skb_gro_offset(skb)); |
2418 | mac_len = skb->network_header - skb->mac_header; | 2412 | mac_len = skb->network_header - skb->mac_header; |
2419 | skb->mac_len = mac_len; | 2413 | skb->mac_len = mac_len; |
2420 | NAPI_GRO_CB(skb)->same_flow = 0; | 2414 | NAPI_GRO_CB(skb)->same_flow = 0; |
2421 | NAPI_GRO_CB(skb)->flush = 0; | 2415 | NAPI_GRO_CB(skb)->flush = 0; |
2422 | NAPI_GRO_CB(skb)->free = 0; | 2416 | NAPI_GRO_CB(skb)->free = 0; |
2423 | 2417 | ||
2424 | for (p = napi->gro_list; p; p = p->next) { | ||
2425 | count++; | ||
2426 | |||
2427 | if (!NAPI_GRO_CB(p)->same_flow) | ||
2428 | continue; | ||
2429 | |||
2430 | if (p->mac_len != mac_len || | ||
2431 | memcmp(skb_mac_header(p), skb_mac_header(skb), | ||
2432 | mac_len)) | ||
2433 | NAPI_GRO_CB(p)->same_flow = 0; | ||
2434 | } | ||
2435 | |||
2436 | pp = ptype->gro_receive(&napi->gro_list, skb); | 2418 | pp = ptype->gro_receive(&napi->gro_list, skb); |
2437 | break; | 2419 | break; |
2438 | } | 2420 | } |
@@ -2442,7 +2424,7 @@ int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | |||
2442 | goto normal; | 2424 | goto normal; |
2443 | 2425 | ||
2444 | same_flow = NAPI_GRO_CB(skb)->same_flow; | 2426 | same_flow = NAPI_GRO_CB(skb)->same_flow; |
2445 | free = NAPI_GRO_CB(skb)->free; | 2427 | ret = NAPI_GRO_CB(skb)->free ? GRO_MERGED_FREE : GRO_MERGED; |
2446 | 2428 | ||
2447 | if (pp) { | 2429 | if (pp) { |
2448 | struct sk_buff *nskb = *pp; | 2430 | struct sk_buff *nskb = *pp; |
@@ -2450,27 +2432,35 @@ int dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | |||
2450 | *pp = nskb->next; | 2432 | *pp = nskb->next; |
2451 | nskb->next = NULL; | 2433 | nskb->next = NULL; |
2452 | napi_gro_complete(nskb); | 2434 | napi_gro_complete(nskb); |
2453 | count--; | 2435 | napi->gro_count--; |
2454 | } | 2436 | } |
2455 | 2437 | ||
2456 | if (same_flow) | 2438 | if (same_flow) |
2457 | goto ok; | 2439 | goto ok; |
2458 | 2440 | ||
2459 | if (NAPI_GRO_CB(skb)->flush || count >= MAX_GRO_SKBS) { | 2441 | if (NAPI_GRO_CB(skb)->flush || napi->gro_count >= MAX_GRO_SKBS) |
2460 | __skb_push(skb, -skb_network_offset(skb)); | ||
2461 | goto normal; | 2442 | goto normal; |
2462 | } | ||
2463 | 2443 | ||
2444 | napi->gro_count++; | ||
2464 | NAPI_GRO_CB(skb)->count = 1; | 2445 | NAPI_GRO_CB(skb)->count = 1; |
2465 | skb_shinfo(skb)->gso_size = skb->len; | 2446 | skb_shinfo(skb)->gso_size = skb_gro_len(skb); |
2466 | skb->next = napi->gro_list; | 2447 | skb->next = napi->gro_list; |
2467 | napi->gro_list = skb; | 2448 | napi->gro_list = skb; |
2449 | ret = GRO_HELD; | ||
2450 | |||
2451 | pull: | ||
2452 | if (unlikely(!pskb_may_pull(skb, skb_gro_offset(skb)))) { | ||
2453 | if (napi->gro_list == skb) | ||
2454 | napi->gro_list = skb->next; | ||
2455 | ret = GRO_DROP; | ||
2456 | } | ||
2468 | 2457 | ||
2469 | ok: | 2458 | ok: |
2470 | return free; | 2459 | return ret; |
2471 | 2460 | ||
2472 | normal: | 2461 | normal: |
2473 | return -1; | 2462 | ret = GRO_NORMAL; |
2463 | goto pull; | ||
2474 | } | 2464 | } |
2475 | EXPORT_SYMBOL(dev_gro_receive); | 2465 | EXPORT_SYMBOL(dev_gro_receive); |
2476 | 2466 | ||
@@ -2478,26 +2468,45 @@ static int __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | |||
2478 | { | 2468 | { |
2479 | struct sk_buff *p; | 2469 | struct sk_buff *p; |
2480 | 2470 | ||
2471 | if (netpoll_rx_on(skb)) | ||
2472 | return GRO_NORMAL; | ||
2473 | |||
2481 | for (p = napi->gro_list; p; p = p->next) { | 2474 | for (p = napi->gro_list; p; p = p->next) { |
2482 | NAPI_GRO_CB(p)->same_flow = 1; | 2475 | NAPI_GRO_CB(p)->same_flow = (p->dev == skb->dev) |
2476 | && !compare_ether_header(skb_mac_header(p), | ||
2477 | skb_gro_mac_header(skb)); | ||
2483 | NAPI_GRO_CB(p)->flush = 0; | 2478 | NAPI_GRO_CB(p)->flush = 0; |
2484 | } | 2479 | } |
2485 | 2480 | ||
2486 | return dev_gro_receive(napi, skb); | 2481 | return dev_gro_receive(napi, skb); |
2487 | } | 2482 | } |
2488 | 2483 | ||
2489 | int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | 2484 | int napi_skb_finish(int ret, struct sk_buff *skb) |
2490 | { | 2485 | { |
2491 | switch (__napi_gro_receive(napi, skb)) { | 2486 | int err = NET_RX_SUCCESS; |
2492 | case -1: | 2487 | |
2488 | switch (ret) { | ||
2489 | case GRO_NORMAL: | ||
2493 | return netif_receive_skb(skb); | 2490 | return netif_receive_skb(skb); |
2494 | 2491 | ||
2495 | case 1: | 2492 | case GRO_DROP: |
2493 | err = NET_RX_DROP; | ||
2494 | /* fall through */ | ||
2495 | |||
2496 | case GRO_MERGED_FREE: | ||
2496 | kfree_skb(skb); | 2497 | kfree_skb(skb); |
2497 | break; | 2498 | break; |
2498 | } | 2499 | } |
2499 | 2500 | ||
2500 | return NET_RX_SUCCESS; | 2501 | return err; |
2502 | } | ||
2503 | EXPORT_SYMBOL(napi_skb_finish); | ||
2504 | |||
2505 | int napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | ||
2506 | { | ||
2507 | skb_gro_reset_offset(skb); | ||
2508 | |||
2509 | return napi_skb_finish(__napi_gro_receive(napi, skb), skb); | ||
2501 | } | 2510 | } |
2502 | EXPORT_SYMBOL(napi_gro_receive); | 2511 | EXPORT_SYMBOL(napi_gro_receive); |
2503 | 2512 | ||
@@ -2515,6 +2524,9 @@ struct sk_buff *napi_fraginfo_skb(struct napi_struct *napi, | |||
2515 | { | 2524 | { |
2516 | struct net_device *dev = napi->dev; | 2525 | struct net_device *dev = napi->dev; |
2517 | struct sk_buff *skb = napi->skb; | 2526 | struct sk_buff *skb = napi->skb; |
2527 | struct ethhdr *eth; | ||
2528 | skb_frag_t *frag; | ||
2529 | int i; | ||
2518 | 2530 | ||
2519 | napi->skb = NULL; | 2531 | napi->skb = NULL; |
2520 | 2532 | ||
@@ -2527,20 +2539,36 @@ struct sk_buff *napi_fraginfo_skb(struct napi_struct *napi, | |||
2527 | } | 2539 | } |
2528 | 2540 | ||
2529 | BUG_ON(info->nr_frags > MAX_SKB_FRAGS); | 2541 | BUG_ON(info->nr_frags > MAX_SKB_FRAGS); |
2542 | frag = &info->frags[info->nr_frags - 1]; | ||
2543 | |||
2544 | for (i = skb_shinfo(skb)->nr_frags; i < info->nr_frags; i++) { | ||
2545 | skb_fill_page_desc(skb, i, frag->page, frag->page_offset, | ||
2546 | frag->size); | ||
2547 | frag++; | ||
2548 | } | ||
2530 | skb_shinfo(skb)->nr_frags = info->nr_frags; | 2549 | skb_shinfo(skb)->nr_frags = info->nr_frags; |
2531 | memcpy(skb_shinfo(skb)->frags, info->frags, sizeof(info->frags)); | ||
2532 | 2550 | ||
2533 | skb->data_len = info->len; | 2551 | skb->data_len = info->len; |
2534 | skb->len += info->len; | 2552 | skb->len += info->len; |
2535 | skb->truesize += info->len; | 2553 | skb->truesize += info->len; |
2536 | 2554 | ||
2537 | if (!pskb_may_pull(skb, ETH_HLEN)) { | 2555 | skb_reset_mac_header(skb); |
2556 | skb_gro_reset_offset(skb); | ||
2557 | |||
2558 | eth = skb_gro_header(skb, sizeof(*eth)); | ||
2559 | if (!eth) { | ||
2538 | napi_reuse_skb(napi, skb); | 2560 | napi_reuse_skb(napi, skb); |
2539 | skb = NULL; | 2561 | skb = NULL; |
2540 | goto out; | 2562 | goto out; |
2541 | } | 2563 | } |
2542 | 2564 | ||
2543 | skb->protocol = eth_type_trans(skb, dev); | 2565 | skb_gro_pull(skb, sizeof(*eth)); |
2566 | |||
2567 | /* | ||
2568 | * This works because the only protocols we care about don't require | ||
2569 | * special handling. We'll fix it up properly at the end. | ||
2570 | */ | ||
2571 | skb->protocol = eth->h_proto; | ||
2544 | 2572 | ||
2545 | skb->ip_summed = info->ip_summed; | 2573 | skb->ip_summed = info->ip_summed; |
2546 | skb->csum = info->csum; | 2574 | skb->csum = info->csum; |
@@ -2550,29 +2578,43 @@ out: | |||
2550 | } | 2578 | } |
2551 | EXPORT_SYMBOL(napi_fraginfo_skb); | 2579 | EXPORT_SYMBOL(napi_fraginfo_skb); |
2552 | 2580 | ||
2553 | int napi_gro_frags(struct napi_struct *napi, struct napi_gro_fraginfo *info) | 2581 | int napi_frags_finish(struct napi_struct *napi, struct sk_buff *skb, int ret) |
2554 | { | 2582 | { |
2555 | struct sk_buff *skb = napi_fraginfo_skb(napi, info); | 2583 | int err = NET_RX_SUCCESS; |
2556 | int err = NET_RX_DROP; | ||
2557 | 2584 | ||
2558 | if (!skb) | 2585 | switch (ret) { |
2559 | goto out; | 2586 | case GRO_NORMAL: |
2587 | case GRO_HELD: | ||
2588 | skb->protocol = eth_type_trans(skb, napi->dev); | ||
2560 | 2589 | ||
2561 | err = NET_RX_SUCCESS; | 2590 | if (ret == GRO_NORMAL) |
2591 | return netif_receive_skb(skb); | ||
2562 | 2592 | ||
2563 | switch (__napi_gro_receive(napi, skb)) { | 2593 | skb_gro_pull(skb, -ETH_HLEN); |
2564 | case -1: | 2594 | break; |
2565 | return netif_receive_skb(skb); | ||
2566 | 2595 | ||
2567 | case 0: | 2596 | case GRO_DROP: |
2568 | goto out; | 2597 | err = NET_RX_DROP; |
2569 | } | 2598 | /* fall through */ |
2570 | 2599 | ||
2571 | napi_reuse_skb(napi, skb); | 2600 | case GRO_MERGED_FREE: |
2601 | napi_reuse_skb(napi, skb); | ||
2602 | break; | ||
2603 | } | ||
2572 | 2604 | ||
2573 | out: | ||
2574 | return err; | 2605 | return err; |
2575 | } | 2606 | } |
2607 | EXPORT_SYMBOL(napi_frags_finish); | ||
2608 | |||
2609 | int napi_gro_frags(struct napi_struct *napi, struct napi_gro_fraginfo *info) | ||
2610 | { | ||
2611 | struct sk_buff *skb = napi_fraginfo_skb(napi, info); | ||
2612 | |||
2613 | if (!skb) | ||
2614 | return NET_RX_DROP; | ||
2615 | |||
2616 | return napi_frags_finish(napi, skb, __napi_gro_receive(napi, skb)); | ||
2617 | } | ||
2576 | EXPORT_SYMBOL(napi_gro_frags); | 2618 | EXPORT_SYMBOL(napi_gro_frags); |
2577 | 2619 | ||
2578 | static int process_backlog(struct napi_struct *napi, int quota) | 2620 | static int process_backlog(struct napi_struct *napi, int quota) |
@@ -2594,11 +2636,9 @@ static int process_backlog(struct napi_struct *napi, int quota) | |||
2594 | } | 2636 | } |
2595 | local_irq_enable(); | 2637 | local_irq_enable(); |
2596 | 2638 | ||
2597 | napi_gro_receive(napi, skb); | 2639 | netif_receive_skb(skb); |
2598 | } while (++work < quota && jiffies == start_time); | 2640 | } while (++work < quota && jiffies == start_time); |
2599 | 2641 | ||
2600 | napi_gro_flush(napi); | ||
2601 | |||
2602 | return work; | 2642 | return work; |
2603 | } | 2643 | } |
2604 | 2644 | ||
@@ -2652,6 +2692,7 @@ void netif_napi_add(struct net_device *dev, struct napi_struct *napi, | |||
2652 | int (*poll)(struct napi_struct *, int), int weight) | 2692 | int (*poll)(struct napi_struct *, int), int weight) |
2653 | { | 2693 | { |
2654 | INIT_LIST_HEAD(&napi->poll_list); | 2694 | INIT_LIST_HEAD(&napi->poll_list); |
2695 | napi->gro_count = 0; | ||
2655 | napi->gro_list = NULL; | 2696 | napi->gro_list = NULL; |
2656 | napi->skb = NULL; | 2697 | napi->skb = NULL; |
2657 | napi->poll = poll; | 2698 | napi->poll = poll; |
@@ -2671,7 +2712,7 @@ void netif_napi_del(struct napi_struct *napi) | |||
2671 | struct sk_buff *skb, *next; | 2712 | struct sk_buff *skb, *next; |
2672 | 2713 | ||
2673 | list_del_init(&napi->dev_list); | 2714 | list_del_init(&napi->dev_list); |
2674 | kfree(napi->skb); | 2715 | kfree_skb(napi->skb); |
2675 | 2716 | ||
2676 | for (skb = napi->gro_list; skb; skb = next) { | 2717 | for (skb = napi->gro_list; skb; skb = next) { |
2677 | next = skb->next; | 2718 | next = skb->next; |
@@ -2680,6 +2721,7 @@ void netif_napi_del(struct napi_struct *napi) | |||
2680 | } | 2721 | } |
2681 | 2722 | ||
2682 | napi->gro_list = NULL; | 2723 | napi->gro_list = NULL; |
2724 | napi->gro_count = 0; | ||
2683 | } | 2725 | } |
2684 | EXPORT_SYMBOL(netif_napi_del); | 2726 | EXPORT_SYMBOL(netif_napi_del); |
2685 | 2727 | ||
@@ -3948,6 +3990,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd) | |||
3948 | cmd == SIOCSMIIREG || | 3990 | cmd == SIOCSMIIREG || |
3949 | cmd == SIOCBRADDIF || | 3991 | cmd == SIOCBRADDIF || |
3950 | cmd == SIOCBRDELIF || | 3992 | cmd == SIOCBRDELIF || |
3993 | cmd == SIOCSHWTSTAMP || | ||
3951 | cmd == SIOCWANDEV) { | 3994 | cmd == SIOCWANDEV) { |
3952 | err = -EOPNOTSUPP; | 3995 | err = -EOPNOTSUPP; |
3953 | if (ops->ndo_do_ioctl) { | 3996 | if (ops->ndo_do_ioctl) { |
@@ -4102,6 +4145,7 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg) | |||
4102 | case SIOCBONDCHANGEACTIVE: | 4145 | case SIOCBONDCHANGEACTIVE: |
4103 | case SIOCBRADDIF: | 4146 | case SIOCBRADDIF: |
4104 | case SIOCBRDELIF: | 4147 | case SIOCBRDELIF: |
4148 | case SIOCSHWTSTAMP: | ||
4105 | if (!capable(CAP_NET_ADMIN)) | 4149 | if (!capable(CAP_NET_ADMIN)) |
4106 | return -EPERM; | 4150 | return -EPERM; |
4107 | /* fall through */ | 4151 | /* fall through */ |
@@ -4282,6 +4326,39 @@ unsigned long netdev_fix_features(unsigned long features, const char *name) | |||
4282 | } | 4326 | } |
4283 | EXPORT_SYMBOL(netdev_fix_features); | 4327 | EXPORT_SYMBOL(netdev_fix_features); |
4284 | 4328 | ||
4329 | /* Some devices need to (re-)set their netdev_ops inside | ||
4330 | * ->init() or similar. If that happens, we have to setup | ||
4331 | * the compat pointers again. | ||
4332 | */ | ||
4333 | void netdev_resync_ops(struct net_device *dev) | ||
4334 | { | ||
4335 | #ifdef CONFIG_COMPAT_NET_DEV_OPS | ||
4336 | const struct net_device_ops *ops = dev->netdev_ops; | ||
4337 | |||
4338 | dev->init = ops->ndo_init; | ||
4339 | dev->uninit = ops->ndo_uninit; | ||
4340 | dev->open = ops->ndo_open; | ||
4341 | dev->change_rx_flags = ops->ndo_change_rx_flags; | ||
4342 | dev->set_rx_mode = ops->ndo_set_rx_mode; | ||
4343 | dev->set_multicast_list = ops->ndo_set_multicast_list; | ||
4344 | dev->set_mac_address = ops->ndo_set_mac_address; | ||
4345 | dev->validate_addr = ops->ndo_validate_addr; | ||
4346 | dev->do_ioctl = ops->ndo_do_ioctl; | ||
4347 | dev->set_config = ops->ndo_set_config; | ||
4348 | dev->change_mtu = ops->ndo_change_mtu; | ||
4349 | dev->neigh_setup = ops->ndo_neigh_setup; | ||
4350 | dev->tx_timeout = ops->ndo_tx_timeout; | ||
4351 | dev->get_stats = ops->ndo_get_stats; | ||
4352 | dev->vlan_rx_register = ops->ndo_vlan_rx_register; | ||
4353 | dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid; | ||
4354 | dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid; | ||
4355 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
4356 | dev->poll_controller = ops->ndo_poll_controller; | ||
4357 | #endif | ||
4358 | #endif | ||
4359 | } | ||
4360 | EXPORT_SYMBOL(netdev_resync_ops); | ||
4361 | |||
4285 | /** | 4362 | /** |
4286 | * register_netdevice - register a network device | 4363 | * register_netdevice - register a network device |
4287 | * @dev: device to register | 4364 | * @dev: device to register |
@@ -4326,27 +4403,7 @@ int register_netdevice(struct net_device *dev) | |||
4326 | * This is temporary until all network devices are converted. | 4403 | * This is temporary until all network devices are converted. |
4327 | */ | 4404 | */ |
4328 | if (dev->netdev_ops) { | 4405 | if (dev->netdev_ops) { |
4329 | const struct net_device_ops *ops = dev->netdev_ops; | 4406 | netdev_resync_ops(dev); |
4330 | |||
4331 | dev->init = ops->ndo_init; | ||
4332 | dev->uninit = ops->ndo_uninit; | ||
4333 | dev->open = ops->ndo_open; | ||
4334 | dev->change_rx_flags = ops->ndo_change_rx_flags; | ||
4335 | dev->set_rx_mode = ops->ndo_set_rx_mode; | ||
4336 | dev->set_multicast_list = ops->ndo_set_multicast_list; | ||
4337 | dev->set_mac_address = ops->ndo_set_mac_address; | ||
4338 | dev->validate_addr = ops->ndo_validate_addr; | ||
4339 | dev->do_ioctl = ops->ndo_do_ioctl; | ||
4340 | dev->set_config = ops->ndo_set_config; | ||
4341 | dev->change_mtu = ops->ndo_change_mtu; | ||
4342 | dev->tx_timeout = ops->ndo_tx_timeout; | ||
4343 | dev->get_stats = ops->ndo_get_stats; | ||
4344 | dev->vlan_rx_register = ops->ndo_vlan_rx_register; | ||
4345 | dev->vlan_rx_add_vid = ops->ndo_vlan_rx_add_vid; | ||
4346 | dev->vlan_rx_kill_vid = ops->ndo_vlan_rx_kill_vid; | ||
4347 | #ifdef CONFIG_NET_POLL_CONTROLLER | ||
4348 | dev->poll_controller = ops->ndo_poll_controller; | ||
4349 | #endif | ||
4350 | } else { | 4407 | } else { |
4351 | char drivername[64]; | 4408 | char drivername[64]; |
4352 | pr_info("%s (%s): not using net_device_ops yet\n", | 4409 | pr_info("%s (%s): not using net_device_ops yet\n", |
@@ -5185,6 +5242,7 @@ static int __init net_dev_init(void) | |||
5185 | queue->backlog.poll = process_backlog; | 5242 | queue->backlog.poll = process_backlog; |
5186 | queue->backlog.weight = weight_p; | 5243 | queue->backlog.weight = weight_p; |
5187 | queue->backlog.gro_list = NULL; | 5244 | queue->backlog.gro_list = NULL; |
5245 | queue->backlog.gro_count = 0; | ||
5188 | } | 5246 | } |
5189 | 5247 | ||
5190 | dev_boot_phase = 0; | 5248 | dev_boot_phase = 0; |
@@ -5217,6 +5275,14 @@ out: | |||
5217 | 5275 | ||
5218 | subsys_initcall(net_dev_init); | 5276 | subsys_initcall(net_dev_init); |
5219 | 5277 | ||
5278 | static int __init initialize_hashrnd(void) | ||
5279 | { | ||
5280 | get_random_bytes(&skb_tx_hashrnd, sizeof(skb_tx_hashrnd)); | ||
5281 | return 0; | ||
5282 | } | ||
5283 | |||
5284 | late_initcall_sync(initialize_hashrnd); | ||
5285 | |||
5220 | EXPORT_SYMBOL(__dev_get_by_index); | 5286 | EXPORT_SYMBOL(__dev_get_by_index); |
5221 | EXPORT_SYMBOL(__dev_get_by_name); | 5287 | EXPORT_SYMBOL(__dev_get_by_name); |
5222 | EXPORT_SYMBOL(__dev_remove_pack); | 5288 | EXPORT_SYMBOL(__dev_remove_pack); |