summaryrefslogtreecommitdiffstats
path: root/include/net
diff options
context:
space:
mode:
authorBaowen Zheng <baowen.zheng@corigine.com>2021-12-17 19:16:25 +0100
committerDavid S. Miller <davem@davemloft.net>2021-12-19 14:08:48 +0000
commitc7a66f8d8a946edafb38150480145ab9801e4e52 (patch)
treeac4b8983bfd0e8726e3f315e567fd9c036ba8269 /include/net
parentbcd64368584bab38bdd095c88df702fb64271694 (diff)
downloadlinux-c7a66f8d8a946edafb38150480145ab9801e4e52.tar.bz2
flow_offload: add process to update action stats from hardware
When collecting stats for actions update them using both hardware and software counters. Stats update process should not run in context of preempt_disable. Signed-off-by: Baowen Zheng <baowen.zheng@corigine.com> Signed-off-by: Louis Peens <louis.peens@corigine.com> Signed-off-by: Simon Horman <simon.horman@corigine.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r--include/net/act_api.h1
-rw-r--r--include/net/pkt_cls.h18
2 files changed, 11 insertions, 8 deletions
diff --git a/include/net/act_api.h b/include/net/act_api.h
index 15c6a881817d..20104dfdd57c 100644
--- a/include/net/act_api.h
+++ b/include/net/act_api.h
@@ -253,6 +253,7 @@ void tcf_action_update_stats(struct tc_action *a, u64 bytes, u64 packets,
u64 drops, bool hw);
int tcf_action_copy_stats(struct sk_buff *, struct tc_action *, int);
+int tcf_action_update_hw_stats(struct tc_action *action);
int tcf_action_check_ctrlact(int action, struct tcf_proto *tp,
struct tcf_chain **handle,
struct netlink_ext_ack *newchain);
diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h
index efdfab8eb00c..337a3ebb4666 100644
--- a/include/net/pkt_cls.h
+++ b/include/net/pkt_cls.h
@@ -273,18 +273,20 @@ tcf_exts_hw_stats_update(const struct tcf_exts *exts,
#ifdef CONFIG_NET_CLS_ACT
int i;
- preempt_disable();
-
for (i = 0; i < exts->nr_actions; i++) {
struct tc_action *a = exts->actions[i];
- tcf_action_stats_update(a, bytes, packets, drops,
- lastuse, true);
- a->used_hw_stats = used_hw_stats;
- a->used_hw_stats_valid = used_hw_stats_valid;
- }
+ /* if stats from hw, just skip */
+ if (tcf_action_update_hw_stats(a)) {
+ preempt_disable();
+ tcf_action_stats_update(a, bytes, packets, drops,
+ lastuse, true);
+ preempt_enable();
- preempt_enable();
+ a->used_hw_stats = used_hw_stats;
+ a->used_hw_stats_valid = used_hw_stats_valid;
+ }
+ }
#endif
}