Commit 5dd8d1e9 authored by Arjan van de Ven's avatar Arjan van de Ven Committed by Linus Torvalds

[PATCH] lockdep: annotate vlan net device as being a special class

vlan network devices have devices nesting below it, and are a special
"super class" of normal network devices; split their locks off into a
separate class since they always nest.

[deweerdt@free.fr: fix possible null-pointer deref]
Signed-off-by: default avatarArjan van de Ven <arjan@linux.intel.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarFrederik Deweerdt <frederik.deweerdt@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 663d440e
...@@ -364,6 +364,14 @@ static void vlan_transfer_operstate(const struct net_device *dev, struct net_dev ...@@ -364,6 +364,14 @@ static void vlan_transfer_operstate(const struct net_device *dev, struct net_dev
} }
} }
/*
* vlan network devices have devices nesting below it, and are a special
* "super class" of normal network devices; split their locks off into a
* separate class since they always nest.
*/
static struct lock_class_key vlan_netdev_xmit_lock_key;
/* Attach a VLAN device to a mac address (ie Ethernet Card). /* Attach a VLAN device to a mac address (ie Ethernet Card).
* Returns the device that was created, or NULL if there was * Returns the device that was created, or NULL if there was
* an error of some kind. * an error of some kind.
...@@ -460,6 +468,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, ...@@ -460,6 +468,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name,
new_dev = alloc_netdev(sizeof(struct vlan_dev_info), name, new_dev = alloc_netdev(sizeof(struct vlan_dev_info), name,
vlan_setup); vlan_setup);
if (new_dev == NULL) if (new_dev == NULL)
goto out_unlock; goto out_unlock;
...@@ -518,6 +527,8 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, ...@@ -518,6 +527,8 @@ static struct net_device *register_vlan_device(const char *eth_IF_name,
if (register_netdevice(new_dev)) if (register_netdevice(new_dev))
goto out_free_newdev; goto out_free_newdev;
lockdep_set_class(&new_dev->_xmit_lock, &vlan_netdev_xmit_lock_key);
new_dev->iflink = real_dev->ifindex; new_dev->iflink = real_dev->ifindex;
vlan_transfer_operstate(real_dev, new_dev); vlan_transfer_operstate(real_dev, new_dev);
linkwatch_fire_event(new_dev); /* _MUST_ call rfc2863_policy() */ linkwatch_fire_event(new_dev); /* _MUST_ call rfc2863_policy() */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment