Message ID | 20230201161039.20714-8-ozsh@nvidia.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: flow_offload: add support for per action hw stats | expand |
On Wed, Feb 01, 2023 at 06:10:36PM +0200, Oz Shlomo wrote: > The tc parse action phase translates the tc actions to mlx5 flow > attributes data structure that is used during the flow offload phase. > Currently, the flow offload stage instantiates hw counters while > associating them to flow cookie. However, flows with branching > actions are required to associate a hardware counter with its action > cookies. > > Store the parsed tc action cookies on the flow attribute. > Use the list of cookies in the next patch to associate a tc action cookie > with its allocated hw counter. > > Signed-off-by: Oz Shlomo <ozsh@nvidia.com> > Reviewed-by: Roi Dayan <roid@nvidia.com> > --- > drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 3 +++ > drivers/net/ethernet/mellanox/mlx5/core/en_tc.h | 2 ++ > 2 files changed, 5 insertions(+) > > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > index 39f75f7d5c8b..a5118da3ed6c 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c > @@ -3797,6 +3797,7 @@ bool mlx5e_same_hw_devs(struct mlx5e_priv *priv, struct mlx5e_priv *peer_priv) > parse_attr->filter_dev = attr->parse_attr->filter_dev; > attr2->action = 0; > attr2->counter = NULL; > + attr->tc_act_cookies_count = 0; > attr2->flags = 0; > attr2->parse_attr = parse_attr; > attr2->dest_chain = 0; > @@ -4160,6 +4161,8 @@ struct mlx5_flow_attr * > goto out_free; > > parse_state->actions |= attr->action; > + if (!tc_act->stats_action) > + attr->tc_act_cookies[attr->tc_act_cookies_count++] = act->act_cookie; > > /* Split attr for multi table act if not the last act. */ > if (jump_state.jump_target || > diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h > index ce516dc7f3fd..8aa25d8bac86 100644 > --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h > +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h > @@ -70,6 +70,8 @@ struct mlx5_nic_flow_attr { > struct mlx5_flow_attr { > u32 action; > struct mlx5_fc *counter; > + unsigned long tc_act_cookies[TCA_ACT_MAX_PRIO]; > + int tc_act_cookies_count; This one won't count much, as it is limited by TCA_ACT_MAX_PRIO above andi which is 32. Maybe this can be an u8 or u16 instead and be added together with 'prio'? To save 2 bytes, yes, but with a 1M flows, that's 2Mbytes. Or below 'action' above, to keep it on the same cache line. > struct mlx5_modify_hdr *modify_hdr; > struct mlx5e_mod_hdr_handle *mh; /* attached mod header instance */ > struct mlx5e_mod_hdr_handle *slow_mh; /* attached mod header instance for slow path */ > -- > 1.8.3.1 >
On 03/02/2023 18:11, Marcelo Ricardo Leitner wrote: > On Wed, Feb 01, 2023 at 06:10:36PM +0200, Oz Shlomo wrote: >> The tc parse action phase translates the tc actions to mlx5 flow >> attributes data structure that is used during the flow offload phase. >> Currently, the flow offload stage instantiates hw counters while >> associating them to flow cookie. However, flows with branching >> actions are required to associate a hardware counter with its action >> cookies. >> >> Store the parsed tc action cookies on the flow attribute. >> Use the list of cookies in the next patch to associate a tc action cookie >> with its allocated hw counter. >> >> Signed-off-by: Oz Shlomo <ozsh@nvidia.com> >> Reviewed-by: Roi Dayan <roid@nvidia.com> >> --- >> drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 3 +++ >> drivers/net/ethernet/mellanox/mlx5/core/en_tc.h | 2 ++ >> 2 files changed, 5 insertions(+) >> >> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c >> index 39f75f7d5c8b..a5118da3ed6c 100644 >> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c >> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c >> @@ -3797,6 +3797,7 @@ bool mlx5e_same_hw_devs(struct mlx5e_priv *priv, struct mlx5e_priv *peer_priv) >> parse_attr->filter_dev = attr->parse_attr->filter_dev; >> attr2->action = 0; >> attr2->counter = NULL; >> + attr->tc_act_cookies_count = 0; >> attr2->flags = 0; >> attr2->parse_attr = parse_attr; >> attr2->dest_chain = 0; >> @@ -4160,6 +4161,8 @@ struct mlx5_flow_attr * >> goto out_free; >> >> parse_state->actions |= attr->action; >> + if (!tc_act->stats_action) >> + attr->tc_act_cookies[attr->tc_act_cookies_count++] = act->act_cookie; >> >> /* Split attr for multi table act if not the last act. */ >> if (jump_state.jump_target || >> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h >> index ce516dc7f3fd..8aa25d8bac86 100644 >> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h >> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h >> @@ -70,6 +70,8 @@ struct mlx5_nic_flow_attr { >> struct mlx5_flow_attr { >> u32 action; >> struct mlx5_fc *counter; >> + unsigned long tc_act_cookies[TCA_ACT_MAX_PRIO]; >> + int tc_act_cookies_count; > This one won't count much, as it is limited by TCA_ACT_MAX_PRIO above > andi which is 32. > Maybe this can be an u8 or u16 instead and be added together with 'prio'? > To save 2 bytes, yes, but with a 1M flows, that's 2Mbytes. > Or below 'action' above, to keep it on the same cache line. I agree >> struct mlx5_modify_hdr *modify_hdr; >> struct mlx5e_mod_hdr_handle *mh; /* attached mod header instance */ >> struct mlx5e_mod_hdr_handle *slow_mh; /* attached mod header instance for slow path */ >> -- >> 1.8.3.1 >>
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index 39f75f7d5c8b..a5118da3ed6c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c @@ -3797,6 +3797,7 @@ bool mlx5e_same_hw_devs(struct mlx5e_priv *priv, struct mlx5e_priv *peer_priv) parse_attr->filter_dev = attr->parse_attr->filter_dev; attr2->action = 0; attr2->counter = NULL; + attr->tc_act_cookies_count = 0; attr2->flags = 0; attr2->parse_attr = parse_attr; attr2->dest_chain = 0; @@ -4160,6 +4161,8 @@ struct mlx5_flow_attr * goto out_free; parse_state->actions |= attr->action; + if (!tc_act->stats_action) + attr->tc_act_cookies[attr->tc_act_cookies_count++] = act->act_cookie; /* Split attr for multi table act if not the last act. */ if (jump_state.jump_target || diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h index ce516dc7f3fd..8aa25d8bac86 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.h @@ -70,6 +70,8 @@ struct mlx5_nic_flow_attr { struct mlx5_flow_attr { u32 action; struct mlx5_fc *counter; + unsigned long tc_act_cookies[TCA_ACT_MAX_PRIO]; + int tc_act_cookies_count; struct mlx5_modify_hdr *modify_hdr; struct mlx5e_mod_hdr_handle *mh; /* attached mod header instance */ struct mlx5e_mod_hdr_handle *slow_mh; /* attached mod header instance for slow path */