Re: [PATCH i-g-t] tests/intel/xe_ras: Add test for GPU health indicator

"Anirban, Sk" <[email protected]>
Newsgroups org.freedesktop.lists.igt-dev
Message-ID <[email protected]>
Hi Soham,

On 16-07-2026 09:07 pm, Soham Purkait wrote:
> Add a new Xe RAS test exercising the gpu_health sysfs attribute
> exposed by the Xe driver on platforms that provide the system
> controller. The attribute reports and allows updating the GPU
> health state.
>
> The gpu-health subtest validates each valid state by writing it
> and reading the value back, and checks that invalid writes are
> rejected with -EINVAL, guarding against regressions in the
> implementation.
>
> Signed-off-by: Soham Purkait <[email protected]>
> ---
>   tests/intel/xe_ras.c | 127 +++++++++++++++++++++++++++++++++++++++++++
>   tests/meson.build    |   1 +
>   2 files changed, 128 insertions(+)
>   create mode 100644 tests/intel/xe_ras.c
>
> diff --git a/tests/intel/xe_ras.c b/tests/intel/xe_ras.c
> new file mode 100644
> index 000000000..e2465cbb1
> --- /dev/null
> +++ b/tests/intel/xe_ras.c
> @@ -0,0 +1,127 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2026 Intel Corporation
> + */
> +
> +/**
> + * TEST: Test Xe RAS (Reliability, Availability, Serviceability) functionality
> + * Category: Core
> + * Functionality: ras
> + * Mega feature: RAS
> + * Sub-category: RAS tests
> + * Test category: Functional tests
> + *
> + * SUBTEST: gpu-health
> + * Description: Verify the gpu_health sysfs attribute accepts each valid
> + *		state (ok/warning/critical) and rejects invalid writes
> + *		with EINVAL.
> + */
> +
> +#include <errno.h>
> +#include <string.h>
> +#include <unistd.h>
> +
> +#include "igt.h"
> +#include "igt_sysfs.h"
> +
> +#include "xe_drm.h"
> +#include "xe/xe_query.h"
Add the "SUBTEST:" description here.
> +
> +IGT_TEST_DESCRIPTION("Tests for Xe RAS");
> +
> +/*
> + * gpu_health lives on the PCI device, reachable via the "device" symlink
> + * under the DRM char sysfs directory returned by igt_sysfs_open().
> + */
> +#define GPU_HEALTH_ATTR	"device/gpu_health"
> +
> +static const char * const gpu_health_states[] = {
> +	"ok",
> +	"warning",
> +	"critical",
> +};
> +
> +static bool valid_gpu_health(const char *s)
> +{
> +	int i;
> +
> +	for (i = 0; i < ARRAY_SIZE(gpu_health_states); i++)
> +		if (!strcmp(s, gpu_health_states[i]))
> +			return true;
> +
> +	return false;
> +}
> +
> +static void test_gpu_health(int xe)
> +{
> +	char *orig_health = NULL, *health = NULL;
> +	int sys_fd;
> +	int ret;
> +	int i;
> +
> +	sys_fd = igt_sysfs_open(xe);
> +	igt_assert(sys_fd >= 0);
> +
> +	igt_require_f(igt_sysfs_has_attr(sys_fd, GPU_HEALTH_ATTR),
> +		      "gpu_health sysfs attribute not exposed by driver\n");
Is this sysfs is available for all the platforms out there? if not 
better to add a condition here before directly skipping that.
Also in case of skip the sys_fd will be remain opened.
> +
> +	orig_health = igt_sysfs_get(sys_fd, GPU_HEALTH_ATTR);
> +	igt_assert_f(orig_health, "Failed to read %s\n", GPU_HEALTH_ATTR);
> +	igt_debug("initial gpu_health: %s\n", orig_health);
> +	igt_assert_f(valid_gpu_health(orig_health),
> +		     "Unexpected initial gpu_health value: '%s'\n", orig_health);
> +
> +	/**
> +	 * Invalid writes must be rejected with EINVAL.
> +	 */
> +	errno = 0;
> +	ret = igt_sysfs_write(sys_fd, GPU_HEALTH_ATTR, "bogus", strlen("bogus"));
> +	igt_assert_f(ret < 0,
> +		     "Write of invalid value to %s unexpectedly succeeded\n",
> +		     GPU_HEALTH_ATTR);
> +	igt_assert_f(ret == -EINVAL,
> +		     "Invalid write to %s returned %d, expected -EINVAL\n",
> +		     GPU_HEALTH_ATTR, ret);
> +
imo only one igt_assert should work here.
> +	/**
> +	 * Write each valid state and read it back to confirm the driver
> +	 * accepts and reflects the requested value.
> +	 */
> +	for (i = 0; i < ARRAY_SIZE(gpu_health_states); i++) {
> +		const char *state = gpu_health_states[i];
> +
> +		igt_assert_f(igt_sysfs_set(sys_fd, GPU_HEALTH_ATTR, state),
> +			     "Failed to write '%s' to %s\n",
> +			     state, GPU_HEALTH_ATTR);
> +
> +		health = igt_sysfs_get(sys_fd, GPU_HEALTH_ATTR);
> +		igt_assert(health);
> +		igt_assert_f(!strcmp(health, state),
> +			     "gpu_health readback mismatch: wrote '%s', read '%s'\n",
> +			     state, health);
> +		free(health);
> +	}
> +
> +	/**
> +	 * Restore the original value.
> +	 */
> +	igt_assert_f(igt_sysfs_set(sys_fd, GPU_HEALTH_ATTR, orig_health),
> +		     "Failed to restore original gpu_health '%s'\n", orig_health);

The restoration should be done through a exit handler call, else any 
prev error can cause skipping this part.

Thanks,
Anirban

> +
> +	free(orig_health);
> +	close(sys_fd);
> +}
> +
> +int igt_main()
> +{
> +	int xe;
> +
> +	igt_fixture()
> +		xe = drm_open_driver(DRIVER_XE);
> +
> +	igt_subtest("gpu-health")
> +		test_gpu_health(xe);
> +
> +	igt_fixture()
> +		drm_close_driver(xe);
> +}
> diff --git a/tests/meson.build b/tests/meson.build
> index 6d90627b9..4ab4ef603 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -333,6 +333,7 @@ intel_xe_progs = [
>   	'xe_prime_self_import',
>   	'xe_pxp',
>   	'xe_query',
> +	'xe_ras',
>   	'xe_render_copy',
>   	'xe_vm',
>   	'xe_userptr_pressure',
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.