[PATCH rdma-core 3/4] mlx5: Introduce flow matcher and its related DV APIs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Introduce mlx5 flow matcher object and its related DV APIs.
The flow matcher object matches to the device specification and enables
creating a flow object that supports the device options.

Downstream patches from this series use the matcher object as part of
flow creation.

Signed-off-by: Yishai Hadas <yishaih@xxxxxxxxxxxx>
---
 debian/ibverbs-providers.symbols |  3 ++
 providers/mlx5/CMakeLists.txt    |  2 +-
 providers/mlx5/libmlx5.map       |  6 ++++
 providers/mlx5/mlx5.h            |  5 +++
 providers/mlx5/mlx5dv.h          | 22 +++++++++++++
 providers/mlx5/verbs.c           | 69 ++++++++++++++++++++++++++++++++++++++++
 6 files changed, 106 insertions(+), 1 deletion(-)

diff --git a/debian/ibverbs-providers.symbols b/debian/ibverbs-providers.symbols
index 3143f6f..f0c54f8 100644
--- a/debian/ibverbs-providers.symbols
+++ b/debian/ibverbs-providers.symbols
@@ -11,6 +11,7 @@ libmlx5.so.1 ibverbs-providers #MINVER#
  MLX5_1.3@MLX5_1.3 16
  MLX5_1.4@MLX5_1.4 17
  MLX5_1.5@MLX5_1.5 18
+ MLX5_1.6@MLX5_1.6 20
  mlx5dv_init_obj@MLX5_1.0 13
  mlx5dv_init_obj@MLX5_1.2 15
  mlx5dv_query_device@MLX5_1.0 13
@@ -20,3 +21,5 @@ libmlx5.so.1 ibverbs-providers #MINVER#
  mlx5dv_create_wq@MLX5_1.3 16
  mlx5dv_get_clock_info@MLX5_1.4 17
  mlx5dv_create_flow_action_esp@MLX5_1.5 18
+ mlx5dv_create_flow_matcher@MLX5_1.6 20
+ mlx5dv_destroy_flow_matcher@MLX5_1.6 20
diff --git a/providers/mlx5/CMakeLists.txt b/providers/mlx5/CMakeLists.txt
index 5a4b47f..7328c56 100644
--- a/providers/mlx5/CMakeLists.txt
+++ b/providers/mlx5/CMakeLists.txt
@@ -11,7 +11,7 @@ if (MLX5_MW_DEBUG)
 endif()
 
 rdma_shared_provider(mlx5 libmlx5.map
-  1 1.5.${PACKAGE_VERSION}
+  1 1.6.${PACKAGE_VERSION}
   buf.c
   cq.c
   dbrec.c
diff --git a/providers/mlx5/libmlx5.map b/providers/mlx5/libmlx5.map
index 410cc0e..8538f5e 100644
--- a/providers/mlx5/libmlx5.map
+++ b/providers/mlx5/libmlx5.map
@@ -33,3 +33,9 @@ MLX5_1.5 {
 	global:
 		mlx5dv_create_flow_action_esp;
 } MLX5_1.4;
+
+MLX5_1.6 {
+        global:
+		mlx5dv_create_flow_matcher;
+		mlx5dv_destroy_flow_matcher;
+} MLX5_1.5;
diff --git a/providers/mlx5/mlx5.h b/providers/mlx5/mlx5.h
index 16ce2cc..16404a8 100644
--- a/providers/mlx5/mlx5.h
+++ b/providers/mlx5/mlx5.h
@@ -557,6 +557,11 @@ struct mlx5_flow {
 	struct mlx5_counters *mcounters;
 };
 
+struct mlx5dv_flow_matcher {
+	struct ibv_context *context;
+	uint32_t handle;
+};
+
 static inline int mlx5_ilog2(int n)
 {
 	int t;
diff --git a/providers/mlx5/mlx5dv.h b/providers/mlx5/mlx5dv.h
index acf0a13..9710133 100644
--- a/providers/mlx5/mlx5dv.h
+++ b/providers/mlx5/mlx5dv.h
@@ -194,6 +194,28 @@ struct mlx5dv_flow_action_esp {
 	uint32_t action_flags; /* Use enum mlx5dv_flow_action_flags */
 };
 
+struct mlx5dv_flow_match_parameters {
+	size_t match_sz;
+	uint64_t match_buf[]; /* Device spec format */
+};
+
+struct mlx5dv_flow_matcher_attr {
+	enum ibv_flow_attr_type type;
+	uint32_t flags; /* From enum ibv_flow_flags */
+	uint16_t priority;
+	uint8_t match_criteria_enable; /* Device spec format */
+	struct mlx5dv_flow_match_parameters *match_mask;
+	uint64_t comp_mask;
+};
+
+struct mlx5dv_flow_matcher;
+
+struct mlx5dv_flow_matcher *
+mlx5dv_create_flow_matcher(struct ibv_context *context,
+			   struct mlx5dv_flow_matcher_attr *matcher_attr);
+
+int mlx5dv_destroy_flow_matcher(struct mlx5dv_flow_matcher *matcher);
+
 struct ibv_flow_action *mlx5dv_create_flow_action_esp(struct ibv_context *ctx,
 						      struct ibv_flow_action_esp_attr *esp,
 						      struct mlx5dv_flow_action_esp *mlx5_attr);
diff --git a/providers/mlx5/verbs.c b/providers/mlx5/verbs.c
index e95cdb8..2654c45 100644
--- a/providers/mlx5/verbs.c
+++ b/providers/mlx5/verbs.c
@@ -3542,3 +3542,72 @@ int mlx5_read_counters(struct ibv_counters *counters,
 				     NULL);
 
 }
+
+struct mlx5dv_flow_matcher *
+mlx5dv_create_flow_matcher(struct ibv_context *context,
+			   struct mlx5dv_flow_matcher_attr *attr)
+{
+	DECLARE_COMMAND_BUFFER_LINK(cmd, MLX5_IB_OBJECT_FLOW_MATCHER,
+				    MLX5_IB_METHOD_FLOW_MATCHER_CREATE,
+				    4,
+				    NULL);
+	struct mlx5dv_flow_matcher *flow_matcher;
+	struct ib_uverbs_attr *handle;
+	int ret;
+
+	if (!check_comp_mask(attr->comp_mask, 0)) {
+		errno = EOPNOTSUPP;
+		return NULL;
+	}
+
+	flow_matcher = calloc(1, sizeof(*flow_matcher));
+	if (!flow_matcher) {
+		errno = ENOMEM;
+		return NULL;
+	}
+
+	if (attr->type !=  IBV_FLOW_ATTR_NORMAL) {
+		errno = EOPNOTSUPP;
+		goto err;
+	}
+
+	handle = fill_attr_out_obj(cmd, MLX5_IB_ATTR_FLOW_MATCHER_CREATE_HANDLE);
+	fill_attr_in(cmd, MLX5_IB_ATTR_FLOW_MATCHER_MATCH_MASK,
+		     attr->match_mask->match_buf,
+		     attr->match_mask->match_sz);
+	fill_attr_in(cmd, MLX5_IB_ATTR_FLOW_MATCHER_MATCH_CRITERIA,
+		     &attr->match_criteria_enable, sizeof(attr->match_criteria_enable));
+	fill_attr_in_enum(cmd, MLX5_IB_ATTR_FLOW_MATCHER_FLOW_TYPE,
+			  IBV_FLOW_ATTR_NORMAL, &attr->priority,
+			  sizeof(attr->priority));
+
+	ret = execute_ioctl(context, cmd);
+	if (ret)
+		goto err;
+
+	flow_matcher->context = context;
+	flow_matcher->handle = read_attr_obj(MLX5_IB_ATTR_FLOW_MATCHER_CREATE_HANDLE, handle);
+
+	return flow_matcher;
+
+err:
+	free(flow_matcher);
+	return NULL;
+}
+
+int mlx5dv_destroy_flow_matcher(struct mlx5dv_flow_matcher *flow_matcher)
+{
+	DECLARE_COMMAND_BUFFER(cmd, MLX5_IB_OBJECT_FLOW_MATCHER,
+			       MLX5_IB_METHOD_FLOW_MATCHER_DESTROY,
+			       1);
+	int ret;
+
+	fill_attr_in_obj(cmd, MLX5_IB_ATTR_FLOW_MATCHER_DESTROY_HANDLE, flow_matcher->handle);
+	ret = execute_ioctl(flow_matcher->context, cmd);
+
+	if (ret)
+		return ret;
+
+	free(flow_matcher);
+	return 0;
+}
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux