lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Message-ID: <alpine.LFD.2.21.1905031603340.11823@ehc-opti7040.uk.solarflarecom.com> Date: Fri, 3 May 2019 16:06:55 +0100 From: Edward Cree <ecree@...arflare.com> To: Jamal Hadi Salim <jhs@...atatu.com>, Jiri Pirko <jiri@...nulli.us>, "Pablo Neira Ayuso" <pablo@...filter.org>, David Miller <davem@...emloft.net> CC: netdev <netdev@...r.kernel.org>, Cong Wang <xiyou.wangcong@...il.com>, Andy Gospodarek <andy@...yhouse.net>, Anjali Singhai Jain <anjali.singhai@...el.com>, Jakub Kicinski <jakub.kicinski@...ronome.com>, "Or Gerlitz" <gerlitz.or@...il.com> Subject: [RFC PATCH net-next 2/3] flow_offload: restore ability to collect separate stats per action Introduce a new offload command TC_CLSFLOWER_STATS_BYINDEX, similar to the existing TC_CLSFLOWER_STATS but specifying an action_index (the tcfa_index of the action), which is called for each stats-having action on the rule. Drivers should implement either, but not both, of these commands. Signed-off-by: Edward Cree <ecree@...arflare.com> --- include/net/pkt_cls.h | 2 ++ net/sched/cls_flower.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h index d5e7a1af346f..0e33c52c23a8 100644 --- a/include/net/pkt_cls.h +++ b/include/net/pkt_cls.h @@ -762,6 +762,7 @@ enum tc_fl_command { TC_CLSFLOWER_REPLACE, TC_CLSFLOWER_DESTROY, TC_CLSFLOWER_STATS, + TC_CLSFLOWER_STATS_BYINDEX, TC_CLSFLOWER_TMPLT_CREATE, TC_CLSFLOWER_TMPLT_DESTROY, }; @@ -773,6 +774,7 @@ struct tc_cls_flower_offload { struct flow_rule *rule; struct flow_stats stats; u32 classid; + u32 action_index; /* for TC_CLSFLOWER_STATS_BYINDEX */ }; static inline struct flow_rule * diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c index f6685fc53119..be339cd6a86e 100644 --- a/net/sched/cls_flower.c +++ b/net/sched/cls_flower.c @@ -474,6 +474,10 @@ 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; +#ifdef CONFIG_NET_CLS_ACT + struct tc_action *a; + int i; +#endif if (!rtnl_held) rtnl_lock(); @@ -489,6 +493,32 @@ static void fl_hw_update_stats(struct tcf_proto *tp, struct cls_fl_filter *f, cls_flower.stats.pkts, cls_flower.stats.lastused); +#ifdef CONFIG_NET_CLS_ACT + for (i = 0; i < f->exts.nr_actions; i++) { + a = f->exts.actions[i]; + + if (!a->ops->stats_update) + continue; + memset(&cls_flower, 0, sizeof(cls_flower)); + tc_cls_common_offload_init(&cls_flower.common, tp, f->flags, NULL); + cls_flower.command = TC_CLSFLOWER_STATS_BYINDEX; + cls_flower.cookie = (unsigned long) f; + cls_flower.classid = f->res.classid; + cls_flower.action_index = a->tcfa_index; + + tc_setup_cb_call(block, TC_SETUP_CLSFLOWER, &cls_flower, false); + + /* Some ->stats_update() use percpu variables and must thus be + * called with preemption disabled. + */ + preempt_disable(); + a->ops->stats_update(a, cls_flower.stats.bytes, + cls_flower.stats.pkts, + cls_flower.stats.lastused, true); + preempt_enable(); + } +#endif + if (!rtnl_held) rtnl_unlock(); }
Powered by blists - more mailing lists