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.c44
1 files changed, 29 insertions, 15 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 7c6a46f80372..8ae6631abcc2 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -749,7 +749,8 @@ EXPORT_SYMBOL(dev_get_by_index);
749 * @ha: hardware address 749 * @ha: hardware address
750 * 750 *
751 * Search for an interface by MAC address. Returns NULL if the device 751 * Search for an interface by MAC address. Returns NULL if the device
752 * is not found or a pointer to the device. The caller must hold RCU 752 * is not found or a pointer to the device.
753 * The caller must hold RCU or RTNL.
753 * The returned device has not had its ref count increased 754 * The returned device has not had its ref count increased
754 * and the caller must therefore be careful about locking 755 * and the caller must therefore be careful about locking
755 * 756 *
@@ -1279,10 +1280,13 @@ static int __dev_close_many(struct list_head *head)
1279 1280
1280static int __dev_close(struct net_device *dev) 1281static int __dev_close(struct net_device *dev)
1281{ 1282{
1283 int retval;
1282 LIST_HEAD(single); 1284 LIST_HEAD(single);
1283 1285
1284 list_add(&dev->unreg_list, &single); 1286 list_add(&dev->unreg_list, &single);
1285 return __dev_close_many(&single); 1287 retval = __dev_close_many(&single);
1288 list_del(&single);
1289 return retval;
1286} 1290}
1287 1291
1288int dev_close_many(struct list_head *head) 1292int dev_close_many(struct list_head *head)
@@ -1324,7 +1328,7 @@ int dev_close(struct net_device *dev)
1324 1328
1325 list_add(&dev->unreg_list, &single); 1329 list_add(&dev->unreg_list, &single);
1326 dev_close_many(&single); 1330 dev_close_many(&single);
1327 1331 list_del(&single);
1328 return 0; 1332 return 0;
1329} 1333}
1330EXPORT_SYMBOL(dev_close); 1334EXPORT_SYMBOL(dev_close);
@@ -2562,7 +2566,8 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb,
2562 2566
2563 map = rcu_dereference(rxqueue->rps_map); 2567 map = rcu_dereference(rxqueue->rps_map);
2564 if (map) { 2568 if (map) {
2565 if (map->len == 1) { 2569 if (map->len == 1 &&
2570 !rcu_dereference_raw(rxqueue->rps_flow_table)) {
2566 tcpu = map->cpus[0]; 2571 tcpu = map->cpus[0];
2567 if (cpu_online(tcpu)) 2572 if (cpu_online(tcpu))
2568 cpu = tcpu; 2573 cpu = tcpu;
@@ -3423,6 +3428,8 @@ static void napi_reuse_skb(struct napi_struct *napi, struct sk_buff *skb)
3423 __skb_pull(skb, skb_headlen(skb)); 3428 __skb_pull(skb, skb_headlen(skb));
3424 skb_reserve(skb, NET_IP_ALIGN - skb_headroom(skb)); 3429 skb_reserve(skb, NET_IP_ALIGN - skb_headroom(skb));
3425 skb->vlan_tci = 0; 3430 skb->vlan_tci = 0;
3431 skb->dev = napi->dev;
3432 skb->skb_iif = 0;
3426 3433
3427 napi->skb = skb; 3434 napi->skb = skb;
3428} 3435}
@@ -5059,6 +5066,7 @@ static void rollback_registered(struct net_device *dev)
5059 5066
5060 list_add(&dev->unreg_list, &single); 5067 list_add(&dev->unreg_list, &single);
5061 rollback_registered_many(&single); 5068 rollback_registered_many(&single);
5069 list_del(&single);
5062} 5070}
5063 5071
5064unsigned long netdev_fix_features(unsigned long features, const char *name) 5072unsigned long netdev_fix_features(unsigned long features, const char *name)
@@ -5656,30 +5664,35 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name,
5656 5664
5657 dev_net_set(dev, &init_net); 5665 dev_net_set(dev, &init_net);
5658 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
5659 dev->num_tx_queues = txqs; 5677 dev->num_tx_queues = txqs;
5660 dev->real_num_tx_queues = txqs; 5678 dev->real_num_tx_queues = txqs;
5661 if (netif_alloc_netdev_queues(dev)) 5679 if (netif_alloc_netdev_queues(dev))
5662 goto free_pcpu; 5680 goto free_all;
5663 5681
5664#ifdef CONFIG_RPS 5682#ifdef CONFIG_RPS
5665 dev->num_rx_queues = rxqs; 5683 dev->num_rx_queues = rxqs;
5666 dev->real_num_rx_queues = rxqs; 5684 dev->real_num_rx_queues = rxqs;
5667 if (netif_alloc_rx_queues(dev)) 5685 if (netif_alloc_rx_queues(dev))
5668 goto free_pcpu; 5686 goto free_all;
5669#endif 5687#endif
5670 5688
5671 dev->gso_max_size = GSO_MAX_SIZE;
5672
5673 INIT_LIST_HEAD(&dev->ethtool_ntuple_list.list);
5674 dev->ethtool_ntuple_list.count = 0;
5675 INIT_LIST_HEAD(&dev->napi_list);
5676 INIT_LIST_HEAD(&dev->unreg_list);
5677 INIT_LIST_HEAD(&dev->link_watch_list);
5678 dev->priv_flags = IFF_XMIT_DST_RELEASE;
5679 setup(dev);
5680 strcpy(dev->name, name); 5689 strcpy(dev->name, name);
5681 return dev; 5690 return dev;
5682 5691
5692free_all:
5693 free_netdev(dev);
5694 return NULL;
5695
5683free_pcpu: 5696free_pcpu:
5684 free_percpu(dev->pcpu_refcnt); 5697 free_percpu(dev->pcpu_refcnt);
5685 kfree(dev->_tx); 5698 kfree(dev->_tx);
@@ -6207,6 +6220,7 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list)
6207 } 6220 }
6208 } 6221 }
6209 unregister_netdevice_many(&dev_kill_list); 6222 unregister_netdevice_many(&dev_kill_list);
6223 list_del(&dev_kill_list);
6210 rtnl_unlock(); 6224 rtnl_unlock();
6211} 6225}
6212 6226