Commit bcd6740c authored by Chris Mi's avatar Chris Mi Committed by Saeed Mahameed

net/mlx5e: Move sample attribute to flow attribute

Currently it is in eswitch attribute. Move it to flow attribute to
reflect the change in previous patch.
Signed-off-by: default avatarChris Mi <cmi@nvidia.com>
Reviewed-by: default avatarRoi Dayan <roid@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 0027d70c
...@@ -391,7 +391,8 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample, ...@@ -391,7 +391,8 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample,
sample_flow = kzalloc(sizeof(*sample_flow), GFP_KERNEL); sample_flow = kzalloc(sizeof(*sample_flow), GFP_KERNEL);
if (!sample_flow) if (!sample_flow)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
esw_attr->sample->sample_flow = sample_flow; sample_attr = attr->sample_attr;
sample_attr->sample_flow = sample_flow;
/* Allocate default table per vport, chain and prio. Otherwise, there is /* Allocate default table per vport, chain and prio. Otherwise, there is
* only one default table for the same sampler object. Rules with different * only one default table for the same sampler object. Rules with different
...@@ -411,7 +412,7 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample, ...@@ -411,7 +412,7 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample,
/* Perform the original matches on the default table. /* Perform the original matches on the default table.
* Offload all actions except the sample action. * Offload all actions except the sample action.
*/ */
esw_attr->sample->sample_default_tbl = default_tbl; sample_attr->sample_default_tbl = default_tbl;
/* When offloading sample and encap action, if there is no valid /* When offloading sample and encap action, if there is no valid
* neigh data struct, a slow path rule is offloaded first. Source * neigh data struct, a slow path rule is offloaded first. Source
* port metadata match is set at that time. A per vport table is * port metadata match is set at that time. A per vport table is
...@@ -426,7 +427,7 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample, ...@@ -426,7 +427,7 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample,
} }
/* Create sampler object. */ /* Create sampler object. */
sample_flow->sampler = sampler_get(tc_psample, esw_attr->sample->rate, default_tbl->id); sample_flow->sampler = sampler_get(tc_psample, sample_attr->rate, default_tbl->id);
if (IS_ERR(sample_flow->sampler)) { if (IS_ERR(sample_flow->sampler)) {
err = PTR_ERR(sample_flow->sampler); err = PTR_ERR(sample_flow->sampler);
goto err_sampler; goto err_sampler;
...@@ -434,13 +435,13 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample, ...@@ -434,13 +435,13 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample,
/* Create an id mapping reg_c0 value to sample object. */ /* Create an id mapping reg_c0 value to sample object. */
restore_obj.type = MLX5_MAPPED_OBJ_SAMPLE; restore_obj.type = MLX5_MAPPED_OBJ_SAMPLE;
restore_obj.sample.group_id = esw_attr->sample->group_num; restore_obj.sample.group_id = sample_attr->group_num;
restore_obj.sample.rate = esw_attr->sample->rate; restore_obj.sample.rate = sample_attr->rate;
restore_obj.sample.trunc_size = esw_attr->sample->trunc_size; restore_obj.sample.trunc_size = sample_attr->trunc_size;
err = mapping_add(esw->offloads.reg_c0_obj_pool, &restore_obj, &obj_id); err = mapping_add(esw->offloads.reg_c0_obj_pool, &restore_obj, &obj_id);
if (err) if (err)
goto err_obj_id; goto err_obj_id;
esw_attr->sample->restore_obj_id = obj_id; sample_attr->restore_obj_id = obj_id;
/* Create sample restore context. */ /* Create sample restore context. */
sample_flow->restore = sample_restore_get(tc_psample, obj_id); sample_flow->restore = sample_restore_get(tc_psample, obj_id);
...@@ -462,14 +463,14 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample, ...@@ -462,14 +463,14 @@ mlx5e_tc_sample_offload(struct mlx5e_tc_psample *tc_psample,
err = -ENOMEM; err = -ENOMEM;
goto err_alloc_sample_attr; goto err_alloc_sample_attr;
} }
pre_esw_attr = pre_attr->esw_attr;
pre_attr->action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_MOD_HDR; pre_attr->action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_MOD_HDR;
pre_attr->modify_hdr = sample_flow->restore->modify_hdr; pre_attr->modify_hdr = sample_flow->restore->modify_hdr;
pre_attr->flags = MLX5_ESW_ATTR_FLAG_SAMPLE; pre_attr->flags = MLX5_ESW_ATTR_FLAG_SAMPLE;
pre_attr->chain = attr->chain; pre_attr->chain = attr->chain;
pre_attr->prio = attr->prio; pre_attr->prio = attr->prio;
pre_esw_attr->sample = sample_attr; pre_attr->sample_attr = sample_attr;
pre_esw_attr->sample->sampler_id = sample_flow->sampler->sampler_id; sample_attr->sampler_id = sample_flow->sampler->sampler_id;
pre_esw_attr = pre_attr->esw_attr;
pre_esw_attr->in_mdev = esw_attr->in_mdev; pre_esw_attr->in_mdev = esw_attr->in_mdev;
pre_esw_attr->in_rep = esw_attr->in_rep; pre_esw_attr->in_rep = esw_attr->in_rep;
sample_flow->pre_rule = mlx5_eswitch_add_offloaded_rule(esw, spec, pre_attr); sample_flow->pre_rule = mlx5_eswitch_add_offloaded_rule(esw, spec, pre_attr);
...@@ -528,14 +529,14 @@ mlx5e_tc_sample_unoffload(struct mlx5e_tc_psample *tc_psample, ...@@ -528,14 +529,14 @@ mlx5e_tc_sample_unoffload(struct mlx5e_tc_psample *tc_psample,
return; return;
} }
sample_flow = esw_attr->sample->sample_flow; sample_flow = attr->sample_attr->sample_flow;
pre_attr = sample_flow->pre_attr; pre_attr = sample_flow->pre_attr;
memset(pre_attr, 0, sizeof(*pre_attr)); memset(pre_attr, 0, sizeof(*pre_attr));
mlx5_eswitch_del_offloaded_rule(esw, sample_flow->pre_rule, pre_attr); mlx5_eswitch_del_offloaded_rule(esw, sample_flow->pre_rule, pre_attr);
mlx5_eswitch_del_offloaded_rule(esw, sample_flow->rule, attr); mlx5_eswitch_del_offloaded_rule(esw, sample_flow->rule, attr);
sample_restore_put(tc_psample, sample_flow->restore); sample_restore_put(tc_psample, sample_flow->restore);
mapping_remove(esw->offloads.reg_c0_obj_pool, esw_attr->sample->restore_obj_id); mapping_remove(esw->offloads.reg_c0_obj_pool, attr->sample_attr->restore_obj_id);
sampler_put(tc_psample, sample_flow->sampler); sampler_put(tc_psample, sample_flow->sampler);
tbl_attr.chain = attr->chain; tbl_attr.chain = attr->chain;
tbl_attr.prio = attr->prio; tbl_attr.prio = attr->prio;
...@@ -543,7 +544,7 @@ mlx5e_tc_sample_unoffload(struct mlx5e_tc_psample *tc_psample, ...@@ -543,7 +544,7 @@ mlx5e_tc_sample_unoffload(struct mlx5e_tc_psample *tc_psample,
tbl_attr.vport_ns = &mlx5_esw_vport_tbl_sample_ns; tbl_attr.vport_ns = &mlx5_esw_vport_tbl_sample_ns;
mlx5_esw_vporttbl_put(esw, &tbl_attr); mlx5_esw_vporttbl_put(esw, &tbl_attr);
kfree(pre_attr->esw_attr->sample); kfree(pre_attr->sample_attr);
kfree(pre_attr); kfree(pre_attr);
kfree(sample_flow); kfree(sample_flow);
} }
......
...@@ -1550,6 +1550,7 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv, ...@@ -1550,6 +1550,7 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
else else
mlx5e_detach_mod_hdr(priv, flow); mlx5e_detach_mod_hdr(priv, flow);
} }
kfree(attr->sample_attr);
kvfree(attr->parse_attr); kvfree(attr->parse_attr);
kvfree(attr->esw_attr->rx_tun_attr); kvfree(attr->esw_attr->rx_tun_attr);
...@@ -1559,7 +1560,6 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv, ...@@ -1559,7 +1560,6 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
if (flow_flag_test(flow, L3_TO_L2_DECAP)) if (flow_flag_test(flow, L3_TO_L2_DECAP))
mlx5e_detach_decap(priv, flow); mlx5e_detach_decap(priv, flow);
kfree(flow->attr->esw_attr->sample);
kfree(flow->attr); kfree(flow->attr);
} }
...@@ -3716,13 +3716,13 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, ...@@ -3716,13 +3716,13 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
struct mlx5e_tc_flow_parse_attr *parse_attr; struct mlx5e_tc_flow_parse_attr *parse_attr;
struct mlx5e_rep_priv *rpriv = priv->ppriv; struct mlx5e_rep_priv *rpriv = priv->ppriv;
struct mlx5e_sample_attr sample_attr = {};
const struct ip_tunnel_info *info = NULL; const struct ip_tunnel_info *info = NULL;
struct mlx5_flow_attr *attr = flow->attr; struct mlx5_flow_attr *attr = flow->attr;
int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS]; int ifindexes[MLX5_MAX_FLOW_FWD_VPORTS];
bool ft_flow = mlx5e_is_ft_flow(flow); bool ft_flow = mlx5e_is_ft_flow(flow);
const struct flow_action_entry *act; const struct flow_action_entry *act;
struct mlx5_esw_flow_attr *esw_attr; struct mlx5_esw_flow_attr *esw_attr;
struct mlx5e_sample_attr sample = {};
bool encap = false, decap = false; bool encap = false, decap = false;
u32 action = attr->action; u32 action = attr->action;
int err, i, if_count = 0; int err, i, if_count = 0;
...@@ -3993,10 +3993,10 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, ...@@ -3993,10 +3993,10 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported"); NL_SET_ERR_MSG_MOD(extack, "Sample action with connection tracking is not supported");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
sample.rate = act->sample.rate; sample_attr.rate = act->sample.rate;
sample.group_num = act->sample.psample_group->group_num; sample_attr.group_num = act->sample.psample_group->group_num;
if (act->sample.truncate) if (act->sample.truncate)
sample.trunc_size = act->sample.trunc_size; sample_attr.trunc_size = act->sample.trunc_size;
flow_flag_set(flow, SAMPLE); flow_flag_set(flow, SAMPLE);
break; break;
default: default:
...@@ -4081,10 +4081,10 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, ...@@ -4081,10 +4081,10 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
* no errors after parsing. * no errors after parsing.
*/ */
if (flow_flag_test(flow, SAMPLE)) { if (flow_flag_test(flow, SAMPLE)) {
esw_attr->sample = kzalloc(sizeof(*esw_attr->sample), GFP_KERNEL); attr->sample_attr = kzalloc(sizeof(*attr->sample_attr), GFP_KERNEL);
if (!esw_attr->sample) if (!attr->sample_attr)
return -ENOMEM; return -ENOMEM;
*esw_attr->sample = sample; *attr->sample_attr = sample_attr;
} }
return 0; return 0;
......
...@@ -70,6 +70,7 @@ struct mlx5_flow_attr { ...@@ -70,6 +70,7 @@ struct mlx5_flow_attr {
struct mlx5_fc *counter; struct mlx5_fc *counter;
struct mlx5_modify_hdr *modify_hdr; struct mlx5_modify_hdr *modify_hdr;
struct mlx5_ct_attr ct_attr; struct mlx5_ct_attr ct_attr;
struct mlx5e_sample_attr *sample_attr;
struct mlx5e_tc_flow_parse_attr *parse_attr; struct mlx5e_tc_flow_parse_attr *parse_attr;
u32 chain; u32 chain;
u16 prio; u16 prio;
......
...@@ -469,7 +469,6 @@ struct mlx5_esw_flow_attr { ...@@ -469,7 +469,6 @@ struct mlx5_esw_flow_attr {
} dests[MLX5_MAX_FLOW_FWD_VPORTS]; } dests[MLX5_MAX_FLOW_FWD_VPORTS];
struct mlx5_rx_tun_attr *rx_tun_attr; struct mlx5_rx_tun_attr *rx_tun_attr;
struct mlx5_pkt_reformat *decap_pkt_reformat; struct mlx5_pkt_reformat *decap_pkt_reformat;
struct mlx5e_sample_attr *sample;
}; };
int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode, int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
......
...@@ -187,12 +187,12 @@ esw_cleanup_decap_indir(struct mlx5_eswitch *esw, ...@@ -187,12 +187,12 @@ esw_cleanup_decap_indir(struct mlx5_eswitch *esw,
static int static int
esw_setup_sampler_dest(struct mlx5_flow_destination *dest, esw_setup_sampler_dest(struct mlx5_flow_destination *dest,
struct mlx5_flow_act *flow_act, struct mlx5_flow_act *flow_act,
struct mlx5_esw_flow_attr *esw_attr, struct mlx5_flow_attr *attr,
int i) int i)
{ {
flow_act->flags |= FLOW_ACT_IGNORE_FLOW_LEVEL; flow_act->flags |= FLOW_ACT_IGNORE_FLOW_LEVEL;
dest[i].type = MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER; dest[i].type = MLX5_FLOW_DESTINATION_TYPE_FLOW_SAMPLER;
dest[i].sampler_id = esw_attr->sample->sampler_id; dest[i].sampler_id = attr->sample_attr->sampler_id;
return 0; return 0;
} }
...@@ -435,7 +435,7 @@ esw_setup_dests(struct mlx5_flow_destination *dest, ...@@ -435,7 +435,7 @@ esw_setup_dests(struct mlx5_flow_destination *dest,
attr->flags |= MLX5_ESW_ATTR_FLAG_SRC_REWRITE; attr->flags |= MLX5_ESW_ATTR_FLAG_SRC_REWRITE;
if (attr->flags & MLX5_ESW_ATTR_FLAG_SAMPLE) { if (attr->flags & MLX5_ESW_ATTR_FLAG_SAMPLE) {
esw_setup_sampler_dest(dest, flow_act, esw_attr, *i); esw_setup_sampler_dest(dest, flow_act, attr, *i);
(*i)++; (*i)++;
} else if (attr->dest_ft) { } else if (attr->dest_ft) {
esw_setup_ft_dest(dest, flow_act, esw, attr, spec, *i); esw_setup_ft_dest(dest, flow_act, esw, attr, spec, *i);
...@@ -540,9 +540,9 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw, ...@@ -540,9 +540,9 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR)
flow_act.modify_hdr = attr->modify_hdr; flow_act.modify_hdr = attr->modify_hdr;
/* esw_attr->sample is allocated only when there is a sample action */ /* sample_attr is allocated only when there is a sample action */
if (esw_attr->sample && esw_attr->sample->sample_default_tbl) { if (attr->sample_attr && attr->sample_attr->sample_default_tbl) {
fdb = esw_attr->sample->sample_default_tbl; fdb = attr->sample_attr->sample_default_tbl;
} else if (split) { } else if (split) {
fwd_attr.chain = attr->chain; fwd_attr.chain = attr->chain;
fwd_attr.prio = attr->prio; fwd_attr.prio = attr->prio;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment