aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c41
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
1281static int __dev_close(struct net_device *dev) 1281static 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
1289int dev_close_many(struct list_head *head) 1292int 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}
1331EXPORT_SYMBOL(dev_close); 1334EXPORT_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
5065unsigned long netdev_fix_features(unsigned long features, const char *name) 5072unsigned 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
5692free_all:
5693 free_netdev(dev);
5694 return NULL;
5695
5684free_pcpu: 5696free_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