diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 24ea2d71e7e..8ae6631abcc 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1280,10 +1280,13 @@ static int __dev_close_many(struct list_head *head) | |||
1280 | 1280 | ||
1281 | static int __dev_close(struct net_device *dev) | 1281 | static int __dev_close(struct net_device *dev) |
1282 | { | 1282 | { |
1283 | int retval; | ||
1283 | LIST_HEAD(single); | 1284 | LIST_HEAD(single); |
1284 | 1285 | ||
1285 | list_add(&dev->unreg_list, &single); | 1286 | list_add(&dev->unreg_list, &single); |
1286 | return __dev_close_many(&single); | 1287 | retval = __dev_close_many(&single); |
1288 | list_del(&single); | ||
1289 | return retval; | ||
1287 | } | 1290 | } |
1288 | 1291 | ||
1289 | int dev_close_many(struct list_head *head) | 1292 | int dev_close_many(struct list_head *head) |
@@ -1325,7 +1328,7 @@ int dev_close(struct net_device *dev) | |||
1325 | 1328 | ||
1326 | list_add(&dev->unreg_list, &single); | 1329 | list_add(&dev->unreg_list, &single); |
1327 | dev_close_many(&single); | 1330 | dev_close_many(&single); |
1328 | 1331 | list_del(&single); | |
1329 | return 0; | 1332 | return 0; |
1330 | } | 1333 | } |
1331 | EXPORT_SYMBOL(dev_close); | 1334 | EXPORT_SYMBOL(dev_close); |
@@ -2563,7 +2566,8 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, | |||
2563 | 2566 | ||
2564 | map = rcu_dereference(rxqueue->rps_map); | 2567 | map = rcu_dereference(rxqueue->rps_map); |
2565 | if (map) { | 2568 | if (map) { |
2566 | if (map->len == 1) { | 2569 | if (map->len == 1 && |
2570 | !rcu_dereference_raw(rxqueue->rps_flow_table)) { | ||
2567 | tcpu = map->cpus[0]; | 2571 | tcpu = map->cpus[0]; |
2568 | if (cpu_online(tcpu)) | 2572 | if (cpu_online(tcpu)) |
2569 | cpu = tcpu; | 2573 | cpu = tcpu; |
@@ -3424,6 +3428,8 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb) | |||
3424 | __skb_pull(skb, skb_headlen(skb)); | 3428 | __skb_pull(skb, skb_headlen(skb)); |
3425 | skb_reserve(skb, NET_IP_ALIGN - skb_headroom(skb)); | 3429 | skb_reserve(skb, NET_IP_ALIGN - skb_headroom(skb)); |
3426 | skb->vlan_tci = 0; | 3430 | skb->vlan_tci = 0; |
3431 | skb->dev = napi->dev; | ||
3432 | skb->skb_iif = 0; | ||
3427 | 3433 | ||
3428 | napi->skb = skb; | 3434 | napi->skb = skb; |
3429 | } | 3435 | } |
@@ -5060,6 +5066,7 @@ static void rollback_registered(struct net_device *dev) | |||
5060 | 5066 | ||
5061 | list_add(&dev->unreg_list, &single); | 5067 | list_add(&dev->unreg_list, &single); |
5062 | rollback_registered_many(&single); | 5068 | rollback_registered_many(&single); |
5069 | list_del(&single); | ||
5063 | } | 5070 | } |
5064 | 5071 | ||
5065 | unsigned long netdev_fix_features(unsigned long features, const char *name) | 5072 | unsigned long netdev_fix_features(unsigned long features, const char *name) |
@@ -5657,30 +5664,35 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, | |||
5657 | 5664 | ||
5658 | dev_net_set(dev, &init_net); | 5665 | dev_net_set(dev, &init_net); |
5659 | 5666 | ||
5667 | dev->gso_max_size = GSO_MAX_SIZE; | ||
5668 | |||
5669 | INIT_LIST_HEAD(&dev->ethtool_ntuple_list.list); | ||
5670 | dev->ethtool_ntuple_list.count = 0; | ||
5671 | INIT_LIST_HEAD(&dev->napi_list); | ||
5672 | INIT_LIST_HEAD(&dev->unreg_list); | ||
5673 | INIT_LIST_HEAD(&dev->link_watch_list); | ||
5674 | dev->priv_flags = IFF_XMIT_DST_RELEASE; | ||
5675 | setup(dev); | ||
5676 | |||
5660 | dev->num_tx_queues = txqs; | 5677 | dev->num_tx_queues = txqs; |
5661 | dev->real_num_tx_queues = txqs; | 5678 | dev->real_num_tx_queues = txqs; |
5662 | if (netif_alloc_netdev_queues(dev)) | 5679 | if (netif_alloc_netdev_queues(dev)) |
5663 | goto free_pcpu; | 5680 | goto free_all; |
5664 | 5681 | ||
5665 | #ifdef CONFIG_RPS | 5682 | #ifdef CONFIG_RPS |
5666 | dev->num_rx_queues = rxqs; | 5683 | dev->num_rx_queues = rxqs; |
5667 | dev->real_num_rx_queues = rxqs; | 5684 | dev->real_num_rx_queues = rxqs; |
5668 | if (netif_alloc_rx_queues(dev)) | 5685 | if (netif_alloc_rx_queues(dev)) |
5669 | goto free_pcpu; | 5686 | goto free_all; |
5670 | #endif | 5687 | #endif |
5671 | 5688 | ||
5672 | dev->gso_max_size = GSO_MAX_SIZE; | ||
5673 | |||
5674 | INIT_LIST_HEAD(&dev->ethtool_ntuple_list.list); | ||
5675 | dev->ethtool_ntuple_list.count = 0; | ||
5676 | INIT_LIST_HEAD(&dev->napi_list); | ||
5677 | INIT_LIST_HEAD(&dev->unreg_list); | ||
5678 | INIT_LIST_HEAD(&dev->link_watch_list); | ||
5679 | dev->priv_flags = IFF_XMIT_DST_RELEASE; | ||
5680 | setup(dev); | ||
5681 | strcpy(dev->name, name); | 5689 | strcpy(dev->name, name); |
5682 | return dev; | 5690 | return dev; |
5683 | 5691 | ||
5692 | free_all: | ||
5693 | free_netdev(dev); | ||
5694 | return NULL; | ||
5695 | |||
5684 | free_pcpu: | 5696 | free_pcpu: |
5685 | free_percpu(dev->pcpu_refcnt); | 5697 | free_percpu(dev->pcpu_refcnt); |
5686 | kfree(dev->_tx); | 5698 | kfree(dev->_tx); |
@@ -6208,6 +6220,7 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list) | |||
6208 | } | 6220 | } |
6209 | } | 6221 | } |
6210 | unregister_netdevice_many(&dev_kill_list); | 6222 | unregister_netdevice_many(&dev_kill_list); |
6223 | list_del(&dev_kill_list); | ||
6211 | rtnl_unlock(); | 6224 | rtnl_unlock(); |
6212 | } | 6225 | } |
6213 | 6226 | ||