Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 83874000 authored by David S. Miller's avatar David S. Miller
Browse files

pkt_sched: Kill netdev_queue lock.



We can simply use the qdisc->q.lock for all of the
qdisc tree synchronization.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c7e4f3bb
Loading
Loading
Loading
Loading
+0 −20
Original line number Diff line number Diff line
@@ -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)

@@ -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;
@@ -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:
+0 −1
Original line number Diff line number Diff line
@@ -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;
+6 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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)
+5 −4
Original line number Diff line number Diff line
@@ -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;
}
@@ -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;
}

+12 −7
Original line number Diff line number Diff line
@@ -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);
	}
}

@@ -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;

@@ -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);
@@ -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