|
@@ -830,9 +830,16 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue,
|
|
sch->stab = stab;
|
|
sch->stab = stab;
|
|
}
|
|
}
|
|
if (tca[TCA_RATE]) {
|
|
if (tca[TCA_RATE]) {
|
|
|
|
+ spinlock_t *root_lock;
|
|
|
|
+
|
|
|
|
+ if ((sch->parent != TC_H_ROOT) &&
|
|
|
|
+ !(sch->flags & TCQ_F_INGRESS))
|
|
|
|
+ root_lock = qdisc_root_sleeping_lock(sch);
|
|
|
|
+ else
|
|
|
|
+ root_lock = qdisc_lock(sch);
|
|
|
|
+
|
|
err = gen_new_estimator(&sch->bstats, &sch->rate_est,
|
|
err = gen_new_estimator(&sch->bstats, &sch->rate_est,
|
|
- qdisc_root_lock(sch),
|
|
|
|
- tca[TCA_RATE]);
|
|
|
|
|
|
+ root_lock, tca[TCA_RATE]);
|
|
if (err) {
|
|
if (err) {
|
|
/*
|
|
/*
|
|
* Any broken qdiscs that would require
|
|
* Any broken qdiscs that would require
|
|
@@ -884,7 +891,8 @@ static int qdisc_change(struct Qdisc *sch, struct nlattr **tca)
|
|
|
|
|
|
if (tca[TCA_RATE])
|
|
if (tca[TCA_RATE])
|
|
gen_replace_estimator(&sch->bstats, &sch->rate_est,
|
|
gen_replace_estimator(&sch->bstats, &sch->rate_est,
|
|
- qdisc_root_lock(sch), tca[TCA_RATE]);
|
|
|
|
|
|
+ qdisc_root_sleeping_lock(sch),
|
|
|
|
+ tca[TCA_RATE]);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|