diff options
author | Arjan van de Ven <arjan@linux.intel.com> | 2006-07-03 03:25:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-07-03 18:27:10 -0400 |
commit | 5dd8d1e9eb8b51041505966fe96d081ecbe86efe (patch) | |
tree | eba7299734a893016d4e91d92cb25974a626bc61 /net/8021q/vlan.c | |
parent | 663d440eaa496db903cc58be04b9b602ba45e43b (diff) |
[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: Arjan van de Ven <arjan@linux.intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Frederik Deweerdt <frederik.deweerdt@gmail.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'net/8021q/vlan.c')
-rw-r--r-- | net/8021q/vlan.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 3948949a609a..458031bfff55 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -364,6 +364,14 @@ static void vlan_transfer_operstate(const struct net_device *dev, struct net_dev | |||
364 | } | 364 | } |
365 | } | 365 | } |
366 | 366 | ||
367 | /* | ||
368 | * vlan network devices have devices nesting below it, and are a special | ||
369 | * "super class" of normal network devices; split their locks off into a | ||
370 | * separate class since they always nest. | ||
371 | */ | ||
372 | static struct lock_class_key vlan_netdev_xmit_lock_key; | ||
373 | |||
374 | |||
367 | /* Attach a VLAN device to a mac address (ie Ethernet Card). | 375 | /* Attach a VLAN device to a mac address (ie Ethernet Card). |
368 | * Returns the device that was created, or NULL if there was | 376 | * Returns the device that was created, or NULL if there was |
369 | * an error of some kind. | 377 | * an error of some kind. |
@@ -460,6 +468,7 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, | |||
460 | 468 | ||
461 | new_dev = alloc_netdev(sizeof(struct vlan_dev_info), name, | 469 | new_dev = alloc_netdev(sizeof(struct vlan_dev_info), name, |
462 | vlan_setup); | 470 | vlan_setup); |
471 | |||
463 | if (new_dev == NULL) | 472 | if (new_dev == NULL) |
464 | goto out_unlock; | 473 | goto out_unlock; |
465 | 474 | ||
@@ -518,6 +527,8 @@ static struct net_device *register_vlan_device(const char *eth_IF_name, | |||
518 | if (register_netdevice(new_dev)) | 527 | if (register_netdevice(new_dev)) |
519 | goto out_free_newdev; | 528 | goto out_free_newdev; |
520 | 529 | ||
530 | lockdep_set_class(&new_dev->_xmit_lock, &vlan_netdev_xmit_lock_key); | ||
531 | |||
521 | new_dev->iflink = real_dev->ifindex; | 532 | new_dev->iflink = real_dev->ifindex; |
522 | vlan_transfer_operstate(real_dev, new_dev); | 533 | vlan_transfer_operstate(real_dev, new_dev); |
523 | linkwatch_fire_event(new_dev); /* _MUST_ call rfc2863_policy() */ | 534 | linkwatch_fire_event(new_dev); /* _MUST_ call rfc2863_policy() */ |