diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 7e078c593194..082db8abe703 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c @@ -545,20 +545,8 @@ EXPORT_SYMBOL(qdisc_reset); static void __qdisc_destroy(struct rcu_head *head) { struct Qdisc *qdisc = container_of(head, struct Qdisc, q_rcu); - kfree((char *) qdisc - qdisc->padded); -} - -/* Under queue->lock and BH! */ - -void qdisc_destroy(struct Qdisc *qdisc) -{ const struct Qdisc_ops *ops = qdisc->ops; - if (qdisc->flags & TCQ_F_BUILTIN || - !atomic_dec_and_test(&qdisc->refcnt)) - return; - - list_del(&qdisc->list); gen_kill_estimator(&qdisc->bstats, &qdisc->rate_est); if (ops->reset) ops->reset(qdisc); @@ -567,6 +555,20 @@ void qdisc_destroy(struct Qdisc *qdisc) module_put(ops->owner); dev_put(qdisc_dev(qdisc)); + + kfree((char *) qdisc - qdisc->padded); +} + +/* Under queue->lock and BH! */ + +void qdisc_destroy(struct Qdisc *qdisc) +{ + if (qdisc->flags & TCQ_F_BUILTIN || + !atomic_dec_and_test(&qdisc->refcnt)) + return; + + list_del(&qdisc->list); + call_rcu(&qdisc->q_rcu, __qdisc_destroy); } EXPORT_SYMBOL(qdisc_destroy);