[PATCH v2] tests/core_setmaster: Handle the test even if cards are non-continuous
Kamil Konieczny
kamil.konieczny at linux.intel.com
Tue Sep 10 16:29:52 UTC 2024
Hi Bommu,
On 2024-09-10 at 11:07:47 +0530, Bommu Krishnaiah wrote:
> 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 at 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 at 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.
>
> Signed-off-by: Bommu Krishnaiah krishnaiah.bommu at intel.com
> Cc: Emil Velikov emil.l.velikov at gmail.com
> Cc: Himal Prasad Ghimiray himal.prasad.ghimiray at intel.com
> Cc: Kamil Konieczny kamil.konieczny at linux.intel.com
> ---
> tests/core_setmaster.c | 17 ++++++++++++-----
> 1 file changed, 12 insertions(+), 5 deletions(-)
>
> diff --git a/tests/core_setmaster.c b/tests/core_setmaster.c
> index 9c2083f66..bfcfb5d25 100644
> --- a/tests/core_setmaster.c
> +++ b/tests/core_setmaster.c
> @@ -107,18 +107,20 @@ static void check_drop_set(void)
> drm_close_driver(master);
> }
>
> -static unsigned tweak_perm(uint8_t *saved_perm, unsigned max_perm, bool save)
> +static int tweak_perm(uint8_t *saved_perm, unsigned max_perm, bool save)
> {
> char path[256];
> struct stat st;
> - unsigned i;
> + int i;
>
> for (i = 0; i < max_perm; i++) {
> + int ret = 0;
> +
> snprintf(path, sizeof(path), "/dev/dri/card%u", i);
>
> /* Existing userspace assumes there's no gaps, do the same. */
Please update comment or refactor whole test:
use pair of __drm_open_driver/__drm_close_driver,
imho something like:
in first fixup open fd and get its path, this will allow to
eliminate loop,
then after succesfully changing permissions set also at_exit() proc
for restoring priviliges if test fails.
if changing permissions fails just fail with igt_assert()
Regards,
Kamil
> if (stat(path, &st) != 0)
> - break;
> + continue;
>
> if (save) {
> /* Save and toggle */
> @@ -136,7 +138,12 @@ static unsigned tweak_perm(uint8_t *saved_perm, unsigned max_perm, bool save)
> * - __drm_open_driver() can open another device, aka the
> * failure may be irrelevant.
> */
> - chmod(path, st.st_mode);
> + ret = chmod(path, st.st_mode);
> + if (ret)
> + return ret;
> +
> + if (save)
> + return i;
> }
> return i;
> }
> @@ -161,7 +168,7 @@ igt_main
>
> igt_subtest_group {
> uint8_t saved_perm[255];
> - unsigned num;
> + int num;
>
> /* Upon dropping root we end up as random user, which
> * a) is not in the video group, and
> --
> 2.25.1
>
More information about the igt-dev
mailing list