|
@@ -901,7 +901,7 @@ struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
|
|
|
if (!ops->init || ops->init(sch, NULL, extack) == 0)
|
|
|
return sch;
|
|
|
|
|
|
- qdisc_destroy(sch);
|
|
|
+ qdisc_put(sch);
|
|
|
return NULL;
|
|
|
}
|
|
|
EXPORT_SYMBOL(qdisc_create_dflt);
|
|
@@ -941,15 +941,11 @@ void qdisc_free(struct Qdisc *qdisc)
|
|
|
kfree((char *) qdisc - qdisc->padded);
|
|
|
}
|
|
|
|
|
|
-void qdisc_destroy(struct Qdisc *qdisc)
|
|
|
+static void qdisc_destroy(struct Qdisc *qdisc)
|
|
|
{
|
|
|
const struct Qdisc_ops *ops = qdisc->ops;
|
|
|
struct sk_buff *skb, *tmp;
|
|
|
|
|
|
- if (qdisc->flags & TCQ_F_BUILTIN ||
|
|
|
- !refcount_dec_and_test(&qdisc->refcnt))
|
|
|
- return;
|
|
|
-
|
|
|
#ifdef CONFIG_NET_SCHED
|
|
|
qdisc_hash_del(qdisc);
|
|
|
|
|
@@ -976,7 +972,16 @@ void qdisc_destroy(struct Qdisc *qdisc)
|
|
|
|
|
|
qdisc_free(qdisc);
|
|
|
}
|
|
|
-EXPORT_SYMBOL(qdisc_destroy);
|
|
|
+
|
|
|
+void qdisc_put(struct Qdisc *qdisc)
|
|
|
+{
|
|
|
+ if (qdisc->flags & TCQ_F_BUILTIN ||
|
|
|
+ !refcount_dec_and_test(&qdisc->refcnt))
|
|
|
+ return;
|
|
|
+
|
|
|
+ qdisc_destroy(qdisc);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(qdisc_put);
|
|
|
|
|
|
/* Attach toplevel qdisc to device queue. */
|
|
|
struct Qdisc *dev_graft_qdisc(struct netdev_queue *dev_queue,
|
|
@@ -1270,7 +1275,7 @@ static void shutdown_scheduler_queue(struct net_device *dev,
|
|
|
rcu_assign_pointer(dev_queue->qdisc, qdisc_default);
|
|
|
dev_queue->qdisc_sleeping = qdisc_default;
|
|
|
|
|
|
- qdisc_destroy(qdisc);
|
|
|
+ qdisc_put(qdisc);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1279,7 +1284,7 @@ void dev_shutdown(struct net_device *dev)
|
|
|
netdev_for_each_tx_queue(dev, shutdown_scheduler_queue, &noop_qdisc);
|
|
|
if (dev_ingress_queue(dev))
|
|
|
shutdown_scheduler_queue(dev, dev_ingress_queue(dev), &noop_qdisc);
|
|
|
- qdisc_destroy(dev->qdisc);
|
|
|
+ qdisc_put(dev->qdisc);
|
|
|
dev->qdisc = &noop_qdisc;
|
|
|
|
|
|
WARN_ON(timer_pending(&dev->watchdog_timer));
|