Commit 2198b932 authored by Roi Dayan's avatar Roi Dayan Committed by Saeed Mahameed

net/mlx5e: Use shared mappings for restoring from metadata

FTEs are added with mapped metadata which is saved per eswitch.
When uplink reps are bonded and we are in a single FDB mode,
we could fail to find metadata which was stored on one eswitch mapping
but not the other or with a different id.
To resolve this issue use shared mapping between eswitch ports.
We do not have any conflict using a single mapping, for a type,
between the ports.
Signed-off-by: default avatarRoi Dayan <roid@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 5d5defd6
...@@ -2138,6 +2138,7 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, ...@@ -2138,6 +2138,7 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
struct mlx5_tc_ct_priv *ct_priv; struct mlx5_tc_ct_priv *ct_priv;
struct mlx5_core_dev *dev; struct mlx5_core_dev *dev;
const char *msg; const char *msg;
u64 mapping_id;
int err; int err;
dev = priv->mdev; dev = priv->mdev;
...@@ -2153,13 +2154,17 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains, ...@@ -2153,13 +2154,17 @@ mlx5_tc_ct_init(struct mlx5e_priv *priv, struct mlx5_fs_chains *chains,
if (!ct_priv) if (!ct_priv)
goto err_alloc; goto err_alloc;
ct_priv->zone_mapping = mapping_create(sizeof(u16), 0, true); mapping_id = mlx5_query_nic_system_image_guid(dev);
ct_priv->zone_mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_ZONE,
sizeof(u16), 0, true);
if (IS_ERR(ct_priv->zone_mapping)) { if (IS_ERR(ct_priv->zone_mapping)) {
err = PTR_ERR(ct_priv->zone_mapping); err = PTR_ERR(ct_priv->zone_mapping);
goto err_mapping_zone; goto err_mapping_zone;
} }
ct_priv->labels_mapping = mapping_create(sizeof(u32) * 4, 0, true); ct_priv->labels_mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_LABELS,
sizeof(u32) * 4, 0, true);
if (IS_ERR(ct_priv->labels_mapping)) { if (IS_ERR(ct_priv->labels_mapping)) {
err = PTR_ERR(ct_priv->labels_mapping); err = PTR_ERR(ct_priv->labels_mapping);
goto err_mapping_labels; goto err_mapping_labels;
......
...@@ -4848,6 +4848,7 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv) ...@@ -4848,6 +4848,7 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv)
struct mlx5_core_dev *dev = priv->mdev; struct mlx5_core_dev *dev = priv->mdev;
struct mapping_ctx *chains_mapping; struct mapping_ctx *chains_mapping;
struct mlx5_chains_attr attr = {}; struct mlx5_chains_attr attr = {};
u64 mapping_id;
int err; int err;
mlx5e_mod_hdr_tbl_init(&tc->mod_hdr); mlx5e_mod_hdr_tbl_init(&tc->mod_hdr);
...@@ -4861,8 +4862,12 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv) ...@@ -4861,8 +4862,12 @@ int mlx5e_tc_nic_init(struct mlx5e_priv *priv)
lockdep_set_class(&tc->ht.mutex, &tc_ht_lock_key); lockdep_set_class(&tc->ht.mutex, &tc_ht_lock_key);
chains_mapping = mapping_create(sizeof(struct mlx5_mapped_obj), mapping_id = mlx5_query_nic_system_image_guid(dev);
MLX5E_TC_TABLE_CHAIN_TAG_MASK, true);
chains_mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_CHAIN,
sizeof(struct mlx5_mapped_obj),
MLX5E_TC_TABLE_CHAIN_TAG_MASK, true);
if (IS_ERR(chains_mapping)) { if (IS_ERR(chains_mapping)) {
err = PTR_ERR(chains_mapping); err = PTR_ERR(chains_mapping);
goto err_mapping; goto err_mapping;
...@@ -4951,6 +4956,7 @@ int mlx5e_tc_esw_init(struct rhashtable *tc_ht) ...@@ -4951,6 +4956,7 @@ int mlx5e_tc_esw_init(struct rhashtable *tc_ht)
struct mapping_ctx *mapping; struct mapping_ctx *mapping;
struct mlx5_eswitch *esw; struct mlx5_eswitch *esw;
struct mlx5e_priv *priv; struct mlx5e_priv *priv;
u64 mapping_id;
int err = 0; int err = 0;
uplink_priv = container_of(tc_ht, struct mlx5_rep_uplink_priv, tc_ht); uplink_priv = container_of(tc_ht, struct mlx5_rep_uplink_priv, tc_ht);
...@@ -4967,8 +4973,12 @@ int mlx5e_tc_esw_init(struct rhashtable *tc_ht) ...@@ -4967,8 +4973,12 @@ int mlx5e_tc_esw_init(struct rhashtable *tc_ht)
uplink_priv->esw_psample = mlx5_esw_sample_init(netdev_priv(priv->netdev)); uplink_priv->esw_psample = mlx5_esw_sample_init(netdev_priv(priv->netdev));
#endif #endif
mapping = mapping_create(sizeof(struct tunnel_match_key), mapping_id = mlx5_query_nic_system_image_guid(esw->dev);
TUNNEL_INFO_BITS_MASK, true);
mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_TUNNEL,
sizeof(struct tunnel_match_key),
TUNNEL_INFO_BITS_MASK, true);
if (IS_ERR(mapping)) { if (IS_ERR(mapping)) {
err = PTR_ERR(mapping); err = PTR_ERR(mapping);
goto err_tun_mapping; goto err_tun_mapping;
...@@ -4976,7 +4986,8 @@ int mlx5e_tc_esw_init(struct rhashtable *tc_ht) ...@@ -4976,7 +4986,8 @@ int mlx5e_tc_esw_init(struct rhashtable *tc_ht)
uplink_priv->tunnel_mapping = mapping; uplink_priv->tunnel_mapping = mapping;
/* 0xFFF is reserved for stack devices slow path table mark */ /* 0xFFF is reserved for stack devices slow path table mark */
mapping = mapping_create(sz_enc_opts, ENC_OPTS_BITS_MASK - 1, true); mapping = mapping_create_for_id(mapping_id, MAPPING_TYPE_TUNNEL_ENC_OPTS,
sz_enc_opts, ENC_OPTS_BITS_MASK - 1, true);
if (IS_ERR(mapping)) { if (IS_ERR(mapping)) {
err = PTR_ERR(mapping); err = PTR_ERR(mapping);
goto err_enc_opts_mapping; goto err_enc_opts_mapping;
......
...@@ -86,6 +86,14 @@ struct mlx5_mapped_obj { ...@@ -86,6 +86,14 @@ struct mlx5_mapped_obj {
#define esw_chains(esw) \ #define esw_chains(esw) \
((esw)->fdb_table.offloads.esw_chains_priv) ((esw)->fdb_table.offloads.esw_chains_priv)
enum {
MAPPING_TYPE_CHAIN,
MAPPING_TYPE_TUNNEL,
MAPPING_TYPE_TUNNEL_ENC_OPTS,
MAPPING_TYPE_LABELS,
MAPPING_TYPE_ZONE,
};
struct vport_ingress { struct vport_ingress {
struct mlx5_flow_table *acl; struct mlx5_flow_table *acl;
struct mlx5_flow_handle *allow_rule; struct mlx5_flow_handle *allow_rule;
......
...@@ -2787,6 +2787,7 @@ int esw_offloads_enable(struct mlx5_eswitch *esw) ...@@ -2787,6 +2787,7 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
struct mapping_ctx *reg_c0_obj_pool; struct mapping_ctx *reg_c0_obj_pool;
struct mlx5_vport *vport; struct mlx5_vport *vport;
unsigned long i; unsigned long i;
u64 mapping_id;
int err; int err;
if (MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, reformat) && if (MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, reformat) &&
...@@ -2810,9 +2811,13 @@ int esw_offloads_enable(struct mlx5_eswitch *esw) ...@@ -2810,9 +2811,13 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
if (err) if (err)
goto err_vport_metadata; goto err_vport_metadata;
reg_c0_obj_pool = mapping_create(sizeof(struct mlx5_mapped_obj), mapping_id = mlx5_query_nic_system_image_guid(esw->dev);
ESW_REG_C0_USER_DATA_METADATA_MASK,
true); reg_c0_obj_pool = mapping_create_for_id(mapping_id, MAPPING_TYPE_CHAIN,
sizeof(struct mlx5_mapped_obj),
ESW_REG_C0_USER_DATA_METADATA_MASK,
true);
if (IS_ERR(reg_c0_obj_pool)) { if (IS_ERR(reg_c0_obj_pool)) {
err = PTR_ERR(reg_c0_obj_pool); err = PTR_ERR(reg_c0_obj_pool);
goto err_pool; goto err_pool;
......
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