mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	net/sched: use the hardware intermediate representation for matchall
Extends matchall offload to make use of the hardware intermediate representation. More specifically, this patch moves the native TC actions in cls_matchall offload to the newer flow_action representation. This ultimately allows us to avoid a direct dependency on native TC actions for matchall. Signed-off-by: Pieter Jansen van Vuuren <pieter.jansenvanvuuren@netronome.com> Reviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									a7a7be6087
								
							
						
					
					
						commit
						f00cbf1968
					
				
					 2 changed files with 34 additions and 0 deletions
				
			
		| 
						 | 
					@ -789,6 +789,7 @@ enum tc_matchall_command {
 | 
				
			||||||
struct tc_cls_matchall_offload {
 | 
					struct tc_cls_matchall_offload {
 | 
				
			||||||
	struct tc_cls_common_offload common;
 | 
						struct tc_cls_common_offload common;
 | 
				
			||||||
	enum tc_matchall_command command;
 | 
						enum tc_matchall_command command;
 | 
				
			||||||
 | 
						struct flow_rule *rule;
 | 
				
			||||||
	struct tcf_exts *exts;
 | 
						struct tcf_exts *exts;
 | 
				
			||||||
	unsigned long cookie;
 | 
						unsigned long cookie;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -89,12 +89,30 @@ static int mall_replace_hw_filter(struct tcf_proto *tp,
 | 
				
			||||||
	bool skip_sw = tc_skip_sw(head->flags);
 | 
						bool skip_sw = tc_skip_sw(head->flags);
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cls_mall.rule =	flow_rule_alloc(tcf_exts_num_actions(&head->exts));
 | 
				
			||||||
 | 
						if (!cls_mall.rule)
 | 
				
			||||||
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tc_cls_common_offload_init(&cls_mall.common, tp, head->flags, extack);
 | 
						tc_cls_common_offload_init(&cls_mall.common, tp, head->flags, extack);
 | 
				
			||||||
	cls_mall.command = TC_CLSMATCHALL_REPLACE;
 | 
						cls_mall.command = TC_CLSMATCHALL_REPLACE;
 | 
				
			||||||
	cls_mall.exts = &head->exts;
 | 
						cls_mall.exts = &head->exts;
 | 
				
			||||||
	cls_mall.cookie = cookie;
 | 
						cls_mall.cookie = cookie;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = tc_setup_flow_action(&cls_mall.rule->action, &head->exts);
 | 
				
			||||||
 | 
						if (err) {
 | 
				
			||||||
 | 
							kfree(cls_mall.rule);
 | 
				
			||||||
 | 
							mall_destroy_hw_filter(tp, head, cookie, NULL);
 | 
				
			||||||
 | 
							if (skip_sw)
 | 
				
			||||||
 | 
								NL_SET_ERR_MSG_MOD(extack, "Failed to setup flow action");
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								err = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							return err;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = tc_setup_cb_call(block, TC_SETUP_CLSMATCHALL, &cls_mall, skip_sw);
 | 
						err = tc_setup_cb_call(block, TC_SETUP_CLSMATCHALL, &cls_mall, skip_sw);
 | 
				
			||||||
 | 
						kfree(cls_mall.rule);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (err < 0) {
 | 
						if (err < 0) {
 | 
				
			||||||
		mall_destroy_hw_filter(tp, head, cookie, NULL);
 | 
							mall_destroy_hw_filter(tp, head, cookie, NULL);
 | 
				
			||||||
		return err;
 | 
							return err;
 | 
				
			||||||
| 
						 | 
					@ -272,13 +290,28 @@ static int mall_reoffload(struct tcf_proto *tp, bool add, tc_setup_cb_t *cb,
 | 
				
			||||||
	if (tc_skip_hw(head->flags))
 | 
						if (tc_skip_hw(head->flags))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cls_mall.rule =	flow_rule_alloc(tcf_exts_num_actions(&head->exts));
 | 
				
			||||||
 | 
						if (!cls_mall.rule)
 | 
				
			||||||
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tc_cls_common_offload_init(&cls_mall.common, tp, head->flags, extack);
 | 
						tc_cls_common_offload_init(&cls_mall.common, tp, head->flags, extack);
 | 
				
			||||||
	cls_mall.command = add ?
 | 
						cls_mall.command = add ?
 | 
				
			||||||
		TC_CLSMATCHALL_REPLACE : TC_CLSMATCHALL_DESTROY;
 | 
							TC_CLSMATCHALL_REPLACE : TC_CLSMATCHALL_DESTROY;
 | 
				
			||||||
	cls_mall.exts = &head->exts;
 | 
						cls_mall.exts = &head->exts;
 | 
				
			||||||
	cls_mall.cookie = (unsigned long)head;
 | 
						cls_mall.cookie = (unsigned long)head;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = tc_setup_flow_action(&cls_mall.rule->action, &head->exts);
 | 
				
			||||||
 | 
						if (err) {
 | 
				
			||||||
 | 
							kfree(cls_mall.rule);
 | 
				
			||||||
 | 
							if (add && tc_skip_sw(head->flags)) {
 | 
				
			||||||
 | 
								NL_SET_ERR_MSG_MOD(extack, "Failed to setup flow action");
 | 
				
			||||||
 | 
								return err;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	err = cb(TC_SETUP_CLSMATCHALL, &cls_mall, cb_priv);
 | 
						err = cb(TC_SETUP_CLSMATCHALL, &cls_mall, cb_priv);
 | 
				
			||||||
 | 
						kfree(cls_mall.rule);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (err) {
 | 
						if (err) {
 | 
				
			||||||
		if (add && tc_skip_sw(head->flags))
 | 
							if (add && tc_skip_sw(head->flags))
 | 
				
			||||||
			return err;
 | 
								return err;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue