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>
This commit is contained in:
parent
bcd6436858
commit
c7a66f8d8a
|
@ -253,6 +253,7 @@ void tcf_action_update_stats(struct tc_action *a, u64 bytes, u64 packets,
|
||||||
u64 drops, bool hw);
|
u64 drops, bool hw);
|
||||||
int tcf_action_copy_stats(struct sk_buff *, struct tc_action *, int);
|
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,
|
int tcf_action_check_ctrlact(int action, struct tcf_proto *tp,
|
||||||
struct tcf_chain **handle,
|
struct tcf_chain **handle,
|
||||||
struct netlink_ext_ack *newchain);
|
struct netlink_ext_ack *newchain);
|
||||||
|
|
|
@ -273,18 +273,20 @@ tcf_exts_hw_stats_update(const struct tcf_exts *exts,
|
||||||
#ifdef CONFIG_NET_CLS_ACT
|
#ifdef CONFIG_NET_CLS_ACT
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
preempt_disable();
|
|
||||||
|
|
||||||
for (i = 0; i < exts->nr_actions; i++) {
|
for (i = 0; i < exts->nr_actions; i++) {
|
||||||
struct tc_action *a = exts->actions[i];
|
struct tc_action *a = exts->actions[i];
|
||||||
|
|
||||||
tcf_action_stats_update(a, bytes, packets, drops,
|
/* if stats from hw, just skip */
|
||||||
lastuse, true);
|
if (tcf_action_update_hw_stats(a)) {
|
||||||
a->used_hw_stats = used_hw_stats;
|
preempt_disable();
|
||||||
a->used_hw_stats_valid = used_hw_stats_valid;
|
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
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -246,6 +246,37 @@ fl_err:
|
||||||
return err;
|
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)
|
static int tcf_action_offload_del(struct tc_action *action)
|
||||||
{
|
{
|
||||||
struct flow_offload_action fl_act = {};
|
struct flow_offload_action fl_act = {};
|
||||||
|
@ -1318,6 +1349,9 @@ int tcf_action_copy_stats(struct sk_buff *skb, struct tc_action *p,
|
||||||
if (p == NULL)
|
if (p == NULL)
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
||||||
|
/* update hw stats for this action */
|
||||||
|
tcf_action_update_hw_stats(p);
|
||||||
|
|
||||||
/* compat_mode being true specifies a call that is supposed
|
/* compat_mode being true specifies a call that is supposed
|
||||||
* to add additional backward compatibility statistic TLVs.
|
* to add additional backward compatibility statistic TLVs.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue