Skip to content

Commit

Permalink
Merge pull request #1142 from yishaih/mlx5_dr
Browse files Browse the repository at this point in the history
mlx5: DR, Add support for ConnectX-7 steering
  • Loading branch information
yishaih committed Feb 28, 2022
2 parents 847d02f + ac295e9 commit 3b87281
Show file tree
Hide file tree
Showing 12 changed files with 306 additions and 49 deletions.
1 change: 1 addition & 0 deletions providers/mlx5/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ rdma_shared_provider(mlx5 libmlx5.map
dr_ste.c
dr_ste_v0.c
dr_ste_v1.c
dr_ste_v2.c
dr_table.c
dr_send.c
dr_vports.c
Expand Down
2 changes: 1 addition & 1 deletion providers/mlx5/dr_action.c
Original file line number Diff line number Diff line change
Expand Up @@ -1168,7 +1168,7 @@ mlx5dv_dr_action_create_aso(struct mlx5dv_dr_domain *dmn,
struct mlx5dv_dr_action *action = NULL;

if (!dmn->info.supp_sw_steering ||
dmn->info.caps.sw_format_ver != MLX5_HW_CONNECTX_6DX) {
dmn->info.caps.sw_format_ver == MLX5_HW_CONNECTX_5) {
errno = EOPNOTSUPP;
return NULL;
}
Expand Down
10 changes: 6 additions & 4 deletions providers/mlx5/dr_dbg.c
Original file line number Diff line number Diff line change
Expand Up @@ -432,13 +432,14 @@ static int dr_dump_matcher_rx_tx(FILE *f, bool is_rx,
rec_type = is_rx ? DR_DUMP_REC_TYPE_MATCHER_RX :
DR_DUMP_REC_TYPE_MATCHER_TX;

ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,0x%" PRIx64 ",0x%" PRIx64 "\n",
ret = fprintf(f, "%d,0x%" PRIx64 ",0x%" PRIx64 ",%d,0x%" PRIx64 ",0x%" PRIx64 ",%d\n",
rec_type,
(uint64_t) (uintptr_t) matcher_rx_tx,
matcher_id,
matcher_rx_tx->num_of_builders,
dr_dump_icm_to_idx(matcher_rx_tx->s_htbl->chunk->icm_addr),
dr_dump_icm_to_idx(matcher_rx_tx->e_anchor->chunk->icm_addr));
dr_dump_icm_to_idx(matcher_rx_tx->e_anchor->chunk->icm_addr),
matcher_rx_tx->fixed_size ? matcher_rx_tx->s_htbl->chunk_size : -1);
if (ret < 0)
return ret;

Expand Down Expand Up @@ -675,11 +676,12 @@ static int dr_dump_domain_info_dev_attr(FILE *f, struct dr_domain_info *info,
{
int ret;

ret = fprintf(f, "%d,0x%" PRIx64 ",%u,%s\n",
ret = fprintf(f, "%d,0x%" PRIx64 ",%u,%s,%d\n",
DR_DUMP_REC_TYPE_DOMAIN_INFO_DEV_ATTR,
domain_id,
info->caps.vports.num_ports,
info->attr.orig_attr.fw_ver);
info->attr.orig_attr.fw_ver,
info->use_mqs);
if (ret < 0)
return ret;

Expand Down
26 changes: 17 additions & 9 deletions providers/mlx5/dr_domain.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,14 @@ static int dr_domain_query_fdb_caps(struct ibv_context *ctx,
return 0;
}

static bool dr_domain_caps_is_sw_owner_supported(bool sw_owner,
bool sw_owner_v2,
uint8_t sw_format_ver)
{
return sw_owner ||
(sw_owner_v2 && sw_format_ver <= MLX5_HW_CONNECTX_7);
}

static int dr_domain_caps_init(struct ibv_context *ctx,
struct mlx5dv_dr_domain *dmn)
{
Expand Down Expand Up @@ -279,9 +287,9 @@ static int dr_domain_caps_init(struct ibv_context *ctx,

switch (dmn->type) {
case MLX5DV_DR_DOMAIN_TYPE_NIC_RX:
if (!dmn->info.caps.rx_sw_owner &&
!(dmn->info.caps.rx_sw_owner_v2 &&
dmn->info.caps.sw_format_ver <= MLX5_HW_CONNECTX_6DX))
if (!dr_domain_caps_is_sw_owner_supported(dmn->info.caps.rx_sw_owner,
dmn->info.caps.rx_sw_owner_v2,
dmn->info.caps.sw_format_ver))
return 0;

dmn->info.supp_sw_steering = true;
Expand All @@ -290,9 +298,9 @@ static int dr_domain_caps_init(struct ibv_context *ctx,
dmn->info.rx.drop_icm_addr = dmn->info.caps.nic_rx_drop_address;
break;
case MLX5DV_DR_DOMAIN_TYPE_NIC_TX:
if (!dmn->info.caps.tx_sw_owner &&
!(dmn->info.caps.tx_sw_owner_v2 &&
dmn->info.caps.sw_format_ver <= MLX5_HW_CONNECTX_6DX))
if (!dr_domain_caps_is_sw_owner_supported(dmn->info.caps.tx_sw_owner,
dmn->info.caps.tx_sw_owner_v2,
dmn->info.caps.sw_format_ver))
return 0;

dmn->info.supp_sw_steering = true;
Expand All @@ -304,9 +312,9 @@ static int dr_domain_caps_init(struct ibv_context *ctx,
if (!dmn->info.caps.eswitch_manager)
return 0;

if (!dmn->info.caps.fdb_sw_owner &&
!(dmn->info.caps.fdb_sw_owner_v2 &&
dmn->info.caps.sw_format_ver <= MLX5_HW_CONNECTX_6DX))
if (!dr_domain_caps_is_sw_owner_supported(dmn->info.caps.fdb_sw_owner,
dmn->info.caps.fdb_sw_owner_v2,
dmn->info.caps.sw_format_ver))
return 0;

dmn->info.rx.type = DR_DOMAIN_NIC_TYPE_RX;
Expand Down
10 changes: 5 additions & 5 deletions providers/mlx5/dr_matcher.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ dr_mask_is_vxlan_gpe_set(struct dr_match_misc3 *misc3)
static bool
dr_matcher_supp_vxlan_gpe(struct dr_devx_caps *caps)
{
return (caps->sw_format_ver == MLX5_HW_CONNECTX_6DX) ||
return (caps->sw_format_ver >= MLX5_HW_CONNECTX_6DX) ||
(caps->flex_protocols & MLX5_FLEX_PARSER_VXLAN_GPE_ENABLED);
}

Expand Down Expand Up @@ -190,7 +190,7 @@ static bool dr_mask_is_tnl_geneve_tlv_opt(struct dr_match_param *mask,
static bool
dr_matcher_supp_tnl_geneve(struct dr_devx_caps *caps)
{
return (caps->sw_format_ver == MLX5_HW_CONNECTX_6DX) ||
return (caps->sw_format_ver >= MLX5_HW_CONNECTX_6DX) ||
(caps->flex_protocols & MLX5_FLEX_PARSER_GENEVE_ENABLED);
}

Expand Down Expand Up @@ -307,13 +307,13 @@ static bool dr_mask_is_tnl_gtpu_any(struct dr_match_param *mask,

static inline int dr_matcher_supp_icmp_v4(struct dr_devx_caps *caps)
{
return (caps->sw_format_ver == MLX5_HW_CONNECTX_6DX) ||
return (caps->sw_format_ver >= MLX5_HW_CONNECTX_6DX) ||
(caps->flex_protocols & MLX5_FLEX_PARSER_ICMP_V4_ENABLED);
}

static inline int dr_matcher_supp_icmp_v6(struct dr_devx_caps *caps)
{
return (caps->sw_format_ver == MLX5_HW_CONNECTX_6DX) ||
return (caps->sw_format_ver >= MLX5_HW_CONNECTX_6DX) ||
(caps->flex_protocols & MLX5_FLEX_PARSER_ICMP_V6_ENABLED);
}

Expand Down Expand Up @@ -704,7 +704,7 @@ static int dr_matcher_set_large_ste_builders(struct mlx5dv_dr_matcher *matcher,
struct mlx5dv_dr_domain *dmn = matcher->tbl->dmn;
int ret;

if (dmn->info.caps.sw_format_ver != MLX5_HW_CONNECTX_6DX ||
if (dmn->info.caps.sw_format_ver == MLX5_HW_CONNECTX_5 ||
!dmn->info.caps.definer_format_sup)
return ENOTSUP;

Expand Down
11 changes: 7 additions & 4 deletions providers/mlx5/dr_ste.c
Original file line number Diff line number Diff line change
Expand Up @@ -591,7 +591,8 @@ void dr_ste_set_actions_tx(struct dr_ste_ctx *ste_ctx,
struct dr_ste_actions_attr *attr,
uint32_t *added_stes)
{
ste_ctx->set_actions_tx(action_type_set, hw_ste_arr, attr, added_stes);
ste_ctx->set_actions_tx(action_type_set, ste_ctx->actions_caps,
hw_ste_arr, attr, added_stes);
}

void dr_ste_set_actions_rx(struct dr_ste_ctx *ste_ctx,
Expand All @@ -600,16 +601,16 @@ void dr_ste_set_actions_rx(struct dr_ste_ctx *ste_ctx,
struct dr_ste_actions_attr *attr,
uint32_t *added_stes)
{
ste_ctx->set_actions_rx(action_type_set, hw_ste_arr, attr, added_stes);
ste_ctx->set_actions_rx(action_type_set, ste_ctx->actions_caps,
hw_ste_arr, attr, added_stes);
}

const struct dr_ste_action_modify_field *
dr_ste_conv_modify_hdr_sw_field(struct dr_ste_ctx *ste_ctx,
struct dr_devx_caps *caps,
uint16_t sw_field)
{
return ste_ctx->get_action_hw_field(sw_field, caps);

return ste_ctx->get_action_hw_field(ste_ctx, sw_field, caps);
}

void dr_ste_set_action_set(struct dr_ste_ctx *ste_ctx,
Expand Down Expand Up @@ -1599,6 +1600,8 @@ struct dr_ste_ctx *dr_ste_get_ctx(uint8_t version)
return dr_ste_get_ctx_v0();
else if (version == MLX5_HW_CONNECTX_6DX)
return dr_ste_get_ctx_v1();
else if (version == MLX5_HW_CONNECTX_7)
return dr_ste_get_ctx_v2();

errno = EOPNOTSUPP;

Expand Down
8 changes: 7 additions & 1 deletion providers/mlx5/dr_ste.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,11 +220,15 @@ struct dr_ste_ctx {

/* Actions */
uint32_t actions_caps;
const struct dr_ste_action_modify_field *action_modify_field_arr;
size_t action_modify_field_arr_size;
void (*set_actions_rx)(uint8_t *action_type_set,
uint32_t actions_caps,
uint8_t *hw_ste_arr,
struct dr_ste_actions_attr *attr,
uint32_t *added_stes);
void (*set_actions_tx)(uint8_t *action_type_set,
uint32_t actions_caps,
uint8_t *hw_ste_arr,
struct dr_ste_actions_attr *attr,
uint32_t *added_stes);
Expand All @@ -245,7 +249,8 @@ struct dr_ste_ctx {
uint8_t src_hw_field,
uint8_t src_shifter);
const struct dr_ste_action_modify_field *
(*get_action_hw_field)(uint16_t sw_field,
(*get_action_hw_field)(struct dr_ste_ctx *ste_ctx,
uint16_t sw_field,
struct dr_devx_caps *caps);
int (*set_action_decap_l3_list)(void *data, uint32_t data_sz,
uint8_t *hw_action, uint32_t hw_action_sz,
Expand All @@ -260,5 +265,6 @@ struct dr_ste_ctx {

struct dr_ste_ctx *dr_ste_get_ctx_v0(void);
struct dr_ste_ctx *dr_ste_get_ctx_v1(void);
struct dr_ste_ctx *dr_ste_get_ctx_v2(void);

#endif
11 changes: 8 additions & 3 deletions providers/mlx5/dr_ste_v0.c
Original file line number Diff line number Diff line change
Expand Up @@ -451,6 +451,7 @@ static inline void dr_ste_v0_arr_init_next(uint8_t **last_ste,
}

static void dr_ste_v0_set_actions_tx(uint8_t *action_type_set,
uint32_t actions_caps,
uint8_t *last_ste,
struct dr_ste_actions_attr *attr,
uint32_t *added_stes)
Expand Down Expand Up @@ -519,6 +520,7 @@ static void dr_ste_v0_set_actions_tx(uint8_t *action_type_set,
}

static void dr_ste_v0_set_actions_rx(uint8_t *action_type_set,
uint32_t actions_caps,
uint8_t *last_ste,
struct dr_ste_actions_attr *attr,
uint32_t *added_stes)
Expand Down Expand Up @@ -718,14 +720,15 @@ dr_ste_v0_set_action_decap_l3_list(void *data, uint32_t data_sz,
}

static const struct dr_ste_action_modify_field
*dr_ste_v0_get_action_hw_field(uint16_t sw_field, struct dr_devx_caps *caps)
*dr_ste_v0_get_action_hw_field(struct dr_ste_ctx *ste_ctx,
uint16_t sw_field, struct dr_devx_caps *caps)
{
const struct dr_ste_action_modify_field *hw_field;

if (sw_field >= ARRAY_SIZE(dr_ste_v0_action_modify_field_arr))
if (sw_field >= ste_ctx->action_modify_field_arr_size)
goto not_found;

hw_field = &dr_ste_v0_action_modify_field_arr[sw_field];
hw_field = &ste_ctx->action_modify_field_arr[sw_field];
if (!hw_field->end && !hw_field->start)
goto not_found;

Expand Down Expand Up @@ -1911,6 +1914,8 @@ static struct dr_ste_ctx ste_ctx_v0 = {
.set_hit_gvmi = &dr_ste_v0_set_hit_gvmi,
/* Actions */
.actions_caps = DR_STE_CTX_ACTION_CAP_NONE,
.action_modify_field_arr = dr_ste_v0_action_modify_field_arr,
.action_modify_field_arr_size = ARRAY_SIZE(dr_ste_v0_action_modify_field_arr),
.set_actions_rx = &dr_ste_v0_set_actions_rx,
.set_actions_tx = &dr_ste_v0_set_actions_tx,
.set_action_set = &dr_ste_v0_set_action_set,
Expand Down

0 comments on commit 3b87281

Please sign in to comment.