|
@@ -120,9 +120,10 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head)
|
|
grp->nr_vlans--;
|
|
grp->nr_vlans--;
|
|
|
|
|
|
vlan_group_set_device(grp, vlan_id, NULL);
|
|
vlan_group_set_device(grp, vlan_id, NULL);
|
|
- if (!grp->killall)
|
|
|
|
- synchronize_net();
|
|
|
|
-
|
|
|
|
|
|
+ /* Because unregister_netdevice_queue() makes sure at least one rcu
|
|
|
|
+ * grace period is respected before device freeing,
|
|
|
|
+ * we dont need to call synchronize_net() here.
|
|
|
|
+ */
|
|
unregister_netdevice_queue(dev, head);
|
|
unregister_netdevice_queue(dev, head);
|
|
|
|
|
|
/* If the group is now empty, kill off the group. */
|
|
/* If the group is now empty, kill off the group. */
|
|
@@ -478,9 +479,6 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
|
|
if (dev->reg_state != NETREG_UNREGISTERING)
|
|
if (dev->reg_state != NETREG_UNREGISTERING)
|
|
break;
|
|
break;
|
|
|
|
|
|
- /* Delete all VLANs for this dev. */
|
|
|
|
- grp->killall = 1;
|
|
|
|
-
|
|
|
|
for (i = 0; i < VLAN_N_VID; i++) {
|
|
for (i = 0; i < VLAN_N_VID; i++) {
|
|
vlandev = vlan_group_get_device(grp, i);
|
|
vlandev = vlan_group_get_device(grp, i);
|
|
if (!vlandev)
|
|
if (!vlandev)
|