diff options
Diffstat (limited to 'net/sched/act_csum.c')
| -rw-r--r-- | net/sched/act_csum.c | 45 | 
1 files changed, 11 insertions, 34 deletions
diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c index 3a4c0caa1f7..edbf40dac70 100644 --- a/net/sched/act_csum.c +++ b/net/sched/act_csum.c @@ -37,15 +37,6 @@  #include <net/tc_act/tc_csum.h>  #define CSUM_TAB_MASK 15 -static struct tcf_common *tcf_csum_ht[CSUM_TAB_MASK + 1]; -static u32 csum_idx_gen; -static DEFINE_RWLOCK(csum_lock); - -static struct tcf_hashinfo csum_hash_info = { -	.htab	= tcf_csum_ht, -	.hmask	= CSUM_TAB_MASK, -	.lock	= &csum_lock, -};  static const struct nla_policy csum_policy[TCA_CSUM_MAX + 1] = {  	[TCA_CSUM_PARMS] = { .len = sizeof(struct tc_csum), }, @@ -56,7 +47,6 @@ static int tcf_csum_init(struct net *n, struct nlattr *nla, struct nlattr *est,  {  	struct nlattr *tb[TCA_CSUM_MAX + 1];  	struct tc_csum *parm; -	struct tcf_common *pc;  	struct tcf_csum *p;  	int ret = 0, err; @@ -71,39 +61,31 @@ static int tcf_csum_init(struct net *n, struct nlattr *nla, struct nlattr *est,  		return -EINVAL;  	parm = nla_data(tb[TCA_CSUM_PARMS]); -	pc = tcf_hash_check(parm->index, a, bind, &csum_hash_info); -	if (!pc) { -		pc = tcf_hash_create(parm->index, est, a, sizeof(*p), bind, -				     &csum_idx_gen, &csum_hash_info); -		if (IS_ERR(pc)) -			return PTR_ERR(pc); -		p = to_tcf_csum(pc); +	if (!tcf_hash_check(parm->index, a, bind)) { +		ret = tcf_hash_create(parm->index, est, a, sizeof(*p), bind); +		if (ret) +			return ret;  		ret = ACT_P_CREATED;  	} else { -		p = to_tcf_csum(pc); -		if (!ovr) { -			tcf_hash_release(pc, bind, &csum_hash_info); +		if (bind)/* dont override defaults */ +			return 0; +		tcf_hash_release(a, bind); +		if (!ovr)  			return -EEXIST; -		}  	} +	p = to_tcf_csum(a);  	spin_lock_bh(&p->tcf_lock);  	p->tcf_action = parm->action;  	p->update_flags = parm->update_flags;  	spin_unlock_bh(&p->tcf_lock);  	if (ret == ACT_P_CREATED) -		tcf_hash_insert(pc, &csum_hash_info); +		tcf_hash_insert(a);  	return ret;  } -static int tcf_csum_cleanup(struct tc_action *a, int bind) -{ -	struct tcf_csum *p = a->priv; -	return tcf_hash_release(&p->common, bind, &csum_hash_info); -} -  /**   * tcf_csum_skb_nextlayer - Get next layer pointer   * @skb: sk_buff to use @@ -578,16 +560,11 @@ nla_put_failure:  static struct tc_action_ops act_csum_ops = {  	.kind		= "csum", -	.hinfo		= &csum_hash_info,  	.type		= TCA_ACT_CSUM, -	.capab		= TCA_CAP_NONE,  	.owner		= THIS_MODULE,  	.act		= tcf_csum,  	.dump		= tcf_csum_dump, -	.cleanup	= tcf_csum_cleanup, -	.lookup		= tcf_hash_search,  	.init		= tcf_csum_init, -	.walk		= tcf_generic_walker  };  MODULE_DESCRIPTION("Checksum updating actions"); @@ -595,7 +572,7 @@ MODULE_LICENSE("GPL");  static int __init csum_init_module(void)  { -	return tcf_register_action(&act_csum_ops); +	return tcf_register_action(&act_csum_ops, CSUM_TAB_MASK);  }  static void __exit csum_cleanup_module(void)  | 
