[PATCH i-g-t] tests/amdgpu: fix concurrent queue test issue

Jesse.zhang@amd.com jesse.zhang at amd.com
Thu Sep 5 08:20:27 UTC 2024


When running with parameter --device on multiple cards simultaneously.
All queue test processes will share "/queue_reset_shm",which will create conflicts.
such as:
sudo ./tests/amdgpu/amd_queue_reset --device drm:/dev/dri/card0
sudo ./tests/amdgpu/amd_queue_reset --device drm:/dev/dri/card1

To solve this problem. It should open a unique shared memory for different devices.

Signed-off-by: Jesse Zhang <jesse.zhang at amd.com>
---
 tests/amdgpu/amd_queue_reset.c | 44 +++++++++++++++++++++++++++-------
 1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/tests/amdgpu/amd_queue_reset.c b/tests/amdgpu/amd_queue_reset.c
index b257ec3c0..4b26b86dc 100644
--- a/tests/amdgpu/amd_queue_reset.c
+++ b/tests/amdgpu/amd_queue_reset.c
@@ -32,7 +32,6 @@
 
 #define SHARED_CHILD_DESCRIPTOR 3
 
-#define SHARED_MEM_NAME  "/queue_reset_shm"
 #define TEST_TIMEOUT 100 //100 seconds
 
 enum  process_type {
@@ -349,7 +348,7 @@ static void set_next_test_to_skip(struct shmbuf *sh_mem)
 }
 
 static int
-shared_mem_destroy(struct shmbuf *shmp, int shm_fd, bool unmap)
+shared_mem_destroy(struct shmbuf *shmp, int shm_fd, bool unmap, char shm_name[256])
 {
 	int ret = 0;
 
@@ -363,20 +362,20 @@ shared_mem_destroy(struct shmbuf *shmp, int shm_fd, bool unmap)
 	if (shm_fd > 0)
 		close(shm_fd);
 
-	shm_unlink(SHARED_MEM_NAME);
+	shm_unlink(shm_name);
 
 	return ret;
 }
 
 static int
-shared_mem_create(struct shmbuf **ppbuf)
+shared_mem_create(struct shmbuf **ppbuf, char shm_name[256])
 {
 	int shm_fd = -1;
 	struct shmbuf *shmp = NULL;
 	bool unmap = false;
 
 	// Create a shared memory object
-	shm_fd = shm_open(SHARED_MEM_NAME, O_CREAT | O_RDWR, 0666);
+	shm_fd = shm_open(shm_name, O_CREAT | O_RDWR, 0666);
 	if (shm_fd == -1)
 		goto error;
 
@@ -414,7 +413,7 @@ shared_mem_create(struct shmbuf **ppbuf)
 	return shm_fd;
 
 error:
-	shared_mem_destroy(shmp,  shm_fd,  unmap);
+	shared_mem_destroy(shmp,  shm_fd,  unmap, shm_name);
 	return shm_fd;
 }
 
@@ -877,6 +876,29 @@ is_run_subtest_parameter_found(int argc, char **argv)
 	return ret;
 }
 
+#define ONDEVICE	"--device"
+static int
+is_run_device_parameter_found(int argc, char **argv)
+{
+	int i;
+	int res = 0;
+	char *p = NULL;
+
+	for (i = 1; i < argc; i++) {
+		if (strcmp(ONDEVICE, argv[i]) == 0) {
+			/* Get the sum for a specific device as a unique identifier */
+			p = argv[i+1];
+			while(*p){
+			  res += *p;
+			  p++;
+			}
+			break;
+		}
+	}
+
+	return res;
+}
+
 
 static bool
 add_background_parameter(int *pargc, char **argv)
@@ -1057,6 +1079,7 @@ igt_main
 	struct shmbuf *sh_mem = NULL;
 
 	int r;
+	char shm_name[256] = {0};
 	bool arr_cap[AMD_IP_MAX] = {0};
 	unsigned int ring_id_good;
 	unsigned int ring_id_bad;
@@ -1116,8 +1139,11 @@ igt_main
 			const_num_of_tests = 1;
 		else
 			const_num_of_tests =  get_num_of_tests(&arr_err[0], &ip_tests[0], ARRAY_SIZE(ip_tests));
-		fd = drm_open_driver(DRIVER_AMDGPU);
 
+		r = is_run_device_parameter_found(argc, argv);
+		snprintf(shm_name,sizeof(shm_name),"/queue_reset_shm_%d",r);
+
+		fd = drm_open_driver(DRIVER_AMDGPU);
 		err = amdgpu_device_initialize(fd, &major, &minor, &device);
 		igt_require(err == 0);
 
@@ -1137,7 +1163,7 @@ igt_main
 
 		if (!is_background_parameter_found(argc, argv)) {
 			add_background_parameter(&argc, argv);
-			fd_shm = shared_mem_create(&sh_mem);
+			fd_shm = shared_mem_create(&sh_mem, shm_name);
 			igt_require(fd_shm != -1);
 			launch_background_process(argc, argv, path, &pid_background, fd_shm);
 			process = PROCESS_TEST;
@@ -1190,7 +1216,7 @@ igt_main
 		free_contexts(device, arr_context_handle, const_num_of_tests);
 		amdgpu_device_deinitialize(device);
 		drm_close_driver(fd);
-		shared_mem_destroy(sh_mem, fd_shm, true);
+		shared_mem_destroy(sh_mem, fd_shm, true, shm_name);
 		posix_spawn_file_actions_destroy(&action);
 
 		free_command_line(argc, argv, path);
-- 
2.25.1



More information about the igt-dev mailing list