diff options
author | David S. Miller <davem@davemloft.net> | 2008-07-16 04:42:40 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-17 22:21:19 -0400 |
commit | 7698b4fcabcd790efc4f226bada1e7b5870653af (patch) | |
tree | 031ce7a911fc5bff995421a5615d9ab25416a479 /net/sched/sch_api.c | |
parent | e2627c8c2241bce45e368e150654d076b58a4595 (diff) |
pkt_sched: Add and use qdisc_root() and qdisc_root_lock().
When code wants to lock the qdisc tree state, the logic
operation it's doing is locking the top-level qdisc that
sits of the root of the netdev_queue.
Add qdisc_root_lock() to represent this and convert the
easiest cases.
In order for this to work out in all cases, we have to
hook up the noop_qdisc to a dummy netdev_queue.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sched/sch_api.c')
-rw-r--r-- | net/sched/sch_api.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index 830ccc544a15..19c244a00839 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
@@ -633,7 +633,7 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue, | |||
633 | if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS])) == 0) { | 633 | if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS])) == 0) { |
634 | if (tca[TCA_RATE]) { | 634 | if (tca[TCA_RATE]) { |
635 | err = gen_new_estimator(&sch->bstats, &sch->rate_est, | 635 | err = gen_new_estimator(&sch->bstats, &sch->rate_est, |
636 | &sch->dev_queue->lock, | 636 | qdisc_root_lock(sch), |
637 | tca[TCA_RATE]); | 637 | tca[TCA_RATE]); |
638 | if (err) { | 638 | if (err) { |
639 | /* | 639 | /* |
@@ -675,7 +675,7 @@ static int qdisc_change(struct Qdisc *sch, struct nlattr **tca) | |||
675 | } | 675 | } |
676 | if (tca[TCA_RATE]) | 676 | if (tca[TCA_RATE]) |
677 | gen_replace_estimator(&sch->bstats, &sch->rate_est, | 677 | gen_replace_estimator(&sch->bstats, &sch->rate_est, |
678 | &sch->dev_queue->lock, tca[TCA_RATE]); | 678 | qdisc_root_lock(sch), tca[TCA_RATE]); |
679 | return 0; | 679 | return 0; |
680 | } | 680 | } |
681 | 681 | ||
@@ -967,7 +967,7 @@ static int tc_fill_qdisc(struct sk_buff *skb, struct Qdisc *q, u32 clid, | |||
967 | q->qstats.qlen = q->q.qlen; | 967 | q->qstats.qlen = q->q.qlen; |
968 | 968 | ||
969 | if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, | 969 | if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, |
970 | TCA_XSTATS, &q->dev_queue->lock, &d) < 0) | 970 | TCA_XSTATS, qdisc_root_lock(q), &d) < 0) |
971 | goto nla_put_failure; | 971 | goto nla_put_failure; |
972 | 972 | ||
973 | if (q->ops->dump_stats && q->ops->dump_stats(q, &d) < 0) | 973 | if (q->ops->dump_stats && q->ops->dump_stats(q, &d) < 0) |
@@ -1216,7 +1216,7 @@ static int tc_fill_tclass(struct sk_buff *skb, struct Qdisc *q, | |||
1216 | goto nla_put_failure; | 1216 | goto nla_put_failure; |
1217 | 1217 | ||
1218 | if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, | 1218 | if (gnet_stats_start_copy_compat(skb, TCA_STATS2, TCA_STATS, |
1219 | TCA_XSTATS, &q->dev_queue->lock, &d) < 0) | 1219 | TCA_XSTATS, qdisc_root_lock(q), &d) < 0) |
1220 | goto nla_put_failure; | 1220 | goto nla_put_failure; |
1221 | 1221 | ||
1222 | if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0) | 1222 | if (cl_ops->dump_stats && cl_ops->dump_stats(q, cl, &d) < 0) |