From 1592378898149b7774c873f28855059c0ff04b2a Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Thu, 17 Jul 2008 00:47:45 -0700 Subject: [PATCH] --- yaml --- r: 103601 b: refs/heads/master c: 8a34c5dc3a7c6431f1cd94c0904be81b296e08ca h: refs/heads/master i: 103599: 2d2c648b16750a044ef38a669613b301ec0da857 v: v3 --- [refs] | 2 +- trunk/net/sched/sch_generic.c | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index f07abeb3d8da..54a3786d066e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 16361127ebed0fb8f9d7cc94c6e137eaf710f676 +refs/heads/master: 8a34c5dc3a7c6431f1cd94c0904be81b296e08ca diff --git a/trunk/net/sched/sch_generic.c b/trunk/net/sched/sch_generic.c index 7e078c593194..082db8abe703 100644 --- a/trunk/net/sched/sch_generic.c +++ b/trunk/net/sched/sch_generic.c @@ -545,6 +545,17 @@ EXPORT_SYMBOL(qdisc_reset); static void __qdisc_destroy(struct rcu_head *head) { struct Qdisc *qdisc = container_of(head, struct Qdisc, q_rcu); + const struct Qdisc_ops *ops = qdisc->ops; + + gen_kill_estimator(&qdisc->bstats, &qdisc->rate_est); + if (ops->reset) + ops->reset(qdisc); + if (ops->destroy) + ops->destroy(qdisc); + + module_put(ops->owner); + dev_put(qdisc_dev(qdisc)); + kfree((char *) qdisc - qdisc->padded); } @@ -552,21 +563,12 @@ static void __qdisc_destroy(struct rcu_head *head) 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); - if (ops->destroy) - ops->destroy(qdisc); - module_put(ops->owner); - dev_put(qdisc_dev(qdisc)); call_rcu(&qdisc->q_rcu, __qdisc_destroy); } EXPORT_SYMBOL(qdisc_destroy);