Blame SOURCES/0002-mlx5-Report-Multi-Packet-RQ-capabilities-through-mlx.patch

6698ac
From 868a69e7de67e10fc96436ec41dd9e0343053581 Mon Sep 17 00:00:00 2001
6698ac
From: Noa Osherovich <noaos@mellanox.com>
6698ac
Date: Thu, 3 Aug 2017 10:00:14 +0300
6698ac
Subject: [PATCH rdma-core 2/3] mlx5: Report Multi-Packet RQ capabilities
6698ac
 through mlx5 direct verbs
6698ac
6698ac
A Multi-Packet RQ is a receive queue where multiple packets are
6698ac
written to the same WQE. Each message starts in the beginning of a
6698ac
stride. The total size of the scatter elements of each WQE is
6698ac
determined upon RQ creation and all the posted WQEs should meet the
6698ac
determined size.
6698ac
6698ac
A Multi-Packet RQ reduces the number of needed post-recv operations
6698ac
thus increasing performance.
6698ac
6698ac
It reduces memory footprint by allowing each packet to consume a
6698ac
different number of strides instead of the whole WR.
6698ac
6698ac
Signed-off-by: Noa Osherovich <noaos@mellanox.com>
6698ac
Reviewed-by: Yishai Hadas <yishaih@mellanox.com>
6698ac
(cherry picked from commit ec8ec52698c7cbd6d06bd8f3e54b673a52cb4d30)
6698ac
---
6698ac
 providers/mlx5/man/mlx5dv_query_device.3 | 19 +++++++++++++++++++
6698ac
 providers/mlx5/mlx5-abi.h                | 11 +++++++++++
6698ac
 providers/mlx5/mlx5.c                    |  5 +++++
6698ac
 providers/mlx5/mlx5.h                    |  1 +
6698ac
 providers/mlx5/mlx5dv.h                  | 13 ++++++++++++-
6698ac
 providers/mlx5/verbs.c                   |  1 +
6698ac
 6 files changed, 49 insertions(+), 1 deletion(-)
6698ac
6698ac
diff --git a/providers/mlx5/man/mlx5dv_query_device.3 b/providers/mlx5/man/mlx5dv_query_device.3
6698ac
index c2fe9a3e..bb047454 100644
6698ac
--- a/providers/mlx5/man/mlx5dv_query_device.3
6698ac
+++ b/providers/mlx5/man/mlx5dv_query_device.3
6698ac
@@ -21,6 +21,25 @@ of the internal hardware structures that mlx5dv.h represents. Additions of new f
6698ac
 structures are handled by comp_mask field.
6698ac
 .PP
6698ac
 .nf
6698ac
+struct mlx5dv_sw_parsing_caps {
6698ac
+.in +8
6698ac
+uint32_t sw_parsing_offloads; /* Use enum mlx5dv_sw_parsing_offloads */
6698ac
+uint32_t supported_qpts;
6698ac
+.in -8
6698ac
+};
6698ac
+.PP
6698ac
+.nf
6698ac
+struct mlx5dv_striding_rq_caps {
6698ac
+.in +8
6698ac
+uint32_t min_single_stride_log_num_of_bytes; /* min log size of each stride */
6698ac
+uint32_t max_single_stride_log_num_of_bytes; /* max log size of each stride */
6698ac
+uint32_t min_single_wqe_log_num_of_strides; /* min log number of strides per WQE */
6698ac
+uint32_t max_single_wqe_log_num_of_strides; /* max log number of strides per WQE */
6698ac
+uint32_t supported_qpts;
6698ac
+.in -8
6698ac
+};
6698ac
+.PP
6698ac
+.nf
6698ac
 struct mlx5dv_context {
6698ac
 .in +8
6698ac
 uint8_t         version;
6698ac
diff --git a/providers/mlx5/mlx5-abi.h b/providers/mlx5/mlx5-abi.h
6698ac
index bce9e559..da7d54f2 100644
6698ac
--- a/providers/mlx5/mlx5-abi.h
6698ac
+++ b/providers/mlx5/mlx5-abi.h
6698ac
@@ -279,6 +279,16 @@ enum mlx5_mpw_caps {
6698ac
 	MLX5_SUPPORT_EMPW	= 1 << 2,
6698ac
 };
6698ac
 
6698ac
+enum mlx5_query_dev_resp_flags {
6698ac
+	MLX5_QUERY_DEV_RESP_FLAGS_CQE_128B_COMP	= 1 << 0,
6698ac
+	MLX5_QUERY_DEV_RESP_FLAGS_CQE_128B_PAD	= 1 << 1,
6698ac
+};
6698ac
+
6698ac
+struct mlx5_striding_rq_caps {
6698ac
+	struct mlx5dv_striding_rq_caps	caps;
6698ac
+	__u32				reserved;
6698ac
+};
6698ac
+
6698ac
 struct mlx5_query_device_ex_resp {
6698ac
 	struct ibv_query_device_resp_ex ibv_resp;
6698ac
 	__u32				comp_mask;
6698ac
@@ -289,6 +299,7 @@ struct mlx5_query_device_ex_resp {
6698ac
 	struct mlx5_packet_pacing_caps	packet_pacing_caps;
6698ac
 	__u32				support_multi_pkt_send_wqe;
6698ac
 	__u32				reserved;
6698ac
+	struct mlx5_striding_rq_caps	striding_rq_caps;
6698ac
 };
6698ac
 
6698ac
 #endif /* MLX5_ABI_H */
6698ac
diff --git a/providers/mlx5/mlx5.c b/providers/mlx5/mlx5.c
6698ac
index e7adf148..88287536 100644
6698ac
--- a/providers/mlx5/mlx5.c
6698ac
+++ b/providers/mlx5/mlx5.c
6698ac
@@ -636,6 +636,11 @@ int mlx5dv_query_device(struct ibv_context *ctx_in,
6698ac
 	if (mctx->vendor_cap_flags & MLX5_VENDOR_CAP_FLAGS_ENHANCED_MPW)
6698ac
 		attrs_out->flags |= MLX5DV_CONTEXT_FLAGS_ENHANCED_MPW;
6698ac
 
6698ac
+	if (attrs_out->comp_mask & MLX5DV_CONTEXT_MASK_STRIDING_RQ) {
6698ac
+		attrs_out->striding_rq_caps = mctx->striding_rq_caps;
6698ac
+		comp_mask_out |= MLX5DV_CONTEXT_MASK_STRIDING_RQ;
6698ac
+	}
6698ac
+
6698ac
 	attrs_out->comp_mask = comp_mask_out;
6698ac
 
6698ac
 	return 0;
6698ac
diff --git a/providers/mlx5/mlx5.h b/providers/mlx5/mlx5.h
6698ac
index 46fce282..1e8b45be 100644
6698ac
--- a/providers/mlx5/mlx5.h
6698ac
+++ b/providers/mlx5/mlx5.h
6698ac
@@ -272,6 +272,7 @@ struct mlx5_context {
6698ac
 	uint64_t			vendor_cap_flags; /* Use enum mlx5_vendor_cap_flags */
6698ac
 	struct mlx5dv_cqe_comp_caps	cqe_comp_caps;
6698ac
 	struct mlx5dv_ctx_allocators	extern_alloc;
6698ac
+	struct mlx5dv_striding_rq_caps	striding_rq_caps;
6698ac
 };
6698ac
 
6698ac
 struct mlx5_bitmap {
6698ac
diff --git a/providers/mlx5/mlx5dv.h b/providers/mlx5/mlx5dv.h
6698ac
index ffe2c555..0a7fe4d6 100644
6698ac
--- a/providers/mlx5/mlx5dv.h
6698ac
+++ b/providers/mlx5/mlx5dv.h
6698ac
@@ -58,7 +58,9 @@ enum {
6698ac
 
6698ac
 enum mlx5dv_context_comp_mask {
6698ac
 	MLX5DV_CONTEXT_MASK_CQE_COMPRESION	= 1 << 0,
6698ac
-	MLX5DV_CONTEXT_MASK_RESERVED		= 1 << 1,
6698ac
+	MLX5DV_CONTEXT_MASK_SWP			= 1 << 1,
6698ac
+	MLX5DV_CONTEXT_MASK_STRIDING_RQ		= 1 << 2,
6698ac
+	MLX5DV_CONTEXT_MASK_RESERVED		= 1 << 3,
6698ac
 };
6698ac
 
6698ac
 struct mlx5dv_cqe_comp_caps {
6698ac
@@ -66,6 +68,14 @@ struct mlx5dv_cqe_comp_caps {
6698ac
 	uint32_t supported_format; /* enum mlx5dv_cqe_comp_res_format */
6698ac
 };
6698ac
 
6698ac
+struct mlx5dv_striding_rq_caps {
6698ac
+	uint32_t min_single_stride_log_num_of_bytes;
6698ac
+	uint32_t max_single_stride_log_num_of_bytes;
6698ac
+	uint32_t min_single_wqe_log_num_of_strides;
6698ac
+	uint32_t max_single_wqe_log_num_of_strides;
6698ac
+	uint32_t supported_qpts;
6698ac
+};
6698ac
+
6698ac
 /*
6698ac
  * Direct verbs device-specific attributes
6698ac
  */
6698ac
@@ -74,6 +84,7 @@ struct mlx5dv_context {
6698ac
 	uint64_t	flags;
6698ac
 	uint64_t	comp_mask;
6698ac
 	struct mlx5dv_cqe_comp_caps	cqe_comp_caps;
6698ac
+	struct mlx5dv_striding_rq_caps striding_rq_caps;
6698ac
 };
6698ac
 
6698ac
 enum mlx5dv_context_flags {
6698ac
diff --git a/providers/mlx5/verbs.c b/providers/mlx5/verbs.c
6698ac
index 6506bc36..e9414c64 100644
6698ac
--- a/providers/mlx5/verbs.c
6698ac
+++ b/providers/mlx5/verbs.c
6698ac
@@ -2003,6 +2003,7 @@ int mlx5_query_device_ex(struct ibv_context *context,
6698ac
 		mctx->vendor_cap_flags |= MLX5_VENDOR_CAP_FLAGS_ENHANCED_MPW;
6698ac
 
6698ac
 	mctx->cqe_comp_caps = resp.cqe_comp_caps;
6698ac
+	mctx->striding_rq_caps = resp.striding_rq_caps.caps;
6698ac
 
6698ac
 	major     = (raw_fw_ver >> 32) & 0xffff;
6698ac
 	minor     = (raw_fw_ver >> 16) & 0xffff;
6698ac
-- 
6698ac
2.12.1
6698ac