forked from mirrors/linux
		
	net: sched: extend proto ops with 'put' callback
Add optional tp->ops->put() API to be implemented for filter reference counting. This new function is called by cls API to release filter reference for filters returned by tp->ops->change() or tp->ops->get() functions. Implement tfilter_put() helper to call tp->ops->put() only for classifiers that implement it. Signed-off-by: Vlad Buslov <vladbu@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									ec6743a109
								
							
						
					
					
						commit
						7d5509fa0d
					
				
					 2 changed files with 12 additions and 1 deletions
				
			
		|  | @ -277,6 +277,7 @@ struct tcf_proto_ops { | |||
| 					   struct netlink_ext_ack *extack); | ||||
| 
 | ||||
| 	void*			(*get)(struct tcf_proto*, u32 handle); | ||||
| 	void			(*put)(struct tcf_proto *tp, void *f); | ||||
| 	int			(*change)(struct net *net, struct sk_buff *, | ||||
| 					struct tcf_proto*, unsigned long, | ||||
| 					u32 handle, struct nlattr **, | ||||
|  |  | |||
|  | @ -1870,6 +1870,12 @@ static void tfilter_notify_chain(struct net *net, struct sk_buff *oskb, | |||
| 			       q, parent, NULL, event, false); | ||||
| } | ||||
| 
 | ||||
| static void tfilter_put(struct tcf_proto *tp, void *fh) | ||||
| { | ||||
| 	if (tp->ops->put && fh) | ||||
| 		tp->ops->put(tp, fh); | ||||
| } | ||||
| 
 | ||||
| static int tc_new_tfilter(struct sk_buff *skb, struct nlmsghdr *n, | ||||
| 			  struct netlink_ext_ack *extack) | ||||
| { | ||||
|  | @ -2012,6 +2018,7 @@ static int tc_new_tfilter(struct sk_buff *skb, struct nlmsghdr *n, | |||
| 			goto errout; | ||||
| 		} | ||||
| 	} else if (n->nlmsg_flags & NLM_F_EXCL) { | ||||
| 		tfilter_put(tp, fh); | ||||
| 		NL_SET_ERR_MSG(extack, "Filter already exists"); | ||||
| 		err = -EEXIST; | ||||
| 		goto errout; | ||||
|  | @ -2026,9 +2033,11 @@ static int tc_new_tfilter(struct sk_buff *skb, struct nlmsghdr *n, | |||
| 	err = tp->ops->change(net, skb, tp, cl, t->tcm_handle, tca, &fh, | ||||
| 			      n->nlmsg_flags & NLM_F_CREATE ? TCA_ACT_NOREPLACE : TCA_ACT_REPLACE, | ||||
| 			      extack); | ||||
| 	if (err == 0) | ||||
| 	if (err == 0) { | ||||
| 		tfilter_notify(net, skb, n, tp, block, q, parent, fh, | ||||
| 			       RTM_NEWTFILTER, false); | ||||
| 		tfilter_put(tp, fh); | ||||
| 	} | ||||
| 
 | ||||
| errout: | ||||
| 	if (err && tp_created) | ||||
|  | @ -2259,6 +2268,7 @@ static int tc_get_tfilter(struct sk_buff *skb, struct nlmsghdr *n, | |||
| 			NL_SET_ERR_MSG(extack, "Failed to send filter notify message"); | ||||
| 	} | ||||
| 
 | ||||
| 	tfilter_put(tp, fh); | ||||
| errout: | ||||
| 	if (chain) { | ||||
| 		if (tp && !IS_ERR(tp)) | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Vlad Buslov
						Vlad Buslov