From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jiri Pirko Subject: Re: [PATCH net-next v4 5/8] net: sched: add extack support for offload via tc_cls_common_offload Date: Sat, 20 Jan 2018 09:54:48 +0100 Message-ID: <20180120085448.GA2147@nanopsycho.orion> References: <20180120014450.29666-1-jakub.kicinski@netronome.com> <20180120014450.29666-6-jakub.kicinski@netronome.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: davem@davemloft.net, dsahern@gmail.com, aring@mojatatu.com, daniel@iogearbox.net, alexei.starovoitov@gmail.com, netdev@vger.kernel.org, oss-drivers@netronome.com, Quentin Monnet To: Jakub Kicinski Return-path: Received: from mail-wr0-f195.google.com ([209.85.128.195]:40299 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751063AbeATIyv (ORCPT ); Sat, 20 Jan 2018 03:54:51 -0500 Received: by mail-wr0-f195.google.com with SMTP id 100so3625138wrb.7 for ; Sat, 20 Jan 2018 00:54:50 -0800 (PST) Content-Disposition: inline In-Reply-To: <20180120014450.29666-6-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org List-ID: Sat, Jan 20, 2018 at 02:44:47AM CET, jakub.kicinski@netronome.com wrote: >From: Quentin Monnet > >Add extack support for hardware offload of classifiers. In order >to achieve this, a pointer to a struct netlink_ext_ack is added to the >struct tc_cls_common_offload that is passed to the callback for setting >up the classifier. Function tc_cls_common_offload_init() is updated to >support initialization of this new attribute. > >Signed-off-by: Quentin Monnet >Reviewed-by: Jakub Kicinski >--- > include/net/pkt_cls.h | 5 ++++- > net/sched/cls_bpf.c | 4 ++-- > net/sched/cls_flower.c | 6 +++--- > net/sched/cls_matchall.c | 4 ++-- > net/sched/cls_u32.c | 8 ++++---- > 5 files changed, 15 insertions(+), 12 deletions(-) > >diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h >index 2e4b8e436d25..f497f622580b 100644 >--- a/include/net/pkt_cls.h >+++ b/include/net/pkt_cls.h >@@ -602,15 +602,18 @@ struct tc_cls_common_offload { > u32 chain_index; > __be16 protocol; > u32 prio; >+ struct netlink_ext_ack *extack; > }; > > static inline void > tc_cls_common_offload_init(struct tc_cls_common_offload *cls_common, >- const struct tcf_proto *tp) >+ const struct tcf_proto *tp, >+ struct netlink_ext_ack *extack) > { > cls_common->chain_index = tp->chain->index; > cls_common->protocol = tp->protocol; > cls_common->prio = tp->prio; >+ cls_common->extack = extack; > } [...] >diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c >index f675a92e1b66..727c10378f37 100644 >--- a/net/sched/cls_flower.c >+++ b/net/sched/cls_flower.c >@@ -223,7 +223,7 @@ static void fl_hw_destroy_filter(struct tcf_proto *tp, struct cls_fl_filter *f) > struct tc_cls_flower_offload cls_flower = {}; > struct tcf_block *block = tp->chain->block; > >- tc_cls_common_offload_init(&cls_flower.common, tp); >+ tc_cls_common_offload_init(&cls_flower.common, tp, NULL); While you are at it, you should propagate extack whenever possible. For this, you can easily pass extack to fl_hw_destroy_filter. Same for other classifiers. > cls_flower.command = TC_CLSFLOWER_DESTROY; > cls_flower.cookie = (unsigned long) f; > >@@ -243,7 +243,7 @@ static int fl_hw_replace_filter(struct tcf_proto *tp, > bool skip_sw = tc_skip_sw(f->flags); > int err; > >- tc_cls_common_offload_init(&cls_flower.common, tp); >+ tc_cls_common_offload_init(&cls_flower.common, tp, extack); > cls_flower.command = TC_CLSFLOWER_REPLACE; > cls_flower.cookie = (unsigned long) f; > cls_flower.dissector = dissector; >@@ -272,7 +272,7 @@ static void fl_hw_update_stats(struct tcf_proto *tp, struct cls_fl_filter *f) > struct tc_cls_flower_offload cls_flower = {}; > struct tcf_block *block = tp->chain->block; > >- tc_cls_common_offload_init(&cls_flower.common, tp); >+ tc_cls_common_offload_init(&cls_flower.common, tp, NULL); For this, it would be probably a bit trickier to get extack, but also possible. My motivation is to make the extack always available for users of tc_cls_common_offload > cls_flower.command = TC_CLSFLOWER_STATS; > cls_flower.cookie = (unsigned long) f; > cls_flower.exts = &f->exts; [...]