diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2011-05-09 00:40:44 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-05-09 14:41:41 -0400 |
commit | 48752e1b1802231ef2a076f34d861918b7d571c3 (patch) | |
tree | d4be28aa585dd24e3ebe456748a4d92a841882d3 /net/8021q | |
parent | da37e368763f708d2ae5a81e61ec59372b831cf5 (diff) |
vlan: remove one synchronize_net() call
At VLAN dismantle phase, unregister_vlan_dev() makes one
synchronize_net() call after vlan_group_set_device(grp, vlan_id, NULL).
This call can be safely removed because we are calling
unregister_netdevice_queue() to queue device for deletion, and this
process needs at least one rcu grace period to complete.
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Ben Greear <greearb@candelatech.com>
Cc: Patrick McHardy <kaber@trash.net>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Jesse Gross <jesse@nicira.com>
Cc: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Acked-by: Jesse Gross <jesse@nicira.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/8021q')
-rw-r--r-- | net/8021q/vlan.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 969e7004cf86..718d635d3379 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -120,9 +120,10 @@ void unregister_vlan_dev(struct net_device *dev, struct list_head *head) | |||
120 | grp->nr_vlans--; | 120 | grp->nr_vlans--; |
121 | 121 | ||
122 | vlan_group_set_device(grp, vlan_id, NULL); | 122 | vlan_group_set_device(grp, vlan_id, NULL); |
123 | if (!grp->killall) | 123 | /* Because unregister_netdevice_queue() makes sure at least one rcu |
124 | synchronize_net(); | 124 | * grace period is respected before device freeing, |
125 | 125 | * we dont need to call synchronize_net() here. | |
126 | */ | ||
126 | unregister_netdevice_queue(dev, head); | 127 | unregister_netdevice_queue(dev, head); |
127 | 128 | ||
128 | /* If the group is now empty, kill off the group. */ | 129 | /* 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, | |||
478 | if (dev->reg_state != NETREG_UNREGISTERING) | 479 | if (dev->reg_state != NETREG_UNREGISTERING) |
479 | break; | 480 | break; |
480 | 481 | ||
481 | /* Delete all VLANs for this dev. */ | ||
482 | grp->killall = 1; | ||
483 | |||
484 | for (i = 0; i < VLAN_N_VID; i++) { | 482 | for (i = 0; i < VLAN_N_VID; i++) { |
485 | vlandev = vlan_group_get_device(grp, i); | 483 | vlandev = vlan_group_get_device(grp, i); |
486 | if (!vlandev) | 484 | if (!vlandev) |