Skip to content

Commit

Permalink
net_sched: act: refactor cleanup ops
Browse files Browse the repository at this point in the history
For bindcnt and refcnt etc., they are common for all actions,
not need to repeat such operations for their own, they can be unified
now. Actions just need to do its specific cleanup if needed.

Cc: Jamal Hadi Salim <jhs@mojatatu.com>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
WANG Cong authored and David S. Miller committed Feb 13, 2014
1 parent 8606203 commit a5b5c95
Show file tree
Hide file tree
Showing 11 changed files with 22 additions and 64 deletions.
2 changes: 1 addition & 1 deletion include/net/act_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ struct tc_action_ops {
struct module *owner;
int (*act)(struct sk_buff *, const struct tc_action *, struct tcf_result *);
int (*dump)(struct sk_buff *, struct tc_action *, int, int);
int (*cleanup)(struct tc_action *, int bind);
void (*cleanup)(struct tc_action *, int bind);
int (*lookup)(struct tc_action *, u32);
int (*init)(struct net *net, struct nlattr *nla,
struct nlattr *est, struct tc_action *act, int ovr,
Expand Down
8 changes: 5 additions & 3 deletions net/sched/act_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ int tcf_hash_release(struct tc_action *a, int bind)

p->tcfc_refcnt--;
if (p->tcfc_bindcnt <= 0 && p->tcfc_refcnt <= 0) {
if (a->ops->cleanup)
a->ops->cleanup(a, bind);
tcf_hash_destroy(a);
ret = 1;
}
Expand Down Expand Up @@ -277,8 +279,8 @@ int tcf_register_action(struct tc_action_ops *act)
{
struct tc_action_ops *a;

/* Must supply act, dump, cleanup and init */
if (!act->act || !act->dump || !act->cleanup || !act->init)
/* Must supply act, dump and init */
if (!act->act || !act->dump || !act->init)
return -EINVAL;

/* Supply defaults */
Expand Down Expand Up @@ -390,7 +392,7 @@ void tcf_action_destroy(struct list_head *actions, int bind)
struct tc_action *a, *tmp;

list_for_each_entry_safe(a, tmp, actions, list) {
if (a->ops->cleanup(a, bind) == ACT_P_DELETED)
if (tcf_hash_release(a, bind) == ACT_P_DELETED)
module_put(a->ops->owner);
list_del(&a->list);
kfree(a);
Expand Down
1 change: 0 additions & 1 deletion net/sched/act_csum.c
Original file line number Diff line number Diff line change
Expand Up @@ -566,7 +566,6 @@ static struct tc_action_ops act_csum_ops = {
.owner = THIS_MODULE,
.act = tcf_csum,
.dump = tcf_csum_dump,
.cleanup = tcf_hash_release,
.init = tcf_csum_init,
};

Expand Down
1 change: 0 additions & 1 deletion net/sched/act_gact.c
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,6 @@ static struct tc_action_ops act_gact_ops = {
.owner = THIS_MODULE,
.act = tcf_gact,
.dump = tcf_gact_dump,
.cleanup = tcf_hash_release,
.init = tcf_gact_init,
};

Expand Down
21 changes: 5 additions & 16 deletions net/sched/act_ipt.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,23 +69,12 @@ static void ipt_destroy_target(struct xt_entry_target *t)
module_put(par.target->me);
}

static int tcf_ipt_release(struct tc_action *a, int bind)
static void tcf_ipt_release(struct tc_action *a, int bind)
{
struct tcf_ipt *ipt = to_ipt(a);
int ret = 0;
if (ipt) {
if (bind)
ipt->tcf_bindcnt--;
ipt->tcf_refcnt--;
if (ipt->tcf_bindcnt <= 0 && ipt->tcf_refcnt <= 0) {
ipt_destroy_target(ipt->tcfi_t);
kfree(ipt->tcfi_tname);
kfree(ipt->tcfi_t);
tcf_hash_destroy(a);
ret = ACT_P_DELETED;
}
}
return ret;
ipt_destroy_target(ipt->tcfi_t);
kfree(ipt->tcfi_tname);
kfree(ipt->tcfi_t);
}

static const struct nla_policy ipt_policy[TCA_IPT_MAX + 1] = {
Expand Down Expand Up @@ -133,7 +122,7 @@ static int tcf_ipt_init(struct net *net, struct nlattr *nla, struct nlattr *est,
} else {
if (bind)/* dont override defaults */
return 0;
tcf_ipt_release(a, bind);
tcf_hash_release(a, bind);

if (!ovr)
return -EEXIST;
Expand Down
20 changes: 5 additions & 15 deletions net/sched/act_mirred.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,22 +33,12 @@
static LIST_HEAD(mirred_list);
static struct tcf_hashinfo mirred_hash_info;

static int tcf_mirred_release(struct tc_action *a, int bind)
static void tcf_mirred_release(struct tc_action *a, int bind)
{
struct tcf_mirred *m = to_mirred(a);
if (m) {
if (bind)
m->tcf_bindcnt--;
m->tcf_refcnt--;
if (!m->tcf_bindcnt && m->tcf_refcnt <= 0) {
list_del(&m->tcfm_list);
if (m->tcfm_dev)
dev_put(m->tcfm_dev);
tcf_hash_destroy(a);
return 1;
}
}
return 0;
list_del(&m->tcfm_list);
if (m->tcfm_dev)
dev_put(m->tcfm_dev);
}

static const struct nla_policy mirred_policy[TCA_MIRRED_MAX + 1] = {
Expand Down Expand Up @@ -110,7 +100,7 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
ret = ACT_P_CREATED;
} else {
if (!ovr) {
tcf_mirred_release(a, bind);
tcf_hash_release(a, bind);
return -EEXIST;
}
}
Expand Down
1 change: 0 additions & 1 deletion net/sched/act_nat.c
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,6 @@ static struct tc_action_ops act_nat_ops = {
.owner = THIS_MODULE,
.act = tcf_nat,
.dump = tcf_nat_dump,
.cleanup = tcf_hash_release,
.init = tcf_nat_init,
};

Expand Down
13 changes: 3 additions & 10 deletions net/sched/act_pedit.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,18 +99,11 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla,
return ret;
}

static int tcf_pedit_cleanup(struct tc_action *a, int bind)
static void tcf_pedit_cleanup(struct tc_action *a, int bind)
{
struct tcf_pedit *p = a->priv;

if (p) {
struct tc_pedit_key *keys = p->tcfp_keys;
if (tcf_hash_release(a, bind)) {
kfree(keys);
return 1;
}
}
return 0;
struct tc_pedit_key *keys = p->tcfp_keys;
kfree(keys);
}

static int tcf_pedit(struct sk_buff *skb, const struct tc_action *a,
Expand Down
1 change: 0 additions & 1 deletion net/sched/act_police.c
Original file line number Diff line number Diff line change
Expand Up @@ -354,7 +354,6 @@ static struct tc_action_ops act_police_ops = {
.owner = THIS_MODULE,
.act = tcf_act_police,
.dump = tcf_act_police_dump,
.cleanup = tcf_hash_release,
.init = tcf_act_police_locate,
.walk = tcf_act_police_walker
};
Expand Down
17 changes: 3 additions & 14 deletions net/sched/act_simple.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,21 +47,10 @@ static int tcf_simp(struct sk_buff *skb, const struct tc_action *a,
return d->tcf_action;
}

static int tcf_simp_release(struct tc_action *a, int bind)
static void tcf_simp_release(struct tc_action *a, int bind)
{
struct tcf_defact *d = to_defact(a);
int ret = 0;
if (d) {
if (bind)
d->tcf_bindcnt--;
d->tcf_refcnt--;
if (d->tcf_bindcnt <= 0 && d->tcf_refcnt <= 0) {
kfree(d->tcfd_defdata);
tcf_hash_destroy(a);
ret = 1;
}
}
return ret;
kfree(d->tcfd_defdata);
}

static int alloc_defdata(struct tcf_defact *d, char *defdata)
Expand Down Expand Up @@ -132,7 +121,7 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla,

if (bind)
return 0;
tcf_simp_release(a, bind);
tcf_hash_release(a, bind);
if (!ovr)
return -EEXIST;

Expand Down
1 change: 0 additions & 1 deletion net/sched/act_skbedit.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,6 @@ static struct tc_action_ops act_skbedit_ops = {
.owner = THIS_MODULE,
.act = tcf_skbedit,
.dump = tcf_skbedit_dump,
.cleanup = tcf_hash_release,
.init = tcf_skbedit_init,
};

Expand Down

0 comments on commit a5b5c95

Please sign in to comment.