diff options
| author | David S. Miller <davem@davemloft.net> | 2008-07-09 02:13:53 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2008-07-09 02:13:53 -0400 |
| commit | c773e847ea8f6812804e40f52399c6921a00eab1 (patch) | |
| tree | 952e0e262cc0b0f2136bc2a62938ae1d186f896a | |
| parent | eb6aafe3f843cb0e939546c03540a3b4911b6964 (diff) | |
netdev: Move _xmit_lock and xmit_lock_owner into netdev_queue.
Accesses are mostly structured such that when there are multiple TX
queues the code transformations will be a little bit simpler.
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/bonding/bond_main.c | 13 | ||||
| -rw-r--r-- | drivers/net/hamradio/bpqether.c | 12 | ||||
| -rw-r--r-- | drivers/net/macvlan.c | 14 | ||||
| -rw-r--r-- | drivers/net/wireless/hostap/hostap_hw.c | 12 | ||||
| -rw-r--r-- | include/linux/netdevice.h | 62 | ||||
| -rw-r--r-- | net/8021q/vlan_dev.c | 15 | ||||
| -rw-r--r-- | net/core/dev.c | 28 | ||||
| -rw-r--r-- | net/netrom/af_netrom.c | 12 | ||||
| -rw-r--r-- | net/rose/af_rose.c | 12 | ||||
| -rw-r--r-- | net/sched/sch_generic.c | 9 |
10 files changed, 145 insertions, 44 deletions
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index d57b65dc2c72..dc733d75a5e9 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -5019,6 +5019,17 @@ static int bond_check_params(struct bond_params *params) | |||
| 5019 | 5019 | ||
| 5020 | static struct lock_class_key bonding_netdev_xmit_lock_key; | 5020 | static struct lock_class_key bonding_netdev_xmit_lock_key; |
| 5021 | 5021 | ||
| 5022 | static void bond_set_lockdep_class_one(struct netdev_queue *txq) | ||
| 5023 | { | ||
| 5024 | lockdep_set_class(&txq->_xmit_lock, | ||
| 5025 | &bonding_netdev_xmit_lock_key); | ||
| 5026 | } | ||
| 5027 | |||
| 5028 | static void bond_set_lockdep_class(struct net_device *dev) | ||
| 5029 | { | ||
| 5030 | bond_set_lockdep_class_one(&dev->tx_queue); | ||
| 5031 | } | ||
| 5032 | |||
| 5022 | /* Create a new bond based on the specified name and bonding parameters. | 5033 | /* Create a new bond based on the specified name and bonding parameters. |
| 5023 | * If name is NULL, obtain a suitable "bond%d" name for us. | 5034 | * If name is NULL, obtain a suitable "bond%d" name for us. |
| 5024 | * Caller must NOT hold rtnl_lock; we need to release it here before we | 5035 | * Caller must NOT hold rtnl_lock; we need to release it here before we |
| @@ -5076,7 +5087,7 @@ int bond_create(char *name, struct bond_params *params) | |||
| 5076 | goto out_bond; | 5087 | goto out_bond; |
| 5077 | } | 5088 | } |
| 5078 | 5089 | ||
| 5079 | lockdep_set_class(&bond_dev->_xmit_lock, &bonding_netdev_xmit_lock_key); | 5090 | bond_set_lockdep_class(bond_dev); |
| 5080 | 5091 | ||
| 5081 | netif_carrier_off(bond_dev); | 5092 | netif_carrier_off(bond_dev); |
| 5082 | 5093 | ||
diff --git a/drivers/net/hamradio/bpqether.c b/drivers/net/hamradio/bpqether.c index 5f4b4c6c9f76..fb186b8c3d4d 100644 --- a/drivers/net/hamradio/bpqether.c +++ b/drivers/net/hamradio/bpqether.c | |||
| @@ -124,6 +124,16 @@ static LIST_HEAD(bpq_devices); | |||
| 124 | */ | 124 | */ |
| 125 | static struct lock_class_key bpq_netdev_xmit_lock_key; | 125 | static struct lock_class_key bpq_netdev_xmit_lock_key; |
| 126 | 126 | ||
| 127 | static void bpq_set_lockdep_class_one(struct netdev_queue *txq) | ||
| 128 | { | ||
| 129 | lockdep_set_class(&txq->_xmit_lock, &bpq_netdev_xmit_lock_key); | ||
| 130 | } | ||
| 131 | |||
| 132 | static void bpq_set_lockdep_class(struct net_device *dev) | ||
| 133 | { | ||
| 134 | bpq_set_lockdep_class_one(&dev->tx_queue); | ||
| 135 | } | ||
| 136 | |||
| 127 | /* ------------------------------------------------------------------------ */ | 137 | /* ------------------------------------------------------------------------ */ |
| 128 | 138 | ||
| 129 | 139 | ||
| @@ -523,7 +533,7 @@ static int bpq_new_device(struct net_device *edev) | |||
| 523 | err = register_netdevice(ndev); | 533 | err = register_netdevice(ndev); |
| 524 | if (err) | 534 | if (err) |
| 525 | goto error; | 535 | goto error; |
| 526 | lockdep_set_class(&ndev->_xmit_lock, &bpq_netdev_xmit_lock_key); | 536 | bpq_set_lockdep_class(ndev); |
| 527 | 537 | ||
| 528 | /* List protected by RTNL */ | 538 | /* List protected by RTNL */ |
| 529 | list_add_rcu(&bpq->bpq_list, &bpq_devices); | 539 | list_add_rcu(&bpq->bpq_list, &bpq_devices); |
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index c36a03ae9bfb..c02ceaa4a216 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
| @@ -277,6 +277,17 @@ static struct lock_class_key macvlan_netdev_xmit_lock_key; | |||
| 277 | #define MACVLAN_STATE_MASK \ | 277 | #define MACVLAN_STATE_MASK \ |
| 278 | ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT)) | 278 | ((1<<__LINK_STATE_NOCARRIER) | (1<<__LINK_STATE_DORMANT)) |
| 279 | 279 | ||
| 280 | static void macvlan_set_lockdep_class_one(struct netdev_queue *txq) | ||
| 281 | { | ||
| 282 | lockdep_set_class(&txq->_xmit_lock, | ||
| 283 | &macvlan_netdev_xmit_lock_key); | ||
| 284 | } | ||
| 285 | |||
| 286 | static void macvlan_set_lockdep_class(struct net_device *dev) | ||
| 287 | { | ||
| 288 | macvlan_set_lockdep_class_one(&dev->tx_queue); | ||
| 289 | } | ||
| 290 | |||
| 280 | static int macvlan_init(struct net_device *dev) | 291 | static int macvlan_init(struct net_device *dev) |
| 281 | { | 292 | { |
| 282 | struct macvlan_dev *vlan = netdev_priv(dev); | 293 | struct macvlan_dev *vlan = netdev_priv(dev); |
| @@ -287,7 +298,8 @@ static int macvlan_init(struct net_device *dev) | |||
| 287 | dev->features = lowerdev->features & MACVLAN_FEATURES; | 298 | dev->features = lowerdev->features & MACVLAN_FEATURES; |
| 288 | dev->iflink = lowerdev->ifindex; | 299 | dev->iflink = lowerdev->ifindex; |
| 289 | 300 | ||
| 290 | lockdep_set_class(&dev->_xmit_lock, &macvlan_netdev_xmit_lock_key); | 301 | macvlan_set_lockdep_class(dev); |
| 302 | |||
| 291 | return 0; | 303 | return 0; |
| 292 | } | 304 | } |
| 293 | 305 | ||
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index 09004a632ae7..c1f4bb005d92 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c | |||
| @@ -3102,6 +3102,16 @@ static void prism2_clear_set_tim_queue(local_info_t *local) | |||
| 3102 | */ | 3102 | */ |
| 3103 | static struct lock_class_key hostap_netdev_xmit_lock_key; | 3103 | static struct lock_class_key hostap_netdev_xmit_lock_key; |
| 3104 | 3104 | ||
| 3105 | static void prism2_set_lockdep_class_one(struct netdev_queue *txq) | ||
| 3106 | { | ||
| 3107 | lockdep_set_class(&txq->_xmit_lock, | ||
| 3108 | &hostap_netdev_xmit_lock_key); | ||
| 3109 | } | ||
| 3110 | |||
| 3111 | static void prism2_set_lockdep_class(struct net_device *dev) | ||
| 3112 | { | ||
| 3113 | prism2_set_lockdep_class_one(&dev->tx_queue); | ||
| 3114 | } | ||
| 3105 | 3115 | ||
| 3106 | static struct net_device * | 3116 | static struct net_device * |
| 3107 | prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx, | 3117 | prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx, |
| @@ -3268,7 +3278,7 @@ while (0) | |||
| 3268 | if (ret >= 0) | 3278 | if (ret >= 0) |
| 3269 | ret = register_netdevice(dev); | 3279 | ret = register_netdevice(dev); |
| 3270 | 3280 | ||
| 3271 | lockdep_set_class(&dev->_xmit_lock, &hostap_netdev_xmit_lock_key); | 3281 | prism2_set_lockdep_class(dev); |
| 3272 | rtnl_unlock(); | 3282 | rtnl_unlock(); |
| 3273 | if (ret < 0) { | 3283 | if (ret < 0) { |
| 3274 | printk(KERN_WARNING "%s: register netdevice failed!\n", | 3284 | printk(KERN_WARNING "%s: register netdevice failed!\n", |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 28aa8e77cee9..c8d5f128858d 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -453,6 +453,8 @@ struct netdev_queue { | |||
| 453 | struct net_device *dev; | 453 | struct net_device *dev; |
| 454 | struct Qdisc *qdisc; | 454 | struct Qdisc *qdisc; |
| 455 | struct sk_buff *gso_skb; | 455 | struct sk_buff *gso_skb; |
| 456 | spinlock_t _xmit_lock; | ||
| 457 | int xmit_lock_owner; | ||
| 456 | struct Qdisc *qdisc_sleeping; | 458 | struct Qdisc *qdisc_sleeping; |
| 457 | struct list_head qdisc_list; | 459 | struct list_head qdisc_list; |
| 458 | struct netdev_queue *next_sched; | 460 | struct netdev_queue *next_sched; |
| @@ -639,12 +641,6 @@ struct net_device | |||
| 639 | /* | 641 | /* |
| 640 | * One part is mostly used on xmit path (device) | 642 | * One part is mostly used on xmit path (device) |
| 641 | */ | 643 | */ |
| 642 | /* hard_start_xmit synchronizer */ | ||
| 643 | spinlock_t _xmit_lock ____cacheline_aligned_in_smp; | ||
| 644 | /* cpu id of processor entered to hard_start_xmit or -1, | ||
| 645 | if nobody entered there. | ||
| 646 | */ | ||
| 647 | int xmit_lock_owner; | ||
| 648 | void *priv; /* pointer to private data */ | 644 | void *priv; /* pointer to private data */ |
| 649 | int (*hard_start_xmit) (struct sk_buff *skb, | 645 | int (*hard_start_xmit) (struct sk_buff *skb, |
| 650 | struct net_device *dev); | 646 | struct net_device *dev); |
| @@ -1402,52 +1398,72 @@ static inline void netif_rx_complete(struct net_device *dev, | |||
| 1402 | * | 1398 | * |
| 1403 | * Get network device transmit lock | 1399 | * Get network device transmit lock |
| 1404 | */ | 1400 | */ |
| 1405 | static inline void __netif_tx_lock(struct net_device *dev, int cpu) | 1401 | static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu) |
| 1406 | { | 1402 | { |
| 1407 | spin_lock(&dev->_xmit_lock); | 1403 | spin_lock(&txq->_xmit_lock); |
| 1408 | dev->xmit_lock_owner = cpu; | 1404 | txq->xmit_lock_owner = cpu; |
| 1409 | } | 1405 | } |
| 1410 | 1406 | ||
| 1411 | static inline void netif_tx_lock(struct net_device *dev) | 1407 | static inline void netif_tx_lock(struct net_device *dev) |
| 1412 | { | 1408 | { |
| 1413 | __netif_tx_lock(dev, smp_processor_id()); | 1409 | __netif_tx_lock(&dev->tx_queue, smp_processor_id()); |
| 1410 | } | ||
| 1411 | |||
| 1412 | static inline void __netif_tx_lock_bh(struct netdev_queue *txq) | ||
| 1413 | { | ||
| 1414 | spin_lock_bh(&txq->_xmit_lock); | ||
| 1415 | txq->xmit_lock_owner = smp_processor_id(); | ||
| 1414 | } | 1416 | } |
| 1415 | 1417 | ||
| 1416 | static inline void netif_tx_lock_bh(struct net_device *dev) | 1418 | static inline void netif_tx_lock_bh(struct net_device *dev) |
| 1417 | { | 1419 | { |
| 1418 | spin_lock_bh(&dev->_xmit_lock); | 1420 | __netif_tx_lock_bh(&dev->tx_queue); |
| 1419 | dev->xmit_lock_owner = smp_processor_id(); | ||
| 1420 | } | 1421 | } |
| 1421 | 1422 | ||
| 1422 | static inline int netif_tx_trylock(struct net_device *dev) | 1423 | static inline int __netif_tx_trylock(struct netdev_queue *txq) |
| 1423 | { | 1424 | { |
| 1424 | int ok = spin_trylock(&dev->_xmit_lock); | 1425 | int ok = spin_trylock(&txq->_xmit_lock); |
| 1425 | if (likely(ok)) | 1426 | if (likely(ok)) |
| 1426 | dev->xmit_lock_owner = smp_processor_id(); | 1427 | txq->xmit_lock_owner = smp_processor_id(); |
| 1427 | return ok; | 1428 | return ok; |
| 1428 | } | 1429 | } |
| 1429 | 1430 | ||
| 1431 | static inline int netif_tx_trylock(struct net_device *dev) | ||
| 1432 | { | ||
| 1433 | return __netif_tx_trylock(&dev->tx_queue); | ||
| 1434 | } | ||
| 1435 | |||
| 1436 | static inline void __netif_tx_unlock(struct netdev_queue *txq) | ||
| 1437 | { | ||
| 1438 | txq->xmit_lock_owner = -1; | ||
| 1439 | spin_unlock(&txq->_xmit_lock); | ||
| 1440 | } | ||
| 1441 | |||
| 1430 | static inline void netif_tx_unlock(struct net_device *dev) | 1442 | static inline void netif_tx_unlock(struct net_device *dev) |
| 1431 | { | 1443 | { |
| 1432 | dev->xmit_lock_owner = -1; | 1444 | __netif_tx_unlock(&dev->tx_queue); |
| 1433 | spin_unlock(&dev->_xmit_lock); | 1445 | } |
| 1446 | |||
| 1447 | static inline void __netif_tx_unlock_bh(struct netdev_queue *txq) | ||
| 1448 | { | ||
| 1449 | txq->xmit_lock_owner = -1; | ||
| 1450 | spin_unlock_bh(&txq->_xmit_lock); | ||
| 1434 | } | 1451 | } |
| 1435 | 1452 | ||
| 1436 | static inline void netif_tx_unlock_bh(struct net_device *dev) | 1453 | static inline void netif_tx_unlock_bh(struct net_device *dev) |
| 1437 | { | 1454 | { |
| 1438 | dev->xmit_lock_owner = -1; | 1455 | __netif_tx_unlock_bh(&dev->tx_queue); |
| 1439 | spin_unlock_bh(&dev->_xmit_lock); | ||
| 1440 | } | 1456 | } |
| 1441 | 1457 | ||
| 1442 | #define HARD_TX_LOCK(dev, cpu) { \ | 1458 | #define HARD_TX_LOCK(dev, txq, cpu) { \ |
| 1443 | if ((dev->features & NETIF_F_LLTX) == 0) { \ | 1459 | if ((dev->features & NETIF_F_LLTX) == 0) { \ |
| 1444 | __netif_tx_lock(dev, cpu); \ | 1460 | __netif_tx_lock(txq, cpu); \ |
| 1445 | } \ | 1461 | } \ |
| 1446 | } | 1462 | } |
| 1447 | 1463 | ||
| 1448 | #define HARD_TX_UNLOCK(dev) { \ | 1464 | #define HARD_TX_UNLOCK(dev, txq) { \ |
| 1449 | if ((dev->features & NETIF_F_LLTX) == 0) { \ | 1465 | if ((dev->features & NETIF_F_LLTX) == 0) { \ |
| 1450 | netif_tx_unlock(dev); \ | 1466 | __netif_tx_unlock(txq); \ |
| 1451 | } \ | 1467 | } \ |
| 1452 | } | 1468 | } |
| 1453 | 1469 | ||
diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index b6e52c025fd8..8efa399823e3 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c | |||
| @@ -627,6 +627,18 @@ static void vlan_dev_set_rx_mode(struct net_device *vlan_dev) | |||
| 627 | */ | 627 | */ |
| 628 | static struct lock_class_key vlan_netdev_xmit_lock_key; | 628 | static struct lock_class_key vlan_netdev_xmit_lock_key; |
| 629 | 629 | ||
| 630 | static void vlan_dev_set_lockdep_one(struct netdev_queue *txq, | ||
| 631 | int subclass) | ||
| 632 | { | ||
| 633 | lockdep_set_class_and_subclass(&txq->_xmit_lock, | ||
| 634 | &vlan_netdev_xmit_lock_key, subclass); | ||
| 635 | } | ||
| 636 | |||
| 637 | static void vlan_dev_set_lockdep_class(struct net_device *dev, int subclass) | ||
| 638 | { | ||
| 639 | vlan_dev_set_lockdep_one(&dev->tx_queue, subclass); | ||
| 640 | } | ||
| 641 | |||
| 630 | static const struct header_ops vlan_header_ops = { | 642 | static const struct header_ops vlan_header_ops = { |
| 631 | .create = vlan_dev_hard_header, | 643 | .create = vlan_dev_hard_header, |
| 632 | .rebuild = vlan_dev_rebuild_header, | 644 | .rebuild = vlan_dev_rebuild_header, |
| @@ -668,8 +680,7 @@ static int vlan_dev_init(struct net_device *dev) | |||
| 668 | if (is_vlan_dev(real_dev)) | 680 | if (is_vlan_dev(real_dev)) |
| 669 | subclass = 1; | 681 | subclass = 1; |
| 670 | 682 | ||
| 671 | lockdep_set_class_and_subclass(&dev->_xmit_lock, | 683 | vlan_dev_set_lockdep_class(dev, subclass); |
| 672 | &vlan_netdev_xmit_lock_key, subclass); | ||
| 673 | return 0; | 684 | return 0; |
| 674 | } | 685 | } |
| 675 | 686 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index 0218b0b9be80..a29a359b15d1 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -258,7 +258,7 @@ DEFINE_PER_CPU(struct softnet_data, softnet_data); | |||
| 258 | 258 | ||
| 259 | #ifdef CONFIG_DEBUG_LOCK_ALLOC | 259 | #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| 260 | /* | 260 | /* |
| 261 | * register_netdevice() inits dev->_xmit_lock and sets lockdep class | 261 | * register_netdevice() inits txq->_xmit_lock and sets lockdep class |
| 262 | * according to dev->type | 262 | * according to dev->type |
| 263 | */ | 263 | */ |
| 264 | static const unsigned short netdev_lock_type[] = | 264 | static const unsigned short netdev_lock_type[] = |
| @@ -1758,19 +1758,19 @@ gso: | |||
| 1758 | if (dev->flags & IFF_UP) { | 1758 | if (dev->flags & IFF_UP) { |
| 1759 | int cpu = smp_processor_id(); /* ok because BHs are off */ | 1759 | int cpu = smp_processor_id(); /* ok because BHs are off */ |
| 1760 | 1760 | ||
| 1761 | if (dev->xmit_lock_owner != cpu) { | 1761 | if (txq->xmit_lock_owner != cpu) { |
| 1762 | 1762 | ||
| 1763 | HARD_TX_LOCK(dev, cpu); | 1763 | HARD_TX_LOCK(dev, txq, cpu); |
| 1764 | 1764 | ||
| 1765 | if (!netif_queue_stopped(dev) && | 1765 | if (!netif_queue_stopped(dev) && |
| 1766 | !netif_subqueue_stopped(dev, skb)) { | 1766 | !netif_subqueue_stopped(dev, skb)) { |
| 1767 | rc = 0; | 1767 | rc = 0; |
| 1768 | if (!dev_hard_start_xmit(skb, dev)) { | 1768 | if (!dev_hard_start_xmit(skb, dev)) { |
| 1769 | HARD_TX_UNLOCK(dev); | 1769 | HARD_TX_UNLOCK(dev, txq); |
| 1770 | goto out; | 1770 | goto out; |
| 1771 | } | 1771 | } |
| 1772 | } | 1772 | } |
| 1773 | HARD_TX_UNLOCK(dev); | 1773 | HARD_TX_UNLOCK(dev, txq); |
| 1774 | if (net_ratelimit()) | 1774 | if (net_ratelimit()) |
| 1775 | printk(KERN_CRIT "Virtual device %s asks to " | 1775 | printk(KERN_CRIT "Virtual device %s asks to " |
| 1776 | "queue packet!\n", dev->name); | 1776 | "queue packet!\n", dev->name); |
| @@ -3761,6 +3761,20 @@ static void rollback_registered(struct net_device *dev) | |||
| 3761 | dev_put(dev); | 3761 | dev_put(dev); |
| 3762 | } | 3762 | } |
| 3763 | 3763 | ||
| 3764 | static void __netdev_init_queue_locks_one(struct netdev_queue *dev_queue, | ||
| 3765 | struct net_device *dev) | ||
| 3766 | { | ||
| 3767 | spin_lock_init(&dev_queue->_xmit_lock); | ||
| 3768 | netdev_set_lockdep_class(&dev_queue->_xmit_lock, dev->type); | ||
| 3769 | dev_queue->xmit_lock_owner = -1; | ||
| 3770 | } | ||
| 3771 | |||
| 3772 | static void netdev_init_queue_locks(struct net_device *dev) | ||
| 3773 | { | ||
| 3774 | __netdev_init_queue_locks_one(&dev->tx_queue, dev); | ||
| 3775 | __netdev_init_queue_locks_one(&dev->rx_queue, dev); | ||
| 3776 | } | ||
| 3777 | |||
| 3764 | /** | 3778 | /** |
| 3765 | * register_netdevice - register a network device | 3779 | * register_netdevice - register a network device |
| 3766 | * @dev: device to register | 3780 | * @dev: device to register |
| @@ -3795,9 +3809,7 @@ int register_netdevice(struct net_device *dev) | |||
| 3795 | BUG_ON(!dev_net(dev)); | 3809 | BUG_ON(!dev_net(dev)); |
| 3796 | net = dev_net(dev); | 3810 | net = dev_net(dev); |
| 3797 | 3811 | ||
| 3798 | spin_lock_init(&dev->_xmit_lock); | 3812 | netdev_init_queue_locks(dev); |
| 3799 | netdev_set_lockdep_class(&dev->_xmit_lock, dev->type); | ||
| 3800 | dev->xmit_lock_owner = -1; | ||
| 3801 | 3813 | ||
| 3802 | dev->iflink = -1; | 3814 | dev->iflink = -1; |
| 3803 | 3815 | ||
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 74884f4a6255..819afc449e1e 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c | |||
| @@ -74,6 +74,16 @@ static const struct proto_ops nr_proto_ops; | |||
| 74 | */ | 74 | */ |
| 75 | static struct lock_class_key nr_netdev_xmit_lock_key; | 75 | static struct lock_class_key nr_netdev_xmit_lock_key; |
| 76 | 76 | ||
| 77 | static void nr_set_lockdep_one(struct netdev_queue *txq) | ||
| 78 | { | ||
| 79 | lockdep_set_class(&txq->_xmit_lock, &nr_netdev_xmit_lock_key); | ||
| 80 | } | ||
| 81 | |||
| 82 | static void nr_set_lockdep_key(struct net_device *dev) | ||
| 83 | { | ||
| 84 | nr_set_lockdep_one(&dev->tx_queue); | ||
| 85 | } | ||
| 86 | |||
| 77 | /* | 87 | /* |
| 78 | * Socket removal during an interrupt is now safe. | 88 | * Socket removal during an interrupt is now safe. |
| 79 | */ | 89 | */ |
| @@ -1430,7 +1440,7 @@ static int __init nr_proto_init(void) | |||
| 1430 | free_netdev(dev); | 1440 | free_netdev(dev); |
| 1431 | goto fail; | 1441 | goto fail; |
| 1432 | } | 1442 | } |
| 1433 | lockdep_set_class(&dev->_xmit_lock, &nr_netdev_xmit_lock_key); | 1443 | nr_set_lockdep_key(dev); |
| 1434 | dev_nr[i] = dev; | 1444 | dev_nr[i] = dev; |
| 1435 | } | 1445 | } |
| 1436 | 1446 | ||
diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c index 46461a69cd0f..7dbbc0891623 100644 --- a/net/rose/af_rose.c +++ b/net/rose/af_rose.c | |||
| @@ -75,6 +75,16 @@ ax25_address rose_callsign; | |||
| 75 | */ | 75 | */ |
| 76 | static struct lock_class_key rose_netdev_xmit_lock_key; | 76 | static struct lock_class_key rose_netdev_xmit_lock_key; |
| 77 | 77 | ||
| 78 | static void rose_set_lockdep_one(struct netdev_queue *txq) | ||
| 79 | { | ||
| 80 | lockdep_set_class(&txq->_xmit_lock, &rose_netdev_xmit_lock_key); | ||
| 81 | } | ||
| 82 | |||
| 83 | static void rose_set_lockdep_key(struct net_device *dev) | ||
| 84 | { | ||
| 85 | rose_set_lockdep_one(&dev->tx_queue); | ||
| 86 | } | ||
| 87 | |||
| 78 | /* | 88 | /* |
| 79 | * Convert a ROSE address into text. | 89 | * Convert a ROSE address into text. |
| 80 | */ | 90 | */ |
| @@ -1576,7 +1586,7 @@ static int __init rose_proto_init(void) | |||
| 1576 | free_netdev(dev); | 1586 | free_netdev(dev); |
| 1577 | goto fail; | 1587 | goto fail; |
| 1578 | } | 1588 | } |
| 1579 | lockdep_set_class(&dev->_xmit_lock, &rose_netdev_xmit_lock_key); | 1589 | rose_set_lockdep_key(dev); |
| 1580 | dev_rose[i] = dev; | 1590 | dev_rose[i] = dev; |
| 1581 | } | 1591 | } |
| 1582 | 1592 | ||
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index fcc7533f0bcc..b6a36d394663 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
| @@ -92,10 +92,9 @@ static inline int handle_dev_cpu_collision(struct sk_buff *skb, | |||
| 92 | struct netdev_queue *dev_queue, | 92 | struct netdev_queue *dev_queue, |
| 93 | struct Qdisc *q) | 93 | struct Qdisc *q) |
| 94 | { | 94 | { |
| 95 | struct net_device *dev = dev_queue->dev; | ||
| 96 | int ret; | 95 | int ret; |
| 97 | 96 | ||
| 98 | if (unlikely(dev->xmit_lock_owner == smp_processor_id())) { | 97 | if (unlikely(dev_queue->xmit_lock_owner == smp_processor_id())) { |
| 99 | /* | 98 | /* |
| 100 | * Same CPU holding the lock. It may be a transient | 99 | * Same CPU holding the lock. It may be a transient |
| 101 | * configuration error, when hard_start_xmit() recurses. We | 100 | * configuration error, when hard_start_xmit() recurses. We |
| @@ -105,7 +104,7 @@ static inline int handle_dev_cpu_collision(struct sk_buff *skb, | |||
| 105 | kfree_skb(skb); | 104 | kfree_skb(skb); |
| 106 | if (net_ratelimit()) | 105 | if (net_ratelimit()) |
| 107 | printk(KERN_WARNING "Dead loop on netdevice %s, " | 106 | printk(KERN_WARNING "Dead loop on netdevice %s, " |
| 108 | "fix it urgently!\n", dev->name); | 107 | "fix it urgently!\n", dev_queue->dev->name); |
| 109 | ret = qdisc_qlen(q); | 108 | ret = qdisc_qlen(q); |
| 110 | } else { | 109 | } else { |
| 111 | /* | 110 | /* |
| @@ -155,10 +154,10 @@ static inline int qdisc_restart(struct netdev_queue *txq) | |||
| 155 | 154 | ||
| 156 | dev = txq->dev; | 155 | dev = txq->dev; |
| 157 | 156 | ||
| 158 | HARD_TX_LOCK(dev, smp_processor_id()); | 157 | HARD_TX_LOCK(dev, txq, smp_processor_id()); |
| 159 | if (!netif_subqueue_stopped(dev, skb)) | 158 | if (!netif_subqueue_stopped(dev, skb)) |
| 160 | ret = dev_hard_start_xmit(skb, dev); | 159 | ret = dev_hard_start_xmit(skb, dev); |
| 161 | HARD_TX_UNLOCK(dev); | 160 | HARD_TX_UNLOCK(dev, txq); |
| 162 | 161 | ||
| 163 | spin_lock(&txq->lock); | 162 | spin_lock(&txq->lock); |
| 164 | q = txq->qdisc; | 163 | q = txq->qdisc; |
