diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 146 |
1 files changed, 115 insertions, 31 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 367a586d0c8a..cf8a95f48cff 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -132,6 +132,7 @@ | |||
132 | #include <linux/hashtable.h> | 132 | #include <linux/hashtable.h> |
133 | #include <linux/vmalloc.h> | 133 | #include <linux/vmalloc.h> |
134 | #include <linux/if_macvlan.h> | 134 | #include <linux/if_macvlan.h> |
135 | #include <linux/errqueue.h> | ||
135 | 136 | ||
136 | #include "net-sysfs.h" | 137 | #include "net-sysfs.h" |
137 | 138 | ||
@@ -1085,6 +1086,7 @@ static int dev_get_valid_name(struct net *net, | |||
1085 | */ | 1086 | */ |
1086 | int dev_change_name(struct net_device *dev, const char *newname) | 1087 | int dev_change_name(struct net_device *dev, const char *newname) |
1087 | { | 1088 | { |
1089 | unsigned char old_assign_type; | ||
1088 | char oldname[IFNAMSIZ]; | 1090 | char oldname[IFNAMSIZ]; |
1089 | int err = 0; | 1091 | int err = 0; |
1090 | int ret; | 1092 | int ret; |
@@ -1112,10 +1114,17 @@ int dev_change_name(struct net_device *dev, const char *newname) | |||
1112 | return err; | 1114 | return err; |
1113 | } | 1115 | } |
1114 | 1116 | ||
1117 | if (oldname[0] && !strchr(oldname, '%')) | ||
1118 | netdev_info(dev, "renamed from %s\n", oldname); | ||
1119 | |||
1120 | old_assign_type = dev->name_assign_type; | ||
1121 | dev->name_assign_type = NET_NAME_RENAMED; | ||
1122 | |||
1115 | rollback: | 1123 | rollback: |
1116 | ret = device_rename(&dev->dev, dev->name); | 1124 | ret = device_rename(&dev->dev, dev->name); |
1117 | if (ret) { | 1125 | if (ret) { |
1118 | memcpy(dev->name, oldname, IFNAMSIZ); | 1126 | memcpy(dev->name, oldname, IFNAMSIZ); |
1127 | dev->name_assign_type = old_assign_type; | ||
1119 | write_seqcount_end(&devnet_rename_seq); | 1128 | write_seqcount_end(&devnet_rename_seq); |
1120 | return ret; | 1129 | return ret; |
1121 | } | 1130 | } |
@@ -1144,6 +1153,8 @@ rollback: | |||
1144 | write_seqcount_begin(&devnet_rename_seq); | 1153 | write_seqcount_begin(&devnet_rename_seq); |
1145 | memcpy(dev->name, oldname, IFNAMSIZ); | 1154 | memcpy(dev->name, oldname, IFNAMSIZ); |
1146 | memcpy(oldname, newname, IFNAMSIZ); | 1155 | memcpy(oldname, newname, IFNAMSIZ); |
1156 | dev->name_assign_type = old_assign_type; | ||
1157 | old_assign_type = NET_NAME_RENAMED; | ||
1147 | goto rollback; | 1158 | goto rollback; |
1148 | } else { | 1159 | } else { |
1149 | pr_err("%s: name change rollback failed: %d\n", | 1160 | pr_err("%s: name change rollback failed: %d\n", |
@@ -2316,7 +2327,7 @@ __be16 skb_network_protocol(struct sk_buff *skb, int *depth) | |||
2316 | */ | 2327 | */ |
2317 | if (type == htons(ETH_P_8021Q) || type == htons(ETH_P_8021AD)) { | 2328 | if (type == htons(ETH_P_8021Q) || type == htons(ETH_P_8021AD)) { |
2318 | if (vlan_depth) { | 2329 | if (vlan_depth) { |
2319 | if (unlikely(WARN_ON(vlan_depth < VLAN_HLEN))) | 2330 | if (WARN_ON(vlan_depth < VLAN_HLEN)) |
2320 | return 0; | 2331 | return 0; |
2321 | vlan_depth -= VLAN_HLEN; | 2332 | vlan_depth -= VLAN_HLEN; |
2322 | } else { | 2333 | } else { |
@@ -2414,8 +2425,8 @@ struct sk_buff *__skb_gso_segment(struct sk_buff *skb, | |||
2414 | 2425 | ||
2415 | skb_warn_bad_offload(skb); | 2426 | skb_warn_bad_offload(skb); |
2416 | 2427 | ||
2417 | if (skb_header_cloned(skb) && | 2428 | err = skb_cow_head(skb, 0); |
2418 | (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) | 2429 | if (err < 0) |
2419 | return ERR_PTR(err); | 2430 | return ERR_PTR(err); |
2420 | } | 2431 | } |
2421 | 2432 | ||
@@ -2576,13 +2587,19 @@ netdev_features_t netif_skb_features(struct sk_buff *skb) | |||
2576 | return harmonize_features(skb, features); | 2587 | return harmonize_features(skb, features); |
2577 | } | 2588 | } |
2578 | 2589 | ||
2579 | features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX | | 2590 | features = netdev_intersect_features(features, |
2580 | NETIF_F_HW_VLAN_STAG_TX); | 2591 | skb->dev->vlan_features | |
2592 | NETIF_F_HW_VLAN_CTAG_TX | | ||
2593 | NETIF_F_HW_VLAN_STAG_TX); | ||
2581 | 2594 | ||
2582 | if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) | 2595 | if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD)) |
2583 | features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST | | 2596 | features = netdev_intersect_features(features, |
2584 | NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_CTAG_TX | | 2597 | NETIF_F_SG | |
2585 | NETIF_F_HW_VLAN_STAG_TX; | 2598 | NETIF_F_HIGHDMA | |
2599 | NETIF_F_FRAGLIST | | ||
2600 | NETIF_F_GEN_CSUM | | ||
2601 | NETIF_F_HW_VLAN_CTAG_TX | | ||
2602 | NETIF_F_HW_VLAN_STAG_TX); | ||
2586 | 2603 | ||
2587 | return harmonize_features(skb, features); | 2604 | return harmonize_features(skb, features); |
2588 | } | 2605 | } |
@@ -2745,8 +2762,8 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, | |||
2745 | /* | 2762 | /* |
2746 | * Heuristic to force contended enqueues to serialize on a | 2763 | * Heuristic to force contended enqueues to serialize on a |
2747 | * separate lock before trying to get qdisc main lock. | 2764 | * separate lock before trying to get qdisc main lock. |
2748 | * This permits __QDISC_STATE_RUNNING owner to get the lock more often | 2765 | * This permits __QDISC___STATE_RUNNING owner to get the lock more |
2749 | * and dequeue packets faster. | 2766 | * often and dequeue packets faster. |
2750 | */ | 2767 | */ |
2751 | contended = qdisc_is_running(q); | 2768 | contended = qdisc_is_running(q); |
2752 | if (unlikely(contended)) | 2769 | if (unlikely(contended)) |
@@ -2866,6 +2883,9 @@ static int __dev_queue_xmit(struct sk_buff *skb, void *accel_priv) | |||
2866 | 2883 | ||
2867 | skb_reset_mac_header(skb); | 2884 | skb_reset_mac_header(skb); |
2868 | 2885 | ||
2886 | if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP)) | ||
2887 | __skb_tstamp_tx(skb, NULL, skb->sk, SCM_TSTAMP_SCHED); | ||
2888 | |||
2869 | /* Disable soft irqs for various locks below. Also | 2889 | /* Disable soft irqs for various locks below. Also |
2870 | * stops preemption for RCU. | 2890 | * stops preemption for RCU. |
2871 | */ | 2891 | */ |
@@ -3588,7 +3608,7 @@ another_round: | |||
3588 | 3608 | ||
3589 | if (skb->protocol == cpu_to_be16(ETH_P_8021Q) || | 3609 | if (skb->protocol == cpu_to_be16(ETH_P_8021Q) || |
3590 | skb->protocol == cpu_to_be16(ETH_P_8021AD)) { | 3610 | skb->protocol == cpu_to_be16(ETH_P_8021AD)) { |
3591 | skb = vlan_untag(skb); | 3611 | skb = skb_vlan_untag(skb); |
3592 | if (unlikely(!skb)) | 3612 | if (unlikely(!skb)) |
3593 | goto unlock; | 3613 | goto unlock; |
3594 | } | 3614 | } |
@@ -4789,9 +4809,14 @@ static void netdev_adjacent_sysfs_del(struct net_device *dev, | |||
4789 | sysfs_remove_link(&(dev->dev.kobj), linkname); | 4809 | sysfs_remove_link(&(dev->dev.kobj), linkname); |
4790 | } | 4810 | } |
4791 | 4811 | ||
4792 | #define netdev_adjacent_is_neigh_list(dev, dev_list) \ | 4812 | static inline bool netdev_adjacent_is_neigh_list(struct net_device *dev, |
4793 | (dev_list == &dev->adj_list.upper || \ | 4813 | struct net_device *adj_dev, |
4794 | dev_list == &dev->adj_list.lower) | 4814 | struct list_head *dev_list) |
4815 | { | ||
4816 | return (dev_list == &dev->adj_list.upper || | ||
4817 | dev_list == &dev->adj_list.lower) && | ||
4818 | net_eq(dev_net(dev), dev_net(adj_dev)); | ||
4819 | } | ||
4795 | 4820 | ||
4796 | static int __netdev_adjacent_dev_insert(struct net_device *dev, | 4821 | static int __netdev_adjacent_dev_insert(struct net_device *dev, |
4797 | struct net_device *adj_dev, | 4822 | struct net_device *adj_dev, |
@@ -4821,7 +4846,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, | |||
4821 | pr_debug("dev_hold for %s, because of link added from %s to %s\n", | 4846 | pr_debug("dev_hold for %s, because of link added from %s to %s\n", |
4822 | adj_dev->name, dev->name, adj_dev->name); | 4847 | adj_dev->name, dev->name, adj_dev->name); |
4823 | 4848 | ||
4824 | if (netdev_adjacent_is_neigh_list(dev, dev_list)) { | 4849 | if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) { |
4825 | ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list); | 4850 | ret = netdev_adjacent_sysfs_add(dev, adj_dev, dev_list); |
4826 | if (ret) | 4851 | if (ret) |
4827 | goto free_adj; | 4852 | goto free_adj; |
@@ -4842,7 +4867,7 @@ static int __netdev_adjacent_dev_insert(struct net_device *dev, | |||
4842 | return 0; | 4867 | return 0; |
4843 | 4868 | ||
4844 | remove_symlinks: | 4869 | remove_symlinks: |
4845 | if (netdev_adjacent_is_neigh_list(dev, dev_list)) | 4870 | if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) |
4846 | netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); | 4871 | netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); |
4847 | free_adj: | 4872 | free_adj: |
4848 | kfree(adj); | 4873 | kfree(adj); |
@@ -4875,7 +4900,7 @@ static void __netdev_adjacent_dev_remove(struct net_device *dev, | |||
4875 | if (adj->master) | 4900 | if (adj->master) |
4876 | sysfs_remove_link(&(dev->dev.kobj), "master"); | 4901 | sysfs_remove_link(&(dev->dev.kobj), "master"); |
4877 | 4902 | ||
4878 | if (netdev_adjacent_is_neigh_list(dev, dev_list)) | 4903 | if (netdev_adjacent_is_neigh_list(dev, adj_dev, dev_list)) |
4879 | netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); | 4904 | netdev_adjacent_sysfs_del(dev, adj_dev->name, dev_list); |
4880 | 4905 | ||
4881 | list_del_rcu(&adj->list); | 4906 | list_del_rcu(&adj->list); |
@@ -5145,11 +5170,65 @@ void netdev_upper_dev_unlink(struct net_device *dev, | |||
5145 | } | 5170 | } |
5146 | EXPORT_SYMBOL(netdev_upper_dev_unlink); | 5171 | EXPORT_SYMBOL(netdev_upper_dev_unlink); |
5147 | 5172 | ||
5173 | void netdev_adjacent_add_links(struct net_device *dev) | ||
5174 | { | ||
5175 | struct netdev_adjacent *iter; | ||
5176 | |||
5177 | struct net *net = dev_net(dev); | ||
5178 | |||
5179 | list_for_each_entry(iter, &dev->adj_list.upper, list) { | ||
5180 | if (!net_eq(net,dev_net(iter->dev))) | ||
5181 | continue; | ||
5182 | netdev_adjacent_sysfs_add(iter->dev, dev, | ||
5183 | &iter->dev->adj_list.lower); | ||
5184 | netdev_adjacent_sysfs_add(dev, iter->dev, | ||
5185 | &dev->adj_list.upper); | ||
5186 | } | ||
5187 | |||
5188 | list_for_each_entry(iter, &dev->adj_list.lower, list) { | ||
5189 | if (!net_eq(net,dev_net(iter->dev))) | ||
5190 | continue; | ||
5191 | netdev_adjacent_sysfs_add(iter->dev, dev, | ||
5192 | &iter->dev->adj_list.upper); | ||
5193 | netdev_adjacent_sysfs_add(dev, iter->dev, | ||
5194 | &dev->adj_list.lower); | ||
5195 | } | ||
5196 | } | ||
5197 | |||
5198 | void netdev_adjacent_del_links(struct net_device *dev) | ||
5199 | { | ||
5200 | struct netdev_adjacent *iter; | ||
5201 | |||
5202 | struct net *net = dev_net(dev); | ||
5203 | |||
5204 | list_for_each_entry(iter, &dev->adj_list.upper, list) { | ||
5205 | if (!net_eq(net,dev_net(iter->dev))) | ||
5206 | continue; | ||
5207 | netdev_adjacent_sysfs_del(iter->dev, dev->name, | ||
5208 | &iter->dev->adj_list.lower); | ||
5209 | netdev_adjacent_sysfs_del(dev, iter->dev->name, | ||
5210 | &dev->adj_list.upper); | ||
5211 | } | ||
5212 | |||
5213 | list_for_each_entry(iter, &dev->adj_list.lower, list) { | ||
5214 | if (!net_eq(net,dev_net(iter->dev))) | ||
5215 | continue; | ||
5216 | netdev_adjacent_sysfs_del(iter->dev, dev->name, | ||
5217 | &iter->dev->adj_list.upper); | ||
5218 | netdev_adjacent_sysfs_del(dev, iter->dev->name, | ||
5219 | &dev->adj_list.lower); | ||
5220 | } | ||
5221 | } | ||
5222 | |||
5148 | void netdev_adjacent_rename_links(struct net_device *dev, char *oldname) | 5223 | void netdev_adjacent_rename_links(struct net_device *dev, char *oldname) |
5149 | { | 5224 | { |
5150 | struct netdev_adjacent *iter; | 5225 | struct netdev_adjacent *iter; |
5151 | 5226 | ||
5227 | struct net *net = dev_net(dev); | ||
5228 | |||
5152 | list_for_each_entry(iter, &dev->adj_list.upper, list) { | 5229 | list_for_each_entry(iter, &dev->adj_list.upper, list) { |
5230 | if (!net_eq(net,dev_net(iter->dev))) | ||
5231 | continue; | ||
5153 | netdev_adjacent_sysfs_del(iter->dev, oldname, | 5232 | netdev_adjacent_sysfs_del(iter->dev, oldname, |
5154 | &iter->dev->adj_list.lower); | 5233 | &iter->dev->adj_list.lower); |
5155 | netdev_adjacent_sysfs_add(iter->dev, dev, | 5234 | netdev_adjacent_sysfs_add(iter->dev, dev, |
@@ -5157,6 +5236,8 @@ void netdev_adjacent_rename_links(struct net_device *dev, char *oldname) | |||
5157 | } | 5236 | } |
5158 | 5237 | ||
5159 | list_for_each_entry(iter, &dev->adj_list.lower, list) { | 5238 | list_for_each_entry(iter, &dev->adj_list.lower, list) { |
5239 | if (!net_eq(net,dev_net(iter->dev))) | ||
5240 | continue; | ||
5160 | netdev_adjacent_sysfs_del(iter->dev, oldname, | 5241 | netdev_adjacent_sysfs_del(iter->dev, oldname, |
5161 | &iter->dev->adj_list.upper); | 5242 | &iter->dev->adj_list.upper); |
5162 | netdev_adjacent_sysfs_add(iter->dev, dev, | 5243 | netdev_adjacent_sysfs_add(iter->dev, dev, |
@@ -5440,13 +5521,9 @@ int __dev_change_flags(struct net_device *dev, unsigned int flags) | |||
5440 | */ | 5521 | */ |
5441 | 5522 | ||
5442 | ret = 0; | 5523 | ret = 0; |
5443 | if ((old_flags ^ flags) & IFF_UP) { /* Bit is different ? */ | 5524 | if ((old_flags ^ flags) & IFF_UP) |
5444 | ret = ((old_flags & IFF_UP) ? __dev_close : __dev_open)(dev); | 5525 | ret = ((old_flags & IFF_UP) ? __dev_close : __dev_open)(dev); |
5445 | 5526 | ||
5446 | if (!ret) | ||
5447 | dev_set_rx_mode(dev); | ||
5448 | } | ||
5449 | |||
5450 | if ((flags ^ dev->gflags) & IFF_PROMISC) { | 5527 | if ((flags ^ dev->gflags) & IFF_PROMISC) { |
5451 | int inc = (flags & IFF_PROMISC) ? 1 : -1; | 5528 | int inc = (flags & IFF_PROMISC) ? 1 : -1; |
5452 | unsigned int old_flags = dev->flags; | 5529 | unsigned int old_flags = dev->flags; |
@@ -6446,17 +6523,19 @@ void netdev_freemem(struct net_device *dev) | |||
6446 | 6523 | ||
6447 | /** | 6524 | /** |
6448 | * alloc_netdev_mqs - allocate network device | 6525 | * alloc_netdev_mqs - allocate network device |
6449 | * @sizeof_priv: size of private data to allocate space for | 6526 | * @sizeof_priv: size of private data to allocate space for |
6450 | * @name: device name format string | 6527 | * @name: device name format string |
6451 | * @setup: callback to initialize device | 6528 | * @name_assign_type: origin of device name |
6452 | * @txqs: the number of TX subqueues to allocate | 6529 | * @setup: callback to initialize device |
6453 | * @rxqs: the number of RX subqueues to allocate | 6530 | * @txqs: the number of TX subqueues to allocate |
6531 | * @rxqs: the number of RX subqueues to allocate | ||
6454 | * | 6532 | * |
6455 | * Allocates a struct net_device with private data area for driver use | 6533 | * Allocates a struct net_device with private data area for driver use |
6456 | * and performs basic initialization. Also allocates subqueue structs | 6534 | * and performs basic initialization. Also allocates subqueue structs |
6457 | * for each queue on the device. | 6535 | * for each queue on the device. |
6458 | */ | 6536 | */ |
6459 | struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, | 6537 | struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, |
6538 | unsigned char name_assign_type, | ||
6460 | void (*setup)(struct net_device *), | 6539 | void (*setup)(struct net_device *), |
6461 | unsigned int txqs, unsigned int rxqs) | 6540 | unsigned int txqs, unsigned int rxqs) |
6462 | { | 6541 | { |
@@ -6535,6 +6614,7 @@ struct net_device *alloc_netdev_mqs(int sizeof_priv, const char *name, | |||
6535 | #endif | 6614 | #endif |
6536 | 6615 | ||
6537 | strcpy(dev->name, name); | 6616 | strcpy(dev->name, name); |
6617 | dev->name_assign_type = name_assign_type; | ||
6538 | dev->group = INIT_NETDEV_GROUP; | 6618 | dev->group = INIT_NETDEV_GROUP; |
6539 | if (!dev->ethtool_ops) | 6619 | if (!dev->ethtool_ops) |
6540 | dev->ethtool_ops = &default_ethtool_ops; | 6620 | dev->ethtool_ops = &default_ethtool_ops; |
@@ -6760,6 +6840,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
6760 | 6840 | ||
6761 | /* Send a netdev-removed uevent to the old namespace */ | 6841 | /* Send a netdev-removed uevent to the old namespace */ |
6762 | kobject_uevent(&dev->dev.kobj, KOBJ_REMOVE); | 6842 | kobject_uevent(&dev->dev.kobj, KOBJ_REMOVE); |
6843 | netdev_adjacent_del_links(dev); | ||
6763 | 6844 | ||
6764 | /* Actually switch the network namespace */ | 6845 | /* Actually switch the network namespace */ |
6765 | dev_net_set(dev, net); | 6846 | dev_net_set(dev, net); |
@@ -6774,6 +6855,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
6774 | 6855 | ||
6775 | /* Send a netdev-add uevent to the new namespace */ | 6856 | /* Send a netdev-add uevent to the new namespace */ |
6776 | kobject_uevent(&dev->dev.kobj, KOBJ_ADD); | 6857 | kobject_uevent(&dev->dev.kobj, KOBJ_ADD); |
6858 | netdev_adjacent_add_links(dev); | ||
6777 | 6859 | ||
6778 | /* Fixup kobjects */ | 6860 | /* Fixup kobjects */ |
6779 | err = device_rename(&dev->dev, dev->name); | 6861 | err = device_rename(&dev->dev, dev->name); |
@@ -6946,12 +7028,14 @@ static int __netdev_printk(const char *level, const struct net_device *dev, | |||
6946 | if (dev && dev->dev.parent) { | 7028 | if (dev && dev->dev.parent) { |
6947 | r = dev_printk_emit(level[1] - '0', | 7029 | r = dev_printk_emit(level[1] - '0', |
6948 | dev->dev.parent, | 7030 | dev->dev.parent, |
6949 | "%s %s %s: %pV", | 7031 | "%s %s %s%s: %pV", |
6950 | dev_driver_string(dev->dev.parent), | 7032 | dev_driver_string(dev->dev.parent), |
6951 | dev_name(dev->dev.parent), | 7033 | dev_name(dev->dev.parent), |
6952 | netdev_name(dev), vaf); | 7034 | netdev_name(dev), netdev_reg_state(dev), |
7035 | vaf); | ||
6953 | } else if (dev) { | 7036 | } else if (dev) { |
6954 | r = printk("%s%s: %pV", level, netdev_name(dev), vaf); | 7037 | r = printk("%s%s%s: %pV", level, netdev_name(dev), |
7038 | netdev_reg_state(dev), vaf); | ||
6955 | } else { | 7039 | } else { |
6956 | r = printk("%s(NULL net_device): %pV", level, vaf); | 7040 | r = printk("%s(NULL net_device): %pV", level, vaf); |
6957 | } | 7041 | } |
@@ -7103,7 +7187,7 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list) | |||
7103 | rtnl_lock_unregistering(net_list); | 7187 | rtnl_lock_unregistering(net_list); |
7104 | list_for_each_entry(net, net_list, exit_list) { | 7188 | list_for_each_entry(net, net_list, exit_list) { |
7105 | for_each_netdev_reverse(net, dev) { | 7189 | for_each_netdev_reverse(net, dev) { |
7106 | if (dev->rtnl_link_ops) | 7190 | if (dev->rtnl_link_ops && dev->rtnl_link_ops->dellink) |
7107 | dev->rtnl_link_ops->dellink(dev, &dev_kill_list); | 7191 | dev->rtnl_link_ops->dellink(dev, &dev_kill_list); |
7108 | else | 7192 | else |
7109 | unregister_netdevice_queue(dev, &dev_kill_list); | 7193 | unregister_netdevice_queue(dev, &dev_kill_list); |