On 07/30/2015 02:33 AM, Cong Wang wrote: ...
diff --git a/net/sched/act_api.c b/net/sched/act_api.c index af427a3..bd63a39 100644 --- a/net/sched/act_api.c +++ b/net/sched/act_api.c @@ -53,8 +53,11 @@ int tcf_hash_release(struct tc_action *a, int bind) if (p) { if (bind) p->tcfc_bindcnt--; - else if (p->tcfc_bindcnt > 0) - return -EPERM; + else { + if (p->tcfc_bindcnt > 0) + return -EPERM; + return ret; + }
Hm, so this seems not correct: if we only ever increase tcfc_refcnt when there's bind=1, and only ever decrease when bind=1, then we will never free the action as we do start out from ref=1 in case it has been added without initial binding, if I see this correctly.
p->tcfc_refcnt--; if (p->tcfc_bindcnt <= 0 && p->tcfc_refcnt <= 0) { @@ -214,9 +217,10 @@ int tcf_hash_check(u32 index, struct tc_action *a, int bind) struct tcf_hashinfo *hinfo = a->ops->hinfo; struct tcf_common *p = NULL; if (index && (p = tcf_hash_lookup(index, hinfo)) != NULL) { - if (bind) + if (bind) { p->tcfc_bindcnt++; - p->tcfc_refcnt++; + p->tcfc_refcnt++; + } a->priv = p; return 1; } diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c index a42a3b2..2685450 100644 --- a/net/sched/act_mirred.c +++ b/net/sched/act_mirred.c @@ -98,6 +98,8 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla, return ret; ret = ACT_P_CREATED; } else { + if (bind) + return 0; if (!ovr) { tcf_hash_release(a, bind); return -EEXIST;
-- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html