[PATCH i-g-t] tests/intel/xe_fault_injection: Break early if the test is done

Cavitt, Jonathan jonathan.cavitt at intel.com
Mon Aug 4 20:28:38 UTC 2025


-----Original Message-----
From: igt-dev <igt-dev-bounces at lists.freedesktop.org> On Behalf Of Daniele Ceraolo Spurio
Sent: Monday, August 4, 2025 12:16 PM
To: igt-dev at lists.freedesktop.org
Cc: Ceraolo Spurio, Daniele <daniele.ceraolospurio at intel.com>; K V P, Satyanarayana <satyanarayana.k.v.p at intel.com>
Subject: [PATCH i-g-t] tests/intel/xe_fault_injection: Break early if the test is done
> 
> For the GuC communication injections, the test is currently looping for
> an hardcoded 100 times. In the current driver we call the 2 GuC

s/an/a

> communication functions way less than 100 times each (in one run I've
> counted less than 40 for one and less than 10 for the other), so for
> the majority of the iterations the test is just reloading the driver
> without any injection occurring.
> 
> To avoid wasting so much time, we can just break early if we've reached
> the point where no more injections are occurring. If we use a positive
> value for the "times" parameter in the injection framework, the value
> will be decremented every time an injection occur in the given

s/occur/occurs

> iteration, so we can break once we detect that the value is unchanged.
> 
> While at it, add an assert to alert us if the number of calls to the
> function increases above our current maximum number of loops, so we know
> that the test needs to be updated.
> 
> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: Satyanarayana K V P <satyanarayana.k.v.p at intel.com>

Non-blocking aside below, and some spelling fixes above.
With the applied spelling fixes, this is:
Reviewed-by: Jonathan Cavitt <jonathan.cavitt at intel.com>

> ---
>  tests/intel/xe_fault_injection.c | 37 +++++++++++++++++++++++++++++---
>  1 file changed, 34 insertions(+), 3 deletions(-)
> 
> diff --git a/tests/intel/xe_fault_injection.c b/tests/intel/xe_fault_injection.c
> index 8245c558c..00d045cd8 100644
> --- a/tests/intel/xe_fault_injection.c
> +++ b/tests/intel/xe_fault_injection.c
> @@ -27,7 +27,8 @@
>  #define INJECT_ERRNO	-ENOMEM
>  #define BO_ADDR		0x1a0000
>  #define BO_SIZE		(1024*1024)
> -#define INJECT_ITERATIONS	100
> +#define MAX_INJECT_ITERATIONS	100
> +#define MAX_INJECTIONS_PER_ITER	100

Aside:
I don't know if having a separate MAX_INJECTIONS_PER_ITER field is
strictly necessary in this case, but it's probably better to keep a separation
between the two values anyways, so I won't block on it.

-Jonathan Cavitt

>  
>  int32_t inject_iters_raw;
>  struct fault_injection_params {
> @@ -194,6 +195,19 @@ static void cleanup_injection_fault(int sig)
>  	injection_list_clear();
>  }
>  
> +static int get_remaining_injection_count(void)
> +{
> +	int dir, val;
> +
> +	dir = fail_function_open();
> +	igt_assert_lte(0, dir);
> +
> +	val = igt_sysfs_get_s32(dir, "times");
> +
> +	close(dir);
> +	return val;
> +}
> +
>  static void set_retval(const char function_name[], long long retval)
>  {
>  	char path[96];
> @@ -288,14 +302,31 @@ static void probe_fail_guc(int fd, const char pci_slot[], const char function_na
>  	*/
>  	iter = inject_iters_raw;
>  	iter_start = iter ? : 0;
> -	iter_end = iter ? iter + 1 : INJECT_ITERATIONS;
> +	iter_end = iter ? iter + 1 : MAX_INJECT_ITERATIONS;
>  	igt_debug("Injecting error for %d - %d iterations\n", iter_start, iter_end);
>  	for (int i = iter_start; i < iter_end; i++) {
>  		fault_params->space = i;
> +		fault_params->times = MAX_INJECTIONS_PER_ITER;
>  		setup_injection_fault(fault_params);
>  		inject_fault_probe(fd, pci_slot, function_name);
>  		igt_kmod_unbind("xe", pci_slot);
> +
> +		/*
> +		 * if no injection occurred we've tested all the injection
> +		 * points for this function and can therefore stop iterating.
> +		 */
> +		if (get_remaining_injection_count() == MAX_INJECTIONS_PER_ITER)
> +			break;
>  	}
> +
> +	/*
> +	 * In the unlikely case where we haven't covered all the injection
> +	 * points for the function (because there are more of them than
> +	 * MAX_INJECT_ITERATIONS) fail the test so that we know we need to do an
> +	 * update and/or split it in two parts.
> +	 */
> +	igt_assert_f(inject_iters_raw || iter != MAX_INJECT_ITERATIONS,
> +		     "Loop exited without covering all injection points!\n");
>  }
>  
>  /**
> @@ -486,7 +517,7 @@ static int opt_handler(int opt, int opt_index, void *data)
>  	case 'I':
>  		/* Update to 0 if not exported / -ve value */
>  		in_param = atoi(optarg);
> -		if (!in_param || in_param <= 0 || in_param > INJECT_ITERATIONS)
> +		if (!in_param || in_param <= 0 || in_param > MAX_INJECT_ITERATIONS)
>  			inject_iters_raw = 0;
>  		else
>  			inject_iters_raw = in_param;
> -- 
> 2.43.0
> 
> 


More information about the igt-dev mailing list