diff options
| -rw-r--r-- | net/sched/cls_tcindex.c | 33 | 
1 files changed, 26 insertions, 7 deletions
| diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c index beaa95e09c25..a76937ee0b2d 100644 --- a/net/sched/cls_tcindex.c +++ b/net/sched/cls_tcindex.c @@ -139,13 +139,19 @@ static int tcindex_init(struct tcf_proto *tp)  	return 0;  } +static void __tcindex_destroy_rexts(struct tcindex_filter_result *r) +{ +	tcf_exts_destroy(&r->exts); +	tcf_exts_put_net(&r->exts); +} +  static void tcindex_destroy_rexts_work(struct work_struct *work)  {  	struct tcindex_filter_result *r;  	r = container_of(work, struct tcindex_filter_result, work);  	rtnl_lock(); -	tcf_exts_destroy(&r->exts); +	__tcindex_destroy_rexts(r);  	rtnl_unlock();  } @@ -158,14 +164,20 @@ static void tcindex_destroy_rexts(struct rcu_head *head)  	tcf_queue_work(&r->work);  } +static void __tcindex_destroy_fexts(struct tcindex_filter *f) +{ +	tcf_exts_destroy(&f->result.exts); +	tcf_exts_put_net(&f->result.exts); +	kfree(f); +} +  static void tcindex_destroy_fexts_work(struct work_struct *work)  {  	struct tcindex_filter *f = container_of(work, struct tcindex_filter,  						work);  	rtnl_lock(); -	tcf_exts_destroy(&f->result.exts); -	kfree(f); +	__tcindex_destroy_fexts(f);  	rtnl_unlock();  } @@ -210,10 +222,17 @@ found:  	 * grace period, since converted-to-rcu actions are relying on that  	 * in cleanup() callback  	 */ -	if (f) -		call_rcu(&f->rcu, tcindex_destroy_fexts); -	else -		call_rcu(&r->rcu, tcindex_destroy_rexts); +	if (f) { +		if (tcf_exts_get_net(&f->result.exts)) +			call_rcu(&f->rcu, tcindex_destroy_fexts); +		else +			__tcindex_destroy_fexts(f); +	} else { +		if (tcf_exts_get_net(&r->exts)) +			call_rcu(&r->rcu, tcindex_destroy_rexts); +		else +			__tcindex_destroy_rexts(r); +	}  	*last = false;  	return 0; | 
