[igt-dev] [PATCH i-g-t v3] tests/core_hotunplug: Restore i915 debugfs health check

Marcin Bernatowicz marcin.bernatowicz at linux.intel.com
Thu Oct 15 07:15:00 UTC 2020


On Tue, 2020-10-13 at 13:02 +0200, Janusz Krzysztofik wrote:
> Removal of igt_fork_hang_detector() from local_i915_healthcheck() by
> commit 1fbd127bd4e1 ("core_hotplug: Teach the healthcheck how to
> check
> execution status") resulted in unintentional removal of an important
> though implicit test feature of detecting, reporting as failures and
> recovering from potential misses of debugfs subdirs of hot rebound
> i915
> devices.  As a consequence, unexpected failures or skips of other
> unrelated but subsequently run tests have been observed on CI.
> 
> On the other hand, removal of the debugfs issue detection and subtest
> failures from right after hot rebinding the driver enabled the better
> version of the i915 GPU health check fixed by the same commit to
> detect
> and report other issues potentially triggered by device late close.
> 
> Restore the missing test feature by introducing an explicit sysfs
> health check, not limited to i915,  that verifies existence of device
> sysfs and debugfs areas.  Also, split hotrebind/hotreplug scenarios
> into a pair of each, one that performs the health check right after
> hot
> rebind/replug and delegates the device late close step to a follow up
> recovery phase, while the other one checks device health only after
> late closing it.
> 
> v2: Give GPU health check a better chance to detect issues - run it
>     before sysfs health checks.
> v3: Run sysfs health check on any hardware, not only i915.
> 
> Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik at linux.intel.com
> >
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> Even if the root cause has occurred to be sitting on the IGT lib side
> and has been already fixed by commit 937526629344 ("lib: Don't fail
> debugfs lookup on an expected absent drm device"), I think we should
> restore the debugfs health check just in case new issues with similar
> symptoms appear in the future and start affecting subsequent tests
> silently.
> 
> Thanks,
> Janusz
> 
>  tests/core_hotunplug.c | 68 ++++++++++++++++++++++++++++++++++++++
> ----
>  1 file changed, 62 insertions(+), 6 deletions(-)
> 
> diff --git a/tests/core_hotunplug.c b/tests/core_hotunplug.c
> index 70669c590..cdc07c85d 100644
> --- a/tests/core_hotunplug.c
> +++ b/tests/core_hotunplug.c
> @@ -308,7 +308,7 @@ static void node_healthcheck(struct hotunplug
> *priv, unsigned flags)
>  		priv->failure = "Unrecoverable test failure";
>  		if (local_i915_healthcheck(fd_drm, "") &&
>  		    (!(flags & FLAG_RECOVER) ||
> local_i915_recover(fd_drm)))
> -			priv->failure = "Healthcheck failure!";
> +			priv->failure = "GPU healthcheck failure!";
>  		else
>  			priv->failure = NULL;
>  
> @@ -317,6 +317,16 @@ static void node_healthcheck(struct hotunplug
> *priv, unsigned flags)
>  		priv->failure = NULL;
>  	}
>  
> +	if (!priv->failure) {
> +		char path[200];
> +
> +		priv->failure = "Device sysfs healthckeck failure!";
> +		local_debug("%s\n", "running device sysfs
> healthcheck");
> +		igt_assert(igt_sysfs_path(fd_drm, path, sizeof(path)));
> +		igt_assert(igt_debugfs_path(fd_drm, path,
> sizeof(path)));
> +		priv->failure = NULL;
> +	}
> +

LGTM,
Reviewed-by: Marcin Bernatowicz <marcin.bernatowicz at linux.intel.com>

>  	fd_drm = close_device(fd_drm, "", "health checked ");
>  	if (closed || fd_drm < -1)	/* update status for
> post_healthcheck */
>  		priv->fd.drm_hc = fd_drm;
> @@ -437,7 +447,7 @@ static void hotunplug_rescan(struct hotunplug
> *priv)
>  	healthcheck(priv, false);
>  }
>  
> -static void hotrebind_lateclose(struct hotunplug *priv)
> +static void hotrebind(struct hotunplug *priv)
>  {
>  	igt_assert_eq(priv->fd.drm, -1);
>  	igt_assert_eq(priv->fd.drm_hc, -1);
> @@ -448,6 +458,30 @@ static void hotrebind_lateclose(struct hotunplug
> *priv)
>  	driver_bind(priv, 0);
>  
>  	healthcheck(priv, false);
> +}
> +
> +static void hotreplug(struct hotunplug *priv)
> +{
> +	igt_assert_eq(priv->fd.drm, -1);
> +	igt_assert_eq(priv->fd.drm_hc, -1);
> +	priv->fd.drm = local_drm_open_driver(false, "", " for hot
> replug");
> +
> +	device_unplug(priv, "hot ", 60);
> +
> +	bus_rescan(priv, 0);
> +
> +	healthcheck(priv, false);
> +}
> +
> +static void hotrebind_lateclose(struct hotunplug *priv)
> +{
> +	igt_assert_eq(priv->fd.drm, -1);
> +	igt_assert_eq(priv->fd.drm_hc, -1);
> +	priv->fd.drm = local_drm_open_driver(false, "", " for hot
> rebind");
> +
> +	driver_unbind(priv, "hot ", 60);
> +
> +	driver_bind(priv, 0);
>  
>  	priv->fd.drm = close_device(priv->fd.drm, "late ", "unbound ");
>  	igt_assert_eq(priv->fd.drm, -1);
> @@ -465,8 +499,6 @@ static void hotreplug_lateclose(struct hotunplug
> *priv)
>  
>  	bus_rescan(priv, 0);
>  
> -	healthcheck(priv, false);
> -
>  	priv->fd.drm = close_device(priv->fd.drm, "late ", "removed ");
>  	igt_assert_eq(priv->fd.drm, -1);
>  
> @@ -570,7 +602,31 @@ igt_main
>  		post_healthcheck(&priv);
>  
>  	igt_subtest_group {
> -		igt_describe("Check if the driver hot unbound from a
> still open device can be cleanly rebound, then the old instance
> released");
> +		igt_describe("Check if the driver can be cleanly
> rebound to a device with a still open hot unbound driver instance");
> +		igt_subtest("hotrebind")
> +			hotrebind(&priv);
> +
> +		igt_fixture
> +			recover(&priv);
> +	}
> +
> +	igt_fixture
> +		post_healthcheck(&priv);
> +
> +	igt_subtest_group {
> +		igt_describe("Check if a hot unplugged and still open
> device can be cleanly restored");
> +		igt_subtest("hotreplug")
> +			hotreplug(&priv);
> +
> +		igt_fixture
> +			recover(&priv);
> +	}
> +
> +	igt_fixture
> +		post_healthcheck(&priv);
> +
> +	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")
>  			hotrebind_lateclose(&priv);
>  
> @@ -582,7 +638,7 @@ igt_main
>  		post_healthcheck(&priv);
>  
>  	igt_subtest_group {
> -		igt_describe("Check if a still open while hot unplugged
> device can be cleanly restored, then the old instance released");
> +		igt_describe("Check if an instance of a still open
> while hot replugged device can be cleanly released");
>  		igt_subtest("hotreplug-lateclose")
>  			hotreplug_lateclose(&priv);
>  



More information about the igt-dev mailing list