Loading drivers/net/ifb.c +0 −20 Original line number Diff line number Diff line Loading @@ -35,7 +35,6 @@ #include <linux/moduleparam.h> #include <net/pkt_sched.h> #include <net/net_namespace.h> #include <linux/lockdep.h> #define TX_TIMEOUT (2*HZ) Loading Loading @@ -228,22 +227,6 @@ static struct rtnl_link_ops ifb_link_ops __read_mostly = { module_param(numifbs, int, 0); MODULE_PARM_DESC(numifbs, "Number of ifb devices"); /* * dev_ifb's TX queue lock is usually taken after dev->rx_queue.lock, * reversely to e.g. qdisc_lock_tree(). It should be safe until * ifb doesn't take dev's TX queue lock with dev_ifb->rx_queue.lock. * But lockdep should know that ifb has different locks from dev. */ static struct lock_class_key ifb_tx_queue_lock_key; static struct lock_class_key ifb_rx_queue_lock_key; static void set_tx_lockdep_key(struct net_device *dev, struct netdev_queue *txq, void *_unused) { lockdep_set_class(&txq->lock, &ifb_tx_queue_lock_key); } static int __init ifb_init_one(int index) { struct net_device *dev_ifb; Loading @@ -264,9 +247,6 @@ static int __init ifb_init_one(int index) if (err < 0) goto err; netdev_for_each_tx_queue(dev_ifb, set_tx_lockdep_key, NULL); lockdep_set_class(&dev_ifb->rx_queue.lock, &ifb_rx_queue_lock_key); return 0; err: Loading include/linux/netdevice.h +0 −1 Original line number Diff line number Diff line Loading @@ -443,7 +443,6 @@ enum netdev_queue_state_t }; struct netdev_queue { spinlock_t lock; struct net_device *dev; struct Qdisc *qdisc; unsigned long state; Loading include/net/sch_generic.h +6 −1 Original line number Diff line number Diff line Loading @@ -163,6 +163,11 @@ struct tcf_proto struct tcf_proto_ops *ops; }; static inline spinlock_t *qdisc_lock(struct Qdisc *qdisc) { return &qdisc->q.lock; } static inline struct Qdisc *qdisc_root(struct Qdisc *qdisc) { return qdisc->dev_queue->qdisc; Loading @@ -172,7 +177,7 @@ static inline spinlock_t *qdisc_root_lock(struct Qdisc *qdisc) { struct Qdisc *root = qdisc_root(qdisc); return &root->dev_queue->lock; return qdisc_lock(root); } static inline struct net_device *qdisc_dev(struct Qdisc *qdisc) Loading net/core/dev.c +5 −4 Original line number Diff line number Diff line Loading @@ -2080,10 +2080,12 @@ static int ing_filter(struct sk_buff *skb) rxq = &dev->rx_queue; spin_lock(&rxq->lock); if ((q = rxq->qdisc) != NULL) q = rxq->qdisc; if (q) { spin_lock(qdisc_lock(q)); result = q->enqueue(skb, q); spin_unlock(&rxq->lock); spin_unlock(qdisc_lock(q)); } return result; } Loading Loading @@ -4173,7 +4175,6 @@ static void netdev_init_one_queue(struct net_device *dev, struct netdev_queue *queue, void *_unused) { spin_lock_init(&queue->lock); queue->dev = dev; } Loading net/mac80211/wme.c +12 −7 Original line number Diff line number Diff line Loading @@ -237,12 +237,14 @@ void ieee80211_ht_agg_queue_remove(struct ieee80211_local *local, ieee80211_requeue(local, agg_queue); } else { struct netdev_queue *txq; spinlock_t *root_lock; txq = netdev_get_tx_queue(local->mdev, agg_queue); root_lock = qdisc_root_lock(txq->qdisc); spin_lock_bh(&txq->lock); spin_lock_bh(root_lock); qdisc_reset(txq->qdisc); spin_unlock_bh(&txq->lock); spin_unlock_bh(root_lock); } } Loading @@ -250,6 +252,7 @@ void ieee80211_requeue(struct ieee80211_local *local, int queue) { struct netdev_queue *txq = netdev_get_tx_queue(local->mdev, queue); struct sk_buff_head list; spinlock_t *root_lock; struct Qdisc *qdisc; u32 len; Loading @@ -261,14 +264,15 @@ void ieee80211_requeue(struct ieee80211_local *local, int queue) skb_queue_head_init(&list); spin_lock(&txq->lock); root_lock = qdisc_root_lock(qdisc); spin_lock(root_lock); for (len = qdisc->q.qlen; len > 0; len--) { struct sk_buff *skb = qdisc->dequeue(qdisc); if (skb) __skb_queue_tail(&list, skb); } spin_unlock(&txq->lock); spin_unlock(root_lock); for (len = list.qlen; len > 0; len--) { struct sk_buff *skb = __skb_dequeue(&list); Loading @@ -280,12 +284,13 @@ void ieee80211_requeue(struct ieee80211_local *local, int queue) txq = netdev_get_tx_queue(local->mdev, new_queue); spin_lock(&txq->lock); qdisc = rcu_dereference(txq->qdisc); qdisc->enqueue(skb, qdisc); root_lock = qdisc_root_lock(qdisc); spin_unlock(&txq->lock); spin_lock(root_lock); qdisc->enqueue(skb, qdisc); spin_unlock(root_lock); } out_unlock: Loading Loading
drivers/net/ifb.c +0 −20 Original line number Diff line number Diff line Loading @@ -35,7 +35,6 @@ #include <linux/moduleparam.h> #include <net/pkt_sched.h> #include <net/net_namespace.h> #include <linux/lockdep.h> #define TX_TIMEOUT (2*HZ) Loading Loading @@ -228,22 +227,6 @@ static struct rtnl_link_ops ifb_link_ops __read_mostly = { module_param(numifbs, int, 0); MODULE_PARM_DESC(numifbs, "Number of ifb devices"); /* * dev_ifb's TX queue lock is usually taken after dev->rx_queue.lock, * reversely to e.g. qdisc_lock_tree(). It should be safe until * ifb doesn't take dev's TX queue lock with dev_ifb->rx_queue.lock. * But lockdep should know that ifb has different locks from dev. */ static struct lock_class_key ifb_tx_queue_lock_key; static struct lock_class_key ifb_rx_queue_lock_key; static void set_tx_lockdep_key(struct net_device *dev, struct netdev_queue *txq, void *_unused) { lockdep_set_class(&txq->lock, &ifb_tx_queue_lock_key); } static int __init ifb_init_one(int index) { struct net_device *dev_ifb; Loading @@ -264,9 +247,6 @@ static int __init ifb_init_one(int index) if (err < 0) goto err; netdev_for_each_tx_queue(dev_ifb, set_tx_lockdep_key, NULL); lockdep_set_class(&dev_ifb->rx_queue.lock, &ifb_rx_queue_lock_key); return 0; err: Loading
include/linux/netdevice.h +0 −1 Original line number Diff line number Diff line Loading @@ -443,7 +443,6 @@ enum netdev_queue_state_t }; struct netdev_queue { spinlock_t lock; struct net_device *dev; struct Qdisc *qdisc; unsigned long state; Loading
include/net/sch_generic.h +6 −1 Original line number Diff line number Diff line Loading @@ -163,6 +163,11 @@ struct tcf_proto struct tcf_proto_ops *ops; }; static inline spinlock_t *qdisc_lock(struct Qdisc *qdisc) { return &qdisc->q.lock; } static inline struct Qdisc *qdisc_root(struct Qdisc *qdisc) { return qdisc->dev_queue->qdisc; Loading @@ -172,7 +177,7 @@ static inline spinlock_t *qdisc_root_lock(struct Qdisc *qdisc) { struct Qdisc *root = qdisc_root(qdisc); return &root->dev_queue->lock; return qdisc_lock(root); } static inline struct net_device *qdisc_dev(struct Qdisc *qdisc) Loading
net/core/dev.c +5 −4 Original line number Diff line number Diff line Loading @@ -2080,10 +2080,12 @@ static int ing_filter(struct sk_buff *skb) rxq = &dev->rx_queue; spin_lock(&rxq->lock); if ((q = rxq->qdisc) != NULL) q = rxq->qdisc; if (q) { spin_lock(qdisc_lock(q)); result = q->enqueue(skb, q); spin_unlock(&rxq->lock); spin_unlock(qdisc_lock(q)); } return result; } Loading Loading @@ -4173,7 +4175,6 @@ static void netdev_init_one_queue(struct net_device *dev, struct netdev_queue *queue, void *_unused) { spin_lock_init(&queue->lock); queue->dev = dev; } Loading
net/mac80211/wme.c +12 −7 Original line number Diff line number Diff line Loading @@ -237,12 +237,14 @@ void ieee80211_ht_agg_queue_remove(struct ieee80211_local *local, ieee80211_requeue(local, agg_queue); } else { struct netdev_queue *txq; spinlock_t *root_lock; txq = netdev_get_tx_queue(local->mdev, agg_queue); root_lock = qdisc_root_lock(txq->qdisc); spin_lock_bh(&txq->lock); spin_lock_bh(root_lock); qdisc_reset(txq->qdisc); spin_unlock_bh(&txq->lock); spin_unlock_bh(root_lock); } } Loading @@ -250,6 +252,7 @@ void ieee80211_requeue(struct ieee80211_local *local, int queue) { struct netdev_queue *txq = netdev_get_tx_queue(local->mdev, queue); struct sk_buff_head list; spinlock_t *root_lock; struct Qdisc *qdisc; u32 len; Loading @@ -261,14 +264,15 @@ void ieee80211_requeue(struct ieee80211_local *local, int queue) skb_queue_head_init(&list); spin_lock(&txq->lock); root_lock = qdisc_root_lock(qdisc); spin_lock(root_lock); for (len = qdisc->q.qlen; len > 0; len--) { struct sk_buff *skb = qdisc->dequeue(qdisc); if (skb) __skb_queue_tail(&list, skb); } spin_unlock(&txq->lock); spin_unlock(root_lock); for (len = list.qlen; len > 0; len--) { struct sk_buff *skb = __skb_dequeue(&list); Loading @@ -280,12 +284,13 @@ void ieee80211_requeue(struct ieee80211_local *local, int queue) txq = netdev_get_tx_queue(local->mdev, new_queue); spin_lock(&txq->lock); qdisc = rcu_dereference(txq->qdisc); qdisc->enqueue(skb, qdisc); root_lock = qdisc_root_lock(qdisc); spin_unlock(&txq->lock); spin_lock(root_lock); qdisc->enqueue(skb, qdisc); spin_unlock(root_lock); } out_unlock: Loading