Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Bommu Krishnaiah <krishnaiah.bommu@intel.com>
To: igt-dev@lists.freedesktop.org
Cc: Bommu Krishnaiah <krishnaiah.bommu@intel.com>
Subject: [PATCH i-g-t v4] tests/core_setmaster: Handle the test even if cards are non-continuous
Date: Wed,  2 Oct 2024 20:55:38 +0530	[thread overview]
Message-ID: <20241002152538.26971-1-krishnaiah.bommu@intel.com> (raw)

Although most of user space assumes drm cards to be populated continuously,
this assumption may not be always true. After hot unpluging and repluging
of card, the card may be non-continuous. To address such scenarios where
the cards can be non-continuous Modify the tweak_perm function to loop all
possible card numbers(card0-card255) and break after first card found.

Problem Description:
The test fails after running the `core_hotunplug@hot*` subtest, where
Card0 is populated as card1, This leads to a failure in the subsequent
`master-drop-set-user` test.

Command sequence for reproducing the issue:
- Check available cards: `ls /dev/dri/`
        - Output: by-path  card0  renderD128
- Run the test: `# ./core_hotunplug --r hotrebind-lateclose`
- Check again: ‘ls /dev/dri/’
        - Output after core_hotunplug : by-path  card1  renderD129
- Run the test: `# ./core_setmaster --r master-drop-set-user`
        - Output: gta@core_setmaster@master-drop-set-user failure

This failures on both XE and i915 for above sequence.

v2: Break the loop after first card found and check return value of chmod.
v3: Undated comments in code.
v4: Refactor the code in master-drop-set-user

Signed-off-by: Bommu Krishnaiah krishnaiah.bommu@intel.com
Cc: Emil Velikov emil.l.velikov@gmail.com
Cc: Himal Prasad Ghimiray himal.prasad.ghimiray@intel.com
Cc: Kamil Konieczny kamil.konieczny@linux.intel.com
---
 tests/core_setmaster.c | 78 +++++++++++++++++++++++-------------------
 1 file changed, 43 insertions(+), 35 deletions(-)

diff --git a/tests/core_setmaster.c b/tests/core_setmaster.c
index 9c2083f66..137039782 100644
--- a/tests/core_setmaster.c
+++ b/tests/core_setmaster.c
@@ -107,40 +107,28 @@ static void check_drop_set(void)
 	drm_close_driver(master);
 }
 
-static unsigned tweak_perm(uint8_t *saved_perm, unsigned max_perm, bool save)
+static void tweak_perm(uint8_t *saved_perm, char *path, bool save)
 {
-	char path[256];
 	struct stat st;
-	unsigned i;
-
-	for (i = 0; i < max_perm; i++) {
-		snprintf(path, sizeof(path), "/dev/dri/card%u", i);
-
-		/* Existing userspace assumes there's no gaps, do the same. */
-		if (stat(path, &st) != 0)
-			break;
-
-		if (save) {
-			/* Save and toggle */
-			saved_perm[i] = st.st_mode & (S_IROTH | S_IWOTH);
-			st.st_mode |= S_IROTH | S_IWOTH;
-		} else {
-			/* Clear and restore */
-			st.st_mode &= ~(S_IROTH | S_IWOTH);
-			st.st_mode |= saved_perm[i];
-		}
-
-		/* There's only one way for chmod to fail - race vs rmmod.
-		 * In that case, do _not_ error/skip, since:
-		 * - we need to restore the [correct] permissions
-		 * - __drm_open_driver() can open another device, aka the
-		 * failure may be irrelevant.
-		 */
-		chmod(path, st.st_mode);
+	int ret;
+
+	ret = stat(path, &st);
+	igt_assert_f(!ret, "stat failed with %d path=%s\n", errno, path);
+
+	if (save) {
+		/* Save and toggle */
+		*saved_perm = st.st_mode & (S_IROTH | S_IWOTH);
+		st.st_mode |= S_IROTH | S_IWOTH;
+	} else {
+		/* Clear and restore */
+		st.st_mode &= ~(S_IROTH | S_IWOTH);
+		st.st_mode |= *saved_perm;
 	}
-	return i;
-}
 
+	/* There's only one way for chmod to fail - race vs rmmod. */
+	ret = chmod(path, st.st_mode);
+	igt_assert_f(!ret, "chmod failed with %d path=%s\n", errno, path);
+}
 
 igt_main
 {
@@ -160,8 +148,8 @@ igt_main
 
 
 	igt_subtest_group {
-		uint8_t saved_perm[255];
-		unsigned num;
+		uint8_t saved_perm;
+		char buf[255];
 
 		/* Upon dropping root we end up as random user, which
 		 * a) is not in the video group, and
@@ -176,8 +164,28 @@ igt_main
 		 * restored on skip or failure.
 		 */
 		igt_fixture {
-			num = tweak_perm(saved_perm, ARRAY_SIZE(saved_perm),
-					 true);
+			char path[255];
+			int len;
+			int fd;
+
+			fd = __drm_open_driver(DRIVER_ANY);
+			igt_assert_fd(fd);
+
+			snprintf(path, sizeof(path), "/proc/self/fd/%d", fd);
+
+			memset(buf, 0, sizeof(buf));
+			len = readlink(path, buf, sizeof(buf) - 1);
+			if (len <= 0)
+				igt_assert_f(0, "readlink failed with %d path=%s\n", errno, path);
+
+			buf[len] = '\0';
+			if (!(strstr(buf, "/dev/dri/card") == buf ||
+					strstr(buf, "/dev/dri/renderD") == buf))
+				igt_assert_f(0, "Not a card nor render, errno %d path=%s\n", errno, buf);
+
+			igt_assert_eq(__drm_close_driver(fd), 0);
+
+			tweak_perm(&saved_perm, buf, true);
 		}
 
 		igt_describe("Ensure first normal user can Set/DropMaster");
@@ -191,7 +199,7 @@ igt_main
 
 		/* Restore the original permissions */
 		igt_fixture {
-			tweak_perm(saved_perm, num, false);
+			tweak_perm(&saved_perm, buf, false);
 		}
 	}
 
-- 
2.34.1


             reply	other threads:[~2024-10-02 15:39 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-02 15:25 Bommu Krishnaiah [this message]
2024-10-02 17:16 ` ✓ CI.xeBAT: success for tests/core_setmaster: Handle the test even if cards are non-continuous (rev6) Patchwork
2024-10-02 17:20 ` ✓ Fi.CI.BAT: " Patchwork
2024-10-02 21:31 ` ✗ CI.xeFULL: failure " Patchwork
2024-10-03  9:17 ` [PATCH i-g-t v4] tests/core_setmaster: Handle the test even if cards are non-continuous Kamil Konieczny
2024-10-03 21:50 ` ✗ Fi.CI.IGT: failure for tests/core_setmaster: Handle the test even if cards are non-continuous (rev6) Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20241002152538.26971-1-krishnaiah.bommu@intel.com \
    --to=krishnaiah.bommu@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox