common/mlx5: add glue for sample action
authorJiawei Wang <jiaweiw@nvidia.com>
Tue, 13 Oct 2020 14:11:43 +0000 (17:11 +0300)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 16 Oct 2020 17:48:18 +0000 (19:48 +0200)
The new DR sample action is supported since OFED version
5.1.2 or rdma-core version v32.

MLX5 PMD adds the rdma-core command in glue to create this action.

Sample action is used for creating the sample object to implement
the sampling/mirroring function.

Signed-off-by: Jiawei Wang <jiaweiw@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/common/mlx5/linux/meson.build
drivers/common/mlx5/linux/mlx5_glue.c
drivers/common/mlx5/linux/mlx5_glue.h
drivers/common/mlx5/mlx5_prm.h

index 48e8ad6..1aa137d 100644 (file)
@@ -172,6 +172,8 @@ has_sym_args = [
        'RDMA_NLDEV_ATTR_NDEV_INDEX' ],
        [ 'HAVE_MLX5_DR_FLOW_DUMP', 'infiniband/mlx5dv.h',
        'mlx5dv_dump_dr_domain'],
+       [ 'HAVE_MLX5_DR_CREATE_ACTION_FLOW_SAMPLE', 'infiniband/mlx5dv.h',
+       'mlx5dv_dr_action_create_flow_sampler'],
        [ 'HAVE_MLX5DV_DR_MEM_RECLAIM', 'infiniband/mlx5dv.h',
        'mlx5dv_dr_domain_set_reclaim_device_memory'],
        [ 'HAVE_DEVLINK', 'linux/devlink.h', 'DEVLINK_GENL_NAME' ],
index fcf03e8..771a47c 100644 (file)
@@ -1063,6 +1063,19 @@ mlx5_glue_dr_dump_domain(FILE *file, void *domain)
 #endif
 }
 
+static void *
+mlx5_glue_dr_create_flow_action_sampler(
+                       struct mlx5dv_dr_flow_sampler_attr *attr)
+{
+#ifdef HAVE_MLX5_DR_CREATE_ACTION_FLOW_SAMPLE
+       return mlx5dv_dr_action_create_flow_sampler(attr);
+#else
+       (void)attr;
+       errno = ENOTSUP;
+       return NULL;
+#endif
+}
+
 static int
 mlx5_glue_devx_query_eqn(struct ibv_context *ctx, uint32_t cpus,
                         uint32_t *eqn)
@@ -1339,6 +1352,8 @@ const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue) {
        .devx_port_query = mlx5_glue_devx_port_query,
        .dr_dump_domain = mlx5_glue_dr_dump_domain,
        .dr_reclaim_domain_memory = mlx5_glue_dr_reclaim_domain_memory,
+       .dr_create_flow_action_sampler =
+               mlx5_glue_dr_create_flow_action_sampler,
        .devx_query_eqn = mlx5_glue_devx_query_eqn,
        .devx_create_event_channel = mlx5_glue_devx_create_event_channel,
        .devx_destroy_event_channel = mlx5_glue_devx_destroy_event_channel,
index 734ace2..a77d239 100644 (file)
@@ -77,6 +77,7 @@ struct mlx5dv_devx_async_cmd_hdr;
 #ifndef HAVE_MLX5DV_DR
 enum  mlx5dv_dr_domain_type { unused, };
 struct mlx5dv_dr_domain;
+struct mlx5dv_dr_action;
 #endif
 
 #ifndef HAVE_MLX5DV_DR_DEVX_PORT
@@ -87,6 +88,16 @@ struct mlx5dv_devx_port;
 struct mlx5dv_dr_flow_meter_attr;
 #endif
 
+#ifndef HAVE_MLX5_DR_CREATE_ACTION_FLOW_SAMPLE
+struct mlx5dv_dr_flow_sampler_attr {
+       uint32_t sample_ratio;
+       void *default_next_table;
+       size_t num_sample_actions;
+       struct mlx5dv_dr_action **sample_actions;
+       uint64_t action;
+};
+#endif
+
 #ifndef HAVE_IBV_DEVX_EVENT
 struct mlx5dv_devx_event_channel { int fd; };
 struct mlx5dv_devx_async_event_hdr;
@@ -309,6 +320,8 @@ struct mlx5_glue {
                                         const void *pp_context,
                                         uint32_t flags);
        void (*dv_free_pp)(struct mlx5dv_pp *pp);
+       void *(*dr_create_flow_action_sampler)
+                       (struct mlx5dv_dr_flow_sampler_attr *attr);
 };
 
 extern const struct mlx5_glue *mlx5_glue;
index 20f2fcc..afefa39 100644 (file)
@@ -1479,6 +1479,16 @@ union mlx5_ifc_hca_cap_union_bits {
        u8 reserved_at_0[0x8000];
 };
 
+struct mlx5_ifc_set_action_in_bits {
+       u8 action_type[0x4];
+       u8 field[0xc];
+       u8 reserved_at_10[0x3];
+       u8 offset[0x5];
+       u8 reserved_at_18[0x3];
+       u8 length[0x5];
+       u8 data[0x20];
+};
+
 struct mlx5_ifc_query_hca_cap_out_bits {
        u8 status[0x8];
        u8 reserved_at_8[0x18];