Skip to content

Commit

Permalink
flow_offload: add process to update action stats from hardware
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Baowen Zheng authored and David S. Miller committed Dec 19, 2021
1 parent bcd6436 commit c7a66f8
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 8 deletions.
1 change: 1 addition & 0 deletions include/net/act_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
18 changes: 10 additions & 8 deletions include/net/pkt_cls.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
34 changes: 34 additions & 0 deletions net/sched/act_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,37 @@ static int tcf_action_offload_add(struct tc_action *action,
return err;
}

int tcf_action_update_hw_stats(struct tc_action *action)
{
struct flow_offload_action fl_act = {};
int err;

if (!tc_act_in_hw(action))
return -EOPNOTSUPP;

err = offload_action_init(&fl_act, action, FLOW_ACT_STATS, NULL);
if (err)
return err;

err = tcf_action_offload_cmd(&fl_act, NULL, NULL);
if (!err) {
preempt_disable();
tcf_action_stats_update(action, fl_act.stats.bytes,
fl_act.stats.pkts,
fl_act.stats.drops,
fl_act.stats.lastused,
true);
preempt_enable();
action->used_hw_stats = fl_act.stats.used_hw_stats;
action->used_hw_stats_valid = true;
} else {
return -EOPNOTSUPP;
}

return 0;
}
EXPORT_SYMBOL(tcf_action_update_hw_stats);

static int tcf_action_offload_del(struct tc_action *action)
{
struct flow_offload_action fl_act = {};
Expand Down Expand Up @@ -1318,6 +1349,9 @@ int tcf_action_copy_stats(struct sk_buff *skb, struct tc_action *p,
if (p == NULL)
goto errout;

/* update hw stats for this action */
tcf_action_update_hw_stats(p);

/* compat_mode being true specifies a call that is supposed
* to add additional backward compatibility statistic TLVs.
*/
Expand Down

0 comments on commit c7a66f8

Please sign in to comment.