[PATCH i-g-t v1 3/7] tests/core_hotplug: Add checks to subtests

Andrzej Hajda andrzej.hajda at intel.com
Wed Jun 12 07:02:18 UTC 2024



On 07.06.2024 17:36, Kamil Konieczny wrote:
> Currently health checks and recovery are performed in fixtures
> outside of subtest and even without any subtest running. Whats
> more, after one subtest fail, all other checks will fail and
> will print quite a few logs. Additionally they are also meant
> to check health of device after a test and make a subtest fail.
>
> Lets try to fail early inside subtest and lower number of checks
> to those really needed and do them only once per fixture, which
> should make reading logs easier.
>
> Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> ---
>   tests/core_hotunplug.c | 118 +++++++++++++++++++++++++++--------------
>   1 file changed, 78 insertions(+), 40 deletions(-)
>
> diff --git a/tests/core_hotunplug.c b/tests/core_hotunplug.c
> index 3971b94ff..7ed9abd37 100644
> --- a/tests/core_hotunplug.c
> +++ b/tests/core_hotunplug.c
> @@ -84,6 +84,9 @@
>   
>   IGT_TEST_DESCRIPTION("Examine behavior of a driver on device hot unplug");
>   
> +#define ACTION_RECOVER		(1 << 0)
> +#define ACTION_POST_CHECK	(1 << 1)
> +
>   struct hotunplug {
>   	struct {
>   		int drm;
> @@ -98,6 +101,7 @@ struct hotunplug {
>   	bool has_intel_perf;
>    	char *snd_driver;
>   	int chipset;
> +	int checks;
>   };
>   
>   /* Helpers */
> @@ -509,8 +513,11 @@ static void pre_check(struct hotunplug *priv)
>   static void recover(struct hotunplug *priv)
>   {
>   	bool late_close = priv->fd.drm >= 0;
> +	int needs_recover = priv->checks & ACTION_RECOVER;
>   
>   	cleanup(priv);
> +	if (!needs_recover)
> +		return;
>   
>   	if (!priv->failure && late_close)
>   		igt_ignore_warn(healthcheck(priv, false));
> @@ -528,10 +535,18 @@ static void recover(struct hotunplug *priv)
>   
>   	if (priv->failure)
>   		igt_assert_f(healthcheck(priv, true), "%s\n", priv->failure);
> +
> +	priv->checks &= ~ACTION_RECOVER;
>   }

With this change recover becomes kind of recover_if_requested.

>   
>   static void post_healthcheck(struct hotunplug *priv)
>   {
> +	bool needs_post_check = priv->checks & ACTION_POST_CHECK;
> +
> +	priv->checks = 0;
> +	if (!needs_post_check)
> +		return;
> +

Wouldn't be safer to clean only appropriate flag:

+	if (!needs_post_check)
+		return;
+	priv->checks &= ~ACTION_POST_CHECK;

>   	igt_abort_on_f(priv->failure, "%s\n", priv->failure);
>   
>   	cleanup(priv);
> @@ -667,6 +682,19 @@ static void hotreplug_lateclose(struct hotunplug *priv)
>   }
>   
>   /* Main */
> +#define RECOVER	igt_fixture { \
> +		recover(&priv); \
> +	}
> +
> +#define POST_CHECK igt_fixture { \
> +		post_healthcheck(&priv); \
> +	}
> +
> +static void recover_and_post_healthcheck(struct hotunplug *priv)
> +{
> +	recover(priv);
> +	post_healthcheck(priv);
> +}

Since you are proposing flags to trigger recover and check with cleanup, 
why do not
do it in one function, for example post_healthcheck:

static void post_healthcheck(struct hotunplug *priv)

{
     if (priv->checks & ACTION_RECOVER)
         recover(priv);
     priv->checks &= ~ACTION_RECOVER;

     if (!(priv->checks & ACTION_POST_CHECK))
         return;
     ...
}

and use post_healthcheck everywhere, and drop:
- recover_and_post_healthcheck,
- RECOVER

Regards
Andrzej

>   
>   igt_main
>   {
> @@ -677,6 +705,7 @@ igt_main
>   		.has_intel_perf = false,
>   		.snd_driver	= NULL,
>   		.chipset	= DRIVER_ANY,
> +		.checks		= 0,
>   	};
>   
>   	igt_fixture {
> @@ -704,100 +733,109 @@ igt_main
>   
>   	igt_subtest_group {
>   		igt_describe("Check if the driver can be cleanly unbound from a device believed to be closed, then rebound");
> -		igt_subtest("unbind-rebind")
> +		igt_subtest("unbind-rebind") {
> +			priv.checks = ACTION_RECOVER | ACTION_POST_CHECK;
>   			unbind_rebind(&priv);
> +			recover_and_post_healthcheck(&priv);
> +		}
>   
> -		igt_fixture
> -			recover(&priv);
> +		RECOVER;
>   	}
>   
> -	igt_fixture
> -		post_healthcheck(&priv);
> +	POST_CHECK;
>   
>   	igt_subtest_group {
>   		igt_describe("Check if a device believed to be closed can be cleanly unplugged, then restored");
> -		igt_subtest("unplug-rescan")
> +		igt_subtest("unplug-rescan") {
> +			priv.checks = ACTION_RECOVER | ACTION_POST_CHECK;
>   			unplug_rescan(&priv);
> +			recover_and_post_healthcheck(&priv);
> +		}
>   
> -		igt_fixture
> -			recover(&priv);
> +		RECOVER;
>   	}
>   
> -	igt_fixture
> -		post_healthcheck(&priv);
> +	POST_CHECK;
>   
>   	igt_subtest_group {
>   		igt_describe("Check if the driver can be cleanly unbound from an open device, then released and rebound");
> -		igt_subtest("hotunbind-rebind")
> +		igt_subtest("hotunbind-rebind") {
> +			priv.checks = ACTION_RECOVER | ACTION_POST_CHECK;
>   			hotunbind_rebind(&priv);
> +			recover_and_post_healthcheck(&priv);
> +		}
>   
> -		igt_fixture
> -			recover(&priv);
> +		RECOVER;
>   	}
>   
> -	igt_fixture
> -		post_healthcheck(&priv);
> +	POST_CHECK;
>   
>   	igt_subtest_group {
>   		igt_describe("Check if an open device can be cleanly unplugged, then released and restored");
> -		igt_subtest("hotunplug-rescan")
> +		igt_subtest("hotunplug-rescan") {
> +			priv.checks = ACTION_RECOVER | ACTION_POST_CHECK;
>   			hotunplug_rescan(&priv);
> +			recover_and_post_healthcheck(&priv);
> +		}
>   
> -		igt_fixture
> -			recover(&priv);
> +		RECOVER;
>   	}
>   
> -	igt_fixture
> -		post_healthcheck(&priv);
> +	POST_CHECK;
>   
>   	igt_subtest_group {
>   		igt_describe("Check if the driver can be cleanly rebound to a device with a still open hot unbound driver instance");
> -		igt_subtest("hotrebind")
> +		igt_subtest("hotrebind") {
> +			priv.checks = ACTION_RECOVER | ACTION_POST_CHECK;
>   			hotrebind(&priv);
> +			recover_and_post_healthcheck(&priv);
> +		}
>   
> -		igt_fixture
> -			recover(&priv);
> +		RECOVER;
>   	}
>   
> -	igt_fixture
> -		post_healthcheck(&priv);
> +	POST_CHECK;
>   
>   	igt_subtest_group {
>   		igt_describe("Check if a hot unplugged and still open device can be cleanly restored");
> -		igt_subtest("hotreplug")
> +		igt_subtest("hotreplug") {
> +			priv.checks = ACTION_RECOVER | ACTION_POST_CHECK;
>   			hotreplug(&priv);
> +			recover_and_post_healthcheck(&priv);
> +		}
>   
> -		igt_fixture
> -			recover(&priv);
> +		RECOVER;
>   	}
>   
> -	igt_fixture
> -		post_healthcheck(&priv);
> +	POST_CHECK;
>   
>   	igt_subtest_group {
>   		igt_describe("Check if a hot unbound driver instance still open after hot rebind can be cleanly released");
> -		igt_subtest("hotrebind-lateclose")
> +		igt_subtest("hotrebind-lateclose") {
> +			priv.checks = ACTION_RECOVER | ACTION_POST_CHECK;
>   			hotrebind_lateclose(&priv);
> +			recover_and_post_healthcheck(&priv);
> +		}
>   
> -		igt_fixture
> -			recover(&priv);
> +		RECOVER;
>   	}
>   
> -	igt_fixture
> -		post_healthcheck(&priv);
> +	POST_CHECK;
>   
>   	igt_subtest_group {
>   		igt_describe("Check if an instance of a still open while hot replugged device can be cleanly released");
> -		igt_subtest("hotreplug-lateclose")
> +		igt_subtest("hotreplug-lateclose") {
> +			priv.checks = ACTION_RECOVER | ACTION_POST_CHECK;
>   			hotreplug_lateclose(&priv);
> +			recover_and_post_healthcheck(&priv);
> +		}
>   
> -		igt_fixture
> -			recover(&priv);
> +		RECOVER;
>   	}
>   
> -	igt_fixture {
> -		post_healthcheck(&priv);
> +	POST_CHECK;
>   
> +	igt_fixture {
>   		igt_ignore_warn(close(priv.fd.sysfs_bus));
>   		igt_ignore_warn(close(priv.fd.sysfs_drv));
>   	}



More information about the igt-dev mailing list