From: Simon Horman <simon.horman@corigine.com>
To: Oz Shlomo <ozsh@nvidia.com>
Cc: netdev@vger.kernel.org, Saeed Mahameed <saeedm@nvidia.com>,
Roi Dayan <roid@nvidia.com>, Jiri Pirko <jiri@nvidia.com>,
Marcelo Ricardo Leitner <mleitner@redhat.com>,
Baowen Zheng <baowen.zheng@corigine.com>,
Jamal Hadi Salim <jhs@mojatatu.com>,
Edward Cree <ecree.xilinx@gmail.com>
Subject: Re: [PATCH net-next 5/9] net/sched: support per action hw stats
Date: Fri, 3 Feb 2023 15:33:40 +0100 [thread overview]
Message-ID: <Y90bRHerUsBhFIcl@corigine.com> (raw)
In-Reply-To: <20230201161039.20714-6-ozsh@nvidia.com>
On Wed, Feb 01, 2023 at 06:10:34PM +0200, Oz Shlomo wrote:
> There are currently two mechanisms for populating hardware stats:
> 1. Using flow_offload api to query the flow's statistics.
> The api assumes that the same stats values apply to all
> the flow's actions.
> This assumption breaks when action drops or jumps over following
> actions.
> 2. Using hw_action api to query specific action stats via a driver
> callback method. This api assures the correct action stats for
> the offloaded action, however, it does not apply to the rest of the
> actions in the flow's actions array.
>
> Extend the flow_offload stats callback to indicate that a per action
> stats update is required.
> Use the existing flow_offload_action api to query the action's hw stats.
> In addition, currently the tc action stats utility only updates hw actions.
> Reuse the existing action stats cb infrastructure to query any action
> stats.
>
> Signed-off-by: Oz Shlomo <ozsh@nvidia.com>
...
> diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h
> index be21764a3b34..d4315757d1a2 100644
> --- a/include/net/pkt_cls.h
> +++ b/include/net/pkt_cls.h
> @@ -292,9 +292,15 @@ static inline void tcf_exts_put_net(struct tcf_exts *exts)
> #define tcf_act_for_each_action(i, a, actions) \
> for (i = 0; i < TCA_ACT_MAX_PRIO && ((a) = actions[i]); i++)
>
> +static bool tc_act_in_hw(struct tc_action *act)
> +{
> + return !!act->in_hw_count;
> +}
> +
> static inline void
> tcf_exts_hw_stats_update(const struct tcf_exts *exts,
> - struct flow_stats *stats)
> + struct flow_stats *stats,
> + bool use_act_stats)
> {
> #ifdef CONFIG_NET_CLS_ACT
> int i;
> @@ -302,16 +308,18 @@ static inline void tcf_exts_put_net(struct tcf_exts *exts)
> for (i = 0; i < exts->nr_actions; i++) {
> struct tc_action *a = exts->actions[i];
>
> - /* if stats from hw, just skip */
> - if (tcf_action_update_hw_stats(a)) {
> - preempt_disable();
> - tcf_action_stats_update(a, stats->bytes, stats->pkts, stats->drops,
> - stats->lastused, true);
> - preempt_enable();
> -
> - a->used_hw_stats = stats->used_hw_stats;
> - a->used_hw_stats_valid = stats->used_hw_stats_valid;
> + if (use_act_stats || tc_act_in_hw(a)) {
> + tcf_action_update_hw_stats(a);
Hi Oz,
I am a unclear why it is ok to continue here even if
tcf_action_update_hw_stats() fails. There seem to be cases other than
!tc_act_in_hw() at play here, which prior to this patch, would execute the
code below that is now outside this if clause.
> + continue;
> }
> +
> + preempt_disable();
> + tcf_action_stats_update(a, stats->bytes, stats->pkts, stats->drops,
> + stats->lastused, true);
> + preempt_enable();
> +
> + a->used_hw_stats = stats->used_hw_stats;
> + a->used_hw_stats_valid = stats->used_hw_stats_valid;
> }
> #endif
> }
> @@ -769,6 +777,7 @@ struct tc_cls_matchall_offload {
> enum tc_matchall_command command;
> struct flow_rule *rule;
> struct flow_stats stats;
> + bool use_act_stats;
> unsigned long cookie;
> };
>
> diff --git a/net/sched/act_api.c b/net/sched/act_api.c
> index 917827199102..eda58b78da13 100644
> --- a/net/sched/act_api.c
> +++ b/net/sched/act_api.c
> @@ -169,11 +169,6 @@ static bool tc_act_skip_sw(u32 flags)
> return (flags & TCA_ACT_FLAGS_SKIP_SW) ? true : false;
> }
>
> -static bool tc_act_in_hw(struct tc_action *act)
> -{
> - return !!act->in_hw_count;
> -}
> -
> /* SKIP_HW and SKIP_SW are mutually exclusive flags. */
> static bool tc_act_flags_valid(u32 flags)
> {
> @@ -308,9 +303,6 @@ 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;
...
next prev parent reply other threads:[~2023-02-03 14:34 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-01 16:10 [PATCH net-next 0/9] net: flow_offload: add support for per action hw stats Oz Shlomo
2023-02-01 16:10 ` [PATCH net-next 1/9] net/sched: optimize action stats api calls Oz Shlomo
2023-02-03 14:34 ` Simon Horman
2023-02-01 16:10 ` [PATCH net-next 2/9] net/sched: act_pedit, setup offload action for action stats query Oz Shlomo
2023-02-01 20:59 ` Pedro Tammela
2023-02-02 7:21 ` Oz Shlomo
2023-02-03 15:31 ` Marcelo Ricardo Leitner
2023-02-05 13:00 ` Oz Shlomo
2023-02-01 16:10 ` [PATCH net-next 3/9] net/sched: pass flow_stats instead of multiple stats args Oz Shlomo
2023-02-03 14:34 ` Simon Horman
2023-02-01 16:10 ` [PATCH net-next 4/9] net/sched: introduce flow_offload action cookie Oz Shlomo
2023-02-03 14:38 ` Simon Horman
2023-02-01 16:10 ` [PATCH net-next 5/9] net/sched: support per action hw stats Oz Shlomo
2023-02-03 14:33 ` Simon Horman [this message]
2023-02-05 13:01 ` Oz Shlomo
2023-02-03 14:51 ` Simon Horman
2023-02-05 13:02 ` Oz Shlomo
2023-02-01 16:10 ` [PATCH net-next 6/9] net/mlx5e: TC, add hw counter to branching actions Oz Shlomo
2023-02-01 16:10 ` [PATCH net-next 7/9] net/mlx5e: TC, store tc action cookies per attr Oz Shlomo
2023-02-03 16:11 ` Marcelo Ricardo Leitner
2023-02-05 13:13 ` Oz Shlomo
2023-02-01 16:10 ` [PATCH net-next 8/9] net/sched: TC, map tc action cookie to a hw counter Oz Shlomo
2023-02-01 16:10 ` [PATCH net-next 9/9] net/sched: TC, support per action stats Oz Shlomo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y90bRHerUsBhFIcl@corigine.com \
--to=simon.horman@corigine.com \
--cc=baowen.zheng@corigine.com \
--cc=ecree.xilinx@gmail.com \
--cc=jhs@mojatatu.com \
--cc=jiri@nvidia.com \
--cc=mleitner@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=ozsh@nvidia.com \
--cc=roid@nvidia.com \
--cc=saeedm@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.