diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 55 |
1 files changed, 47 insertions, 8 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 84f01ba81a34..0ebaea16632f 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1632,6 +1632,8 @@ static inline int deliver_skb(struct sk_buff *skb, | |||
1632 | struct packet_type *pt_prev, | 1632 | struct packet_type *pt_prev, |
1633 | struct net_device *orig_dev) | 1633 | struct net_device *orig_dev) |
1634 | { | 1634 | { |
1635 | if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC))) | ||
1636 | return -ENOMEM; | ||
1635 | atomic_inc(&skb->users); | 1637 | atomic_inc(&skb->users); |
1636 | return pt_prev->func(skb, skb->dev, pt_prev, orig_dev); | 1638 | return pt_prev->func(skb, skb->dev, pt_prev, orig_dev); |
1637 | } | 1639 | } |
@@ -1691,7 +1693,8 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev) | |||
1691 | rcu_read_unlock(); | 1693 | rcu_read_unlock(); |
1692 | } | 1694 | } |
1693 | 1695 | ||
1694 | /* netif_setup_tc - Handle tc mappings on real_num_tx_queues change | 1696 | /** |
1697 | * netif_setup_tc - Handle tc mappings on real_num_tx_queues change | ||
1695 | * @dev: Network device | 1698 | * @dev: Network device |
1696 | * @txq: number of queues available | 1699 | * @txq: number of queues available |
1697 | * | 1700 | * |
@@ -1793,6 +1796,18 @@ int netif_set_real_num_rx_queues(struct net_device *dev, unsigned int rxq) | |||
1793 | EXPORT_SYMBOL(netif_set_real_num_rx_queues); | 1796 | EXPORT_SYMBOL(netif_set_real_num_rx_queues); |
1794 | #endif | 1797 | #endif |
1795 | 1798 | ||
1799 | /** | ||
1800 | * netif_get_num_default_rss_queues - default number of RSS queues | ||
1801 | * | ||
1802 | * This routine should set an upper limit on the number of RSS queues | ||
1803 | * used by default by multiqueue devices. | ||
1804 | */ | ||
1805 | int netif_get_num_default_rss_queues(void) | ||
1806 | { | ||
1807 | return min_t(int, DEFAULT_MAX_NUM_RSS_QUEUES, num_online_cpus()); | ||
1808 | } | ||
1809 | EXPORT_SYMBOL(netif_get_num_default_rss_queues); | ||
1810 | |||
1796 | static inline void __netif_reschedule(struct Qdisc *q) | 1811 | static inline void __netif_reschedule(struct Qdisc *q) |
1797 | { | 1812 | { |
1798 | struct softnet_data *sd; | 1813 | struct softnet_data *sd; |
@@ -2444,8 +2459,12 @@ static void skb_update_prio(struct sk_buff *skb) | |||
2444 | { | 2459 | { |
2445 | struct netprio_map *map = rcu_dereference_bh(skb->dev->priomap); | 2460 | struct netprio_map *map = rcu_dereference_bh(skb->dev->priomap); |
2446 | 2461 | ||
2447 | if ((!skb->priority) && (skb->sk) && map) | 2462 | if (!skb->priority && skb->sk && map) { |
2448 | skb->priority = map->priomap[skb->sk->sk_cgrp_prioidx]; | 2463 | unsigned int prioidx = skb->sk->sk_cgrp_prioidx; |
2464 | |||
2465 | if (prioidx < map->priomap_len) | ||
2466 | skb->priority = map->priomap[prioidx]; | ||
2467 | } | ||
2449 | } | 2468 | } |
2450 | #else | 2469 | #else |
2451 | #define skb_update_prio(skb) | 2470 | #define skb_update_prio(skb) |
@@ -2455,6 +2474,23 @@ static DEFINE_PER_CPU(int, xmit_recursion); | |||
2455 | #define RECURSION_LIMIT 10 | 2474 | #define RECURSION_LIMIT 10 |
2456 | 2475 | ||
2457 | /** | 2476 | /** |
2477 | * dev_loopback_xmit - loop back @skb | ||
2478 | * @skb: buffer to transmit | ||
2479 | */ | ||
2480 | int dev_loopback_xmit(struct sk_buff *skb) | ||
2481 | { | ||
2482 | skb_reset_mac_header(skb); | ||
2483 | __skb_pull(skb, skb_network_offset(skb)); | ||
2484 | skb->pkt_type = PACKET_LOOPBACK; | ||
2485 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
2486 | WARN_ON(!skb_dst(skb)); | ||
2487 | skb_dst_force(skb); | ||
2488 | netif_rx_ni(skb); | ||
2489 | return 0; | ||
2490 | } | ||
2491 | EXPORT_SYMBOL(dev_loopback_xmit); | ||
2492 | |||
2493 | /** | ||
2458 | * dev_queue_xmit - transmit a buffer | 2494 | * dev_queue_xmit - transmit a buffer |
2459 | * @skb: buffer to transmit | 2495 | * @skb: buffer to transmit |
2460 | * | 2496 | * |
@@ -3137,8 +3173,6 @@ static int __netif_receive_skb(struct sk_buff *skb) | |||
3137 | if (netpoll_receive_skb(skb)) | 3173 | if (netpoll_receive_skb(skb)) |
3138 | return NET_RX_DROP; | 3174 | return NET_RX_DROP; |
3139 | 3175 | ||
3140 | if (!skb->skb_iif) | ||
3141 | skb->skb_iif = skb->dev->ifindex; | ||
3142 | orig_dev = skb->dev; | 3176 | orig_dev = skb->dev; |
3143 | 3177 | ||
3144 | skb_reset_network_header(skb); | 3178 | skb_reset_network_header(skb); |
@@ -3150,6 +3184,7 @@ static int __netif_receive_skb(struct sk_buff *skb) | |||
3150 | rcu_read_lock(); | 3184 | rcu_read_lock(); |
3151 | 3185 | ||
3152 | another_round: | 3186 | another_round: |
3187 | skb->skb_iif = skb->dev->ifindex; | ||
3153 | 3188 | ||
3154 | __this_cpu_inc(softnet_data.processed); | 3189 | __this_cpu_inc(softnet_data.processed); |
3155 | 3190 | ||
@@ -3228,7 +3263,10 @@ ncls: | |||
3228 | } | 3263 | } |
3229 | 3264 | ||
3230 | if (pt_prev) { | 3265 | if (pt_prev) { |
3231 | ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev); | 3266 | if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC))) |
3267 | ret = -ENOMEM; | ||
3268 | else | ||
3269 | ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev); | ||
3232 | } else { | 3270 | } else { |
3233 | atomic_long_inc(&skb->dev->rx_dropped); | 3271 | atomic_long_inc(&skb->dev->rx_dropped); |
3234 | kfree_skb(skb); | 3272 | kfree_skb(skb); |
@@ -5642,7 +5680,7 @@ int netdev_refcnt_read(const struct net_device *dev) | |||
5642 | } | 5680 | } |
5643 | EXPORT_SYMBOL(netdev_refcnt_read); | 5681 | EXPORT_SYMBOL(netdev_refcnt_read); |
5644 | 5682 | ||
5645 | /* | 5683 | /** |
5646 | * netdev_wait_allrefs - wait until all references are gone. | 5684 | * netdev_wait_allrefs - wait until all references are gone. |
5647 | * | 5685 | * |
5648 | * This is called when unregistering network devices. | 5686 | * This is called when unregistering network devices. |
@@ -6279,7 +6317,8 @@ static struct hlist_head *netdev_create_hash(void) | |||
6279 | /* Initialize per network namespace state */ | 6317 | /* Initialize per network namespace state */ |
6280 | static int __net_init netdev_init(struct net *net) | 6318 | static int __net_init netdev_init(struct net *net) |
6281 | { | 6319 | { |
6282 | INIT_LIST_HEAD(&net->dev_base_head); | 6320 | if (net != &init_net) |
6321 | INIT_LIST_HEAD(&net->dev_base_head); | ||
6283 | 6322 | ||
6284 | net->dev_name_head = netdev_create_hash(); | 6323 | net->dev_name_head = netdev_create_hash(); |
6285 | if (net->dev_name_head == NULL) | 6324 | if (net->dev_name_head == NULL) |