|
@@ -1060,54 +1060,60 @@ static struct Qdisc *qdisc_create(struct net_device *dev,
|
|
netdev_info(dev, "Caught tx_queue_len zero misconfig\n");
|
|
netdev_info(dev, "Caught tx_queue_len zero misconfig\n");
|
|
}
|
|
}
|
|
|
|
|
|
- if (!ops->init || (err = ops->init(sch, tca[TCA_OPTIONS])) == 0) {
|
|
|
|
- if (qdisc_is_percpu_stats(sch)) {
|
|
|
|
- sch->cpu_bstats =
|
|
|
|
- netdev_alloc_pcpu_stats(struct gnet_stats_basic_cpu);
|
|
|
|
- if (!sch->cpu_bstats)
|
|
|
|
- goto err_out4;
|
|
|
|
-
|
|
|
|
- sch->cpu_qstats = alloc_percpu(struct gnet_stats_queue);
|
|
|
|
- if (!sch->cpu_qstats)
|
|
|
|
- goto err_out4;
|
|
|
|
- }
|
|
|
|
|
|
+ if (ops->init) {
|
|
|
|
+ err = ops->init(sch, tca[TCA_OPTIONS]);
|
|
|
|
+ if (err != 0)
|
|
|
|
+ goto err_out5;
|
|
|
|
+ }
|
|
|
|
|
|
- if (tca[TCA_STAB]) {
|
|
|
|
- stab = qdisc_get_stab(tca[TCA_STAB]);
|
|
|
|
- if (IS_ERR(stab)) {
|
|
|
|
- err = PTR_ERR(stab);
|
|
|
|
- goto err_out4;
|
|
|
|
- }
|
|
|
|
- rcu_assign_pointer(sch->stab, stab);
|
|
|
|
- }
|
|
|
|
- if (tca[TCA_RATE]) {
|
|
|
|
- seqcount_t *running;
|
|
|
|
|
|
+ if (qdisc_is_percpu_stats(sch)) {
|
|
|
|
+ sch->cpu_bstats =
|
|
|
|
+ netdev_alloc_pcpu_stats(struct gnet_stats_basic_cpu);
|
|
|
|
+ if (!sch->cpu_bstats)
|
|
|
|
+ goto err_out4;
|
|
|
|
|
|
- err = -EOPNOTSUPP;
|
|
|
|
- if (sch->flags & TCQ_F_MQROOT)
|
|
|
|
- goto err_out4;
|
|
|
|
|
|
+ sch->cpu_qstats = alloc_percpu(struct gnet_stats_queue);
|
|
|
|
+ if (!sch->cpu_qstats)
|
|
|
|
+ goto err_out4;
|
|
|
|
+ }
|
|
|
|
|
|
- if (sch->parent != TC_H_ROOT &&
|
|
|
|
- !(sch->flags & TCQ_F_INGRESS) &&
|
|
|
|
- (!p || !(p->flags & TCQ_F_MQROOT)))
|
|
|
|
- running = qdisc_root_sleeping_running(sch);
|
|
|
|
- else
|
|
|
|
- running = &sch->running;
|
|
|
|
-
|
|
|
|
- err = gen_new_estimator(&sch->bstats,
|
|
|
|
- sch->cpu_bstats,
|
|
|
|
- &sch->rate_est,
|
|
|
|
- NULL,
|
|
|
|
- running,
|
|
|
|
- tca[TCA_RATE]);
|
|
|
|
- if (err)
|
|
|
|
- goto err_out4;
|
|
|
|
|
|
+ if (tca[TCA_STAB]) {
|
|
|
|
+ stab = qdisc_get_stab(tca[TCA_STAB]);
|
|
|
|
+ if (IS_ERR(stab)) {
|
|
|
|
+ err = PTR_ERR(stab);
|
|
|
|
+ goto err_out4;
|
|
}
|
|
}
|
|
|
|
+ rcu_assign_pointer(sch->stab, stab);
|
|
|
|
+ }
|
|
|
|
+ if (tca[TCA_RATE]) {
|
|
|
|
+ seqcount_t *running;
|
|
|
|
|
|
- qdisc_hash_add(sch, false);
|
|
|
|
|
|
+ err = -EOPNOTSUPP;
|
|
|
|
+ if (sch->flags & TCQ_F_MQROOT)
|
|
|
|
+ goto err_out4;
|
|
|
|
|
|
- return sch;
|
|
|
|
|
|
+ if (sch->parent != TC_H_ROOT &&
|
|
|
|
+ !(sch->flags & TCQ_F_INGRESS) &&
|
|
|
|
+ (!p || !(p->flags & TCQ_F_MQROOT)))
|
|
|
|
+ running = qdisc_root_sleeping_running(sch);
|
|
|
|
+ else
|
|
|
|
+ running = &sch->running;
|
|
|
|
+
|
|
|
|
+ err = gen_new_estimator(&sch->bstats,
|
|
|
|
+ sch->cpu_bstats,
|
|
|
|
+ &sch->rate_est,
|
|
|
|
+ NULL,
|
|
|
|
+ running,
|
|
|
|
+ tca[TCA_RATE]);
|
|
|
|
+ if (err)
|
|
|
|
+ goto err_out4;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ qdisc_hash_add(sch, false);
|
|
|
|
+
|
|
|
|
+ return sch;
|
|
|
|
+
|
|
|
|
+err_out5:
|
|
/* ops->init() failed, we call ->destroy() like qdisc_create_dflt() */
|
|
/* ops->init() failed, we call ->destroy() like qdisc_create_dflt() */
|
|
if (ops->destroy)
|
|
if (ops->destroy)
|
|
ops->destroy(sch);
|
|
ops->destroy(sch);
|