From: Jarek Poplawski <jarkao2@gmail.com>
To: Herbert Xu <herbert@gondor.apana.org.au>
Cc: David Miller <davem@davemloft.net>,
netdev@vger.kernel.org, denys@visp.net.lb
Subject: [PATCH] pkt_sched: Fix qdisc list locking
Date: Fri, 22 Aug 2008 08:41:50 +0000 [thread overview]
Message-ID: <20080822084150.GA2645@ff.dom.local> (raw)
In-Reply-To: <20080821222446.GF14521@gondor.apana.org.au>
On Fri, Aug 22, 2008 at 08:24:47AM +1000, Herbert Xu wrote:
...
> Feel free to fix this up into a real patch with a new lock.
It looks like adding to the list needs similar protection, but if I
exagerated here let me know.
Thanks,
Jarek P.
--------------->
pkt_sched: Fix qdisc list locking
Since some qdiscs call qdisc_tree_decrease_qlen() (so qdisc_lookup())
without rtnl_lock(), adding and deleting from a qdisc list needs
additional locking. This patch adds global spinlock qdisc_list_lock
and wrapper functions for modifying the list. It is considered as a
temporary solution until hfsc_dequeue(), netem_dequeue() and
tbf_dequeue() (or qdisc_tree_decrease_qlen()) are redone.
With feedback from Herbert Xu and David S. Miller.
Signed-off-by: Jarek Poplawski <jarkao2@gmail.com>
---
include/net/pkt_sched.h | 1 +
net/sched/sch_api.c | 44 +++++++++++++++++++++++++++++++++++++++-----
net/sched/sch_generic.c | 5 ++---
3 files changed, 42 insertions(+), 8 deletions(-)
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h
index 853fe83..b786a5b 100644
--- a/include/net/pkt_sched.h
+++ b/include/net/pkt_sched.h
@@ -78,6 +78,7 @@ extern struct Qdisc *fifo_create_dflt(struct Qdisc *sch, struct Qdisc_ops *ops,
extern int register_qdisc(struct Qdisc_ops *qops);
extern int unregister_qdisc(struct Qdisc_ops *qops);
+extern void qdisc_list_del(struct Qdisc *q);
extern struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle);
extern struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle);
extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r,
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
index 45f442d..e35b8d8 100644
--- a/net/sched/sch_api.c
+++ b/net/sched/sch_api.c
@@ -199,19 +199,53 @@ struct Qdisc *qdisc_match_from_root(struct Qdisc *root, u32 handle)
return NULL;
}
+/*
+ * This lock is needed until some qdiscs stop calling qdisc_tree_decrease_qlen()
+ * without rtnl_lock(); currently hfsc_dequeue(), netem_dequeue(), tbf_dequeue()
+ */
+static DEFINE_SPINLOCK(qdisc_lookup_lock);
+
+static void qdisc_list_add(struct Qdisc *q)
+{
+ if ((q->parent != TC_H_ROOT) && !(q->flags & TCQ_F_INGRESS)) {
+ spin_lock_bh(&qdisc_lookup_lock);
+ list_add_tail(&q->list, &qdisc_root_sleeping(q)->list);
+ spin_unlock_bh(&qdisc_lookup_lock);
+ }
+}
+
+void qdisc_list_del(struct Qdisc *q)
+{
+ if ((q->parent != TC_H_ROOT) && !(q->flags & TCQ_F_INGRESS)) {
+ spin_lock_bh(&qdisc_lookup_lock);
+ list_del(&q->list);
+ spin_unlock_bh(&qdisc_lookup_lock);
+ }
+}
+EXPORT_SYMBOL(qdisc_list_del);
+
struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle)
{
unsigned int i;
+ struct Qdisc *q;
+
+ spin_lock_bh(&qdisc_lookup_lock);
for (i = 0; i < dev->num_tx_queues; i++) {
struct netdev_queue *txq = netdev_get_tx_queue(dev, i);
- struct Qdisc *q, *txq_root = txq->qdisc_sleeping;
+ struct Qdisc *txq_root = txq->qdisc_sleeping;
q = qdisc_match_from_root(txq_root, handle);
if (q)
- return q;
+ goto unlock;
}
- return qdisc_match_from_root(dev->rx_queue.qdisc_sleeping, handle);
+
+ q = qdisc_match_from_root(dev->rx_queue.qdisc_sleeping, handle);
+
+unlock:
+ spin_unlock_bh(&qdisc_lookup_lock);
+
+ return q;
}
static struct Qdisc *qdisc_leaf(struct Qdisc *p, u32 classid)
@@ -810,8 +844,8 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue,
goto err_out3;
}
}
- if ((parent != TC_H_ROOT) && !(sch->flags & TCQ_F_INGRESS))
- list_add_tail(&sch->list, &dev_queue->qdisc_sleeping->list);
+
+ qdisc_list_add(sch);
return sch;
}
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index c3ed4d4..5f0ade7 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -526,10 +526,9 @@ void qdisc_destroy(struct Qdisc *qdisc)
!atomic_dec_and_test(&qdisc->refcnt))
return;
- if (qdisc->parent)
- list_del(&qdisc->list);
-
#ifdef CONFIG_NET_SCHED
+ qdisc_list_del(qdisc);
+
qdisc_put_stab(qdisc->stab);
#endif
gen_kill_estimator(&qdisc->bstats, &qdisc->rate_est);
next prev parent reply other threads:[~2008-08-22 8:42 UTC|newest]
Thread overview: 209+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-11 20:53 [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock() Jarek Poplawski
2008-08-12 1:12 ` David Miller
2008-08-12 5:20 ` Jarek Poplawski
2008-08-12 5:40 ` David Miller
2008-08-12 7:00 ` Jarek Poplawski
2008-08-12 8:15 ` David Miller
2008-08-12 10:38 ` Jarek Poplawski
2008-08-13 4:30 ` Herbert Xu
2008-08-13 5:11 ` David Miller
2008-08-13 5:31 ` Herbert Xu
2008-08-13 9:30 ` David Miller
2008-08-13 6:13 ` Jarek Poplawski
2008-08-13 6:16 ` David Miller
2008-08-13 6:53 ` Jarek Poplawski
2008-08-13 7:31 ` Jarek Poplawski
2008-08-13 9:25 ` David Miller
2008-08-13 9:58 ` Herbert Xu
2008-08-13 10:27 ` Jarek Poplawski
2008-08-13 10:42 ` Jarek Poplawski
2008-08-13 10:42 ` Herbert Xu
2008-08-13 10:50 ` Jarek Poplawski
2008-08-13 22:19 ` David Miller
2008-08-14 7:59 ` Jarek Poplawski
2008-08-14 8:16 ` Herbert Xu
2008-08-14 8:31 ` Jarek Poplawski
2008-08-14 8:33 ` Herbert Xu
2008-08-14 8:44 ` Jarek Poplawski
2008-08-14 8:52 ` Jarek Poplawski
2008-08-17 22:57 ` David Miller
2008-08-17 23:03 ` David Miller
2008-08-18 1:25 ` Herbert Xu
2008-08-18 1:35 ` David Miller
2008-08-18 1:36 ` Herbert Xu
2008-08-18 1:49 ` David Miller
2008-08-18 4:27 ` Herbert Xu
2008-08-18 4:31 ` David Miller
2008-08-18 4:36 ` Herbert Xu
2008-08-18 5:13 ` David Miller
2008-08-18 6:08 ` Denys Fedoryshchenko
2008-08-18 6:13 ` David Miller
2008-08-18 6:27 ` Jarek Poplawski
2008-08-18 6:38 ` David Miller
2008-08-18 21:29 ` Jarek Poplawski
2008-08-18 23:47 ` David Miller
2008-08-19 10:31 ` Jarek Poplawski
2008-08-19 10:51 ` Herbert Xu
2008-08-19 10:54 ` David Miller
2008-08-19 10:55 ` Herbert Xu
2008-08-19 10:58 ` Herbert Xu
2008-08-19 11:02 ` David Miller
2008-08-19 11:11 ` Herbert Xu
2008-08-19 16:48 ` Jarek Poplawski
2008-08-19 22:23 ` Herbert Xu
2008-08-20 11:56 ` [PATCH] pkt_sched: Fix qdisc_watchdog() vs. dev_deactivate() race Jarek Poplawski
2008-08-20 12:16 ` Herbert Xu
2008-08-21 5:17 ` Jarek Poplawski
2008-08-21 5:49 ` [PATCH take 2] " Jarek Poplawski
2008-08-21 6:10 ` Herbert Xu
2008-08-21 6:49 ` Jarek Poplawski
2008-08-21 7:16 ` Herbert Xu
2008-08-21 7:52 ` David Miller
2008-08-21 8:00 ` Herbert Xu
2008-08-21 8:27 ` Jarek Poplawski
2008-08-21 8:35 ` Jarek Poplawski
2008-08-21 8:47 ` Jarek Poplawski
2008-09-11 10:39 ` David Miller
2008-09-11 10:45 ` Herbert Xu
2008-09-11 10:49 ` David Miller
2008-09-11 11:00 ` Herbert Xu
2008-09-11 11:42 ` David Miller
2008-09-11 11:45 ` Herbert Xu
2008-09-11 11:47 ` David Miller
2008-09-12 4:49 ` David Miller
2008-09-12 8:02 ` Jarek Poplawski
2008-09-12 23:10 ` David Miller
2008-09-13 1:10 ` Herbert Xu
2008-09-13 1:22 ` David Miller
2008-09-13 1:27 ` Herbert Xu
2008-09-13 1:40 ` David Miller
2008-09-13 1:48 ` Herbert Xu
2008-09-13 20:54 ` Jarek Poplawski
2008-09-14 6:16 ` Herbert Xu
2008-09-14 10:31 ` Alexander Duyck
2008-09-14 21:43 ` Jarek Poplawski
2008-09-14 22:13 ` Herbert Xu
2008-09-15 6:07 ` Jarek Poplawski
2008-09-15 6:19 ` Herbert Xu
2008-09-15 7:20 ` Jarek Poplawski
2008-09-15 7:45 ` Jarek Poplawski
2008-09-15 23:44 ` Duyck, Alexander H
2008-09-16 10:47 ` Jarek Poplawski
2008-09-17 2:31 ` Alexander Duyck
2008-09-14 11:56 ` jamal
2008-09-14 20:27 ` Jarek Poplawski
2008-09-20 7:21 ` David Miller
2008-09-20 7:25 ` Herbert Xu
2008-09-20 7:28 ` David Miller
2008-09-20 23:48 ` Jarek Poplawski
2008-09-21 5:35 ` David Miller
2008-09-21 5:50 ` David Miller
2008-09-21 6:38 ` Herbert Xu
2008-09-21 7:03 ` David Miller
2008-09-23 6:23 ` Herbert Xu
2008-09-24 7:15 ` Jarek Poplawski
2008-09-24 8:04 ` Herbert Xu
2008-09-24 8:28 ` Jarek Poplawski
2008-09-21 15:25 ` Jarek Poplawski
2008-09-21 9:57 ` Jarek Poplawski
2008-09-21 10:18 ` David Miller
2008-09-21 11:15 ` Jarek Poplawski
2008-09-23 5:16 ` David Miller
2008-09-23 8:02 ` Jarek Poplawski
2008-09-23 8:06 ` David Miller
2008-09-11 11:51 ` Jarek Poplawski
2008-09-11 11:54 ` Herbert Xu
2008-09-11 12:10 ` Jarek Poplawski
2008-09-11 12:34 ` Jarek Poplawski
2008-08-21 12:11 ` David Miller
2008-08-14 8:17 ` [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock() Jarek Poplawski
2008-08-14 11:24 ` Jarek Poplawski
2008-08-17 13:42 ` Jarek Poplawski
2008-08-17 21:34 ` David Miller
2008-08-17 22:22 ` Jarek Poplawski
2008-08-17 22:32 ` David Miller
2008-08-18 20:12 ` Jarek Poplawski
2008-08-18 23:54 ` David Miller
2008-08-19 0:05 ` Herbert Xu
2008-08-19 0:11 ` David Miller
2008-08-19 4:07 ` David Miller
2008-08-19 5:27 ` Ilpo Järvinen
2008-08-19 5:30 ` David Miller
2008-08-19 6:46 ` Jarek Poplawski
2008-08-19 7:03 ` David Miller
2008-08-19 7:23 ` Jarek Poplawski
2008-08-19 7:23 ` Herbert Xu
2008-08-19 7:35 ` Jarek Poplawski
2008-08-19 7:46 ` Herbert Xu
2008-08-19 7:56 ` Jarek Poplawski
2008-08-19 8:05 ` Herbert Xu
2008-08-19 8:17 ` Jarek Poplawski
2008-08-19 8:23 ` Herbert Xu
2008-08-19 8:32 ` David Miller
2008-08-19 8:41 ` Jarek Poplawski
2008-08-19 8:48 ` David Miller
2008-08-19 8:50 ` Herbert Xu
2008-08-19 8:39 ` Jarek Poplawski
2008-08-19 8:55 ` Herbert Xu
2008-08-19 9:16 ` Jarek Poplawski
2008-08-21 10:01 ` Jarek Poplawski
2008-08-21 10:05 ` David Miller
2008-08-21 10:11 ` Jarek Poplawski
2008-08-21 10:18 ` Jarek Poplawski
2008-08-21 10:21 ` Herbert Xu
2008-08-21 10:23 ` Herbert Xu
2008-08-21 10:33 ` Jarek Poplawski
2008-08-21 10:51 ` Herbert Xu
2008-08-21 11:20 ` Jarek Poplawski
2008-08-21 11:26 ` Herbert Xu
2008-08-21 11:55 ` Jarek Poplawski
2008-08-21 12:01 ` Herbert Xu
2008-08-21 12:19 ` Jarek Poplawski
2008-08-21 12:22 ` Herbert Xu
2008-08-21 12:27 ` David Miller
2008-08-21 12:35 ` Herbert Xu
2008-08-21 12:48 ` Herbert Xu
2008-08-21 12:55 ` Jarek Poplawski
2008-08-21 13:12 ` Herbert Xu
2008-08-21 18:58 ` Jarek Poplawski
2008-08-21 21:14 ` Jarek Poplawski
2008-08-21 22:23 ` Herbert Xu
2008-08-22 8:49 ` Jarek Poplawski
2008-08-22 8:55 ` David Miller
2008-08-22 10:07 ` Herbert Xu
2008-08-22 10:27 ` David Miller
2008-08-22 11:02 ` Herbert Xu
2008-08-22 11:38 ` Jarek Poplawski
2008-08-22 11:42 ` David Miller
2008-08-22 12:09 ` Jarek Poplawski
2008-08-22 12:11 ` Herbert Xu
2008-08-22 12:18 ` David Miller
2008-08-22 12:45 ` Herbert Xu
2008-08-24 23:26 ` Stephen Hemminger
2008-08-24 23:49 ` Herbert Xu
2008-08-25 0:29 ` Stephen Hemminger
2008-08-26 7:35 ` Herbert Xu
2008-08-26 7:47 ` Herbert Xu
2008-08-26 12:24 ` Stephen Hemminger
2008-08-26 12:41 ` Herbert Xu
2008-08-26 12:50 ` Stephen Hemminger
2008-08-26 12:56 ` Herbert Xu
2008-08-27 12:17 ` Bastian Bloessl
2008-08-27 9:32 ` David Miller
2008-08-27 9:56 ` Herbert Xu
2008-08-22 12:25 ` Jarek Poplawski
2008-08-23 12:15 ` David Miller
2008-08-21 20:40 ` Jarek Poplawski
2008-08-21 22:24 ` Herbert Xu
2008-08-22 8:41 ` Jarek Poplawski [this message]
2008-08-22 10:14 ` [PATCH] pkt_sched: Fix qdisc list locking Herbert Xu
2008-08-22 9:27 ` [PATCH take 2] " Jarek Poplawski
2008-08-22 10:15 ` Herbert Xu
2008-08-22 10:28 ` David Miller
2008-08-22 10:23 ` David Miller
2008-08-21 12:49 ` [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock() Jarek Poplawski
2008-08-21 12:51 ` Herbert Xu
2008-08-21 12:06 ` David Miller
2008-08-21 10:18 ` Herbert Xu
2008-08-12 22:02 ` [PATCH take 2] pkt_sched: Protect gen estimators under est_lock Jarek Poplawski
2008-08-13 22:20 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080822084150.GA2645@ff.dom.local \
--to=jarkao2@gmail.com \
--cc=davem@davemloft.net \
--cc=denys@visp.net.lb \
--cc=herbert@gondor.apana.org.au \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).