Blame SOURCES/0001-mlx5-DR-Avoid-ICM-depletion-on-multiple-domains.patch

3bcb62
From dadee6df65387ba0fea0d78cc9c99af0350d3c37 Mon Sep 17 00:00:00 2001
3bcb62
From: Alex Vesker <valex@nvidia.com>
3bcb62
Date: Tue, 8 Dec 2020 18:41:02 +0200
3bcb62
Subject: [PATCH] mlx5: DR, Avoid ICM depletion on multiple domains
3bcb62
3bcb62
[ Upstream commit 951fdedd1ad580a0281e9bca22477942f5256c69 ]
3bcb62
3bcb62
When running multiple domains on the same PF, large ICM allocation can
3bcb62
deplete all of the resource and lead to failures on other domains, this
3bcb62
was seen on ConnectX6DX devices with limited size of action ICM (modify
3bcb62
header).
3bcb62
The solution is take into consideration the total available resource
3bcb62
size.
3bcb62
3bcb62
Fixes: c86f095752f2 ("mlx5: DR, Increase ICM action memory allocation size up-to 8MB")
3bcb62
Signed-off-by: Alex Vesker <valex@nvidia.com>
3bcb62
Signed-off-by: Erez Shitrit <erezsh@nvidia.com>
3bcb62
Signed-off-by: Yishai Hadas <yishaih@nvidia.com>
3bcb62
Signed-off-by: Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com>
3bcb62
---
3bcb62
 providers/mlx5/dr_domain.c | 26 ++++++++++++++++++++------
3bcb62
 1 file changed, 20 insertions(+), 6 deletions(-)
3bcb62
3bcb62
diff --git a/providers/mlx5/dr_domain.c b/providers/mlx5/dr_domain.c
3bcb62
index 0a4b565ef85b..1a999965cb9b 100644
3bcb62
--- a/providers/mlx5/dr_domain.c
3bcb62
+++ b/providers/mlx5/dr_domain.c
3bcb62
@@ -283,24 +283,38 @@ static void dr_domain_caps_uninit(struct mlx5dv_dr_domain *dmn)
3bcb62
 
3bcb62
 static int dr_domain_check_icm_memory_caps(struct mlx5dv_dr_domain *dmn)
3bcb62
 {
3bcb62
+	uint32_t max_req_bytes_log, max_req_chunks_log;
3bcb62
+
3bcb62
+	/* Check for minimum ICM log byte size requirements */
3bcb62
 	if (dmn->info.caps.log_modify_hdr_icm_size < DR_CHUNK_SIZE_4K +
3bcb62
 	    DR_MODIFY_ACTION_LOG_SIZE) {
3bcb62
 		errno = ENOMEM;
3bcb62
 		return errno;
3bcb62
 	}
3bcb62
 
3bcb62
-	dmn->info.max_log_action_icm_sz = min_t(uint32_t,
3bcb62
-						DR_CHUNK_SIZE_1024K,
3bcb62
-						dmn->info.caps.log_modify_hdr_icm_size
3bcb62
-						- DR_MODIFY_ACTION_LOG_SIZE);
3bcb62
-
3bcb62
 	if (dmn->info.caps.log_icm_size < DR_CHUNK_SIZE_1024K +
3bcb62
 	    DR_STE_LOG_SIZE) {
3bcb62
 		errno = ENOMEM;
3bcb62
 		return errno;
3bcb62
 	}
3bcb62
 
3bcb62
-	dmn->info.max_log_sw_icm_sz = DR_CHUNK_SIZE_1024K;
3bcb62
+	/* Current code tries to use large allocations to improve our internal
3bcb62
+	 * memory allocation (less DMs and less FW calls).
3bcb62
+	 * When creating multiple domains on the same PF, we want to make sure
3bcb62
+	 * we don't deplete all of the ICM resources on a single domain.
3bcb62
+	 * To provide some functionality with a limited resource we will use
3bcb62
+	 * up to 1/8 of the total available size allowing opening a domain
3bcb62
+	 * of each type.
3bcb62
+	 */
3bcb62
+	max_req_bytes_log = dmn->info.caps.log_modify_hdr_icm_size - 3;
3bcb62
+	max_req_chunks_log = max_req_bytes_log - DR_MODIFY_ACTION_LOG_SIZE;
3bcb62
+	dmn->info.max_log_action_icm_sz =
3bcb62
+		min_t(uint32_t, DR_CHUNK_SIZE_1024K, max_req_chunks_log);
3bcb62
+
3bcb62
+	max_req_bytes_log = dmn->info.caps.log_icm_size - 3;
3bcb62
+	max_req_chunks_log = max_req_bytes_log - DR_STE_LOG_SIZE;
3bcb62
+	dmn->info.max_log_sw_icm_sz =
3bcb62
+		min_t(uint32_t, DR_CHUNK_SIZE_1024K, max_req_chunks_log);
3bcb62
 
3bcb62
 	return 0;
3bcb62
 }
3bcb62
-- 
3bcb62
2.25.4
3bcb62