|
@@ -632,6 +632,19 @@ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
|
|
|
qdisc_skb_head_init(&sch->q);
|
|
|
spin_lock_init(&sch->q.lock);
|
|
|
|
|
|
+ if (ops->static_flags & TCQ_F_CPUSTATS) {
|
|
|
+ sch->cpu_bstats =
|
|
|
+ netdev_alloc_pcpu_stats(struct gnet_stats_basic_cpu);
|
|
|
+ if (!sch->cpu_bstats)
|
|
|
+ goto errout1;
|
|
|
+
|
|
|
+ sch->cpu_qstats = alloc_percpu(struct gnet_stats_queue);
|
|
|
+ if (!sch->cpu_qstats) {
|
|
|
+ free_percpu(sch->cpu_bstats);
|
|
|
+ goto errout1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
spin_lock_init(&sch->busylock);
|
|
|
lockdep_set_class(&sch->busylock,
|
|
|
dev->qdisc_tx_busylock ?: &qdisc_tx_busylock);
|
|
@@ -641,6 +654,7 @@ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
|
|
|
dev->qdisc_running_key ?: &qdisc_running_key);
|
|
|
|
|
|
sch->ops = ops;
|
|
|
+ sch->flags = ops->static_flags;
|
|
|
sch->enqueue = ops->enqueue;
|
|
|
sch->dequeue = ops->dequeue;
|
|
|
sch->dev_queue = dev_queue;
|
|
@@ -648,6 +662,8 @@ struct Qdisc *qdisc_alloc(struct netdev_queue *dev_queue,
|
|
|
refcount_set(&sch->refcnt, 1);
|
|
|
|
|
|
return sch;
|
|
|
+errout1:
|
|
|
+ kfree(p);
|
|
|
errout:
|
|
|
return ERR_PTR(err);
|
|
|
}
|