[PATCH i-g-t v9 5/7] lib/intel_multigpu: Add xe_multi_fork_foreach_gpu

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Mon Feb 19 11:22:19 UTC 2024


On Thu, Feb 15, 2024 at 05:10:12PM +0100, Kamil Konieczny wrote:
> Create macro for testing Xe driver in multigpu scenarios with
> the help of few new multigpu functions. Also while at this,
> add documentation for public functions and use new helper in
> existing multi-gpu macro.
> 
> v2: corrected description (Kamil), rebased on corrected patches
>   after Dominik review
> v3: corrected descriptions, renamed function to print_gpus
>   and did small refactoring (Kamil)
>   fixed typo in function name (Dominik)
> v4: fixed typos (Dominik)
> 
> Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> Reviewed-by: Dominik Karol Piątkowski <dominik.karol.piatkowski at intel.com>
> ---
>  lib/intel_multigpu.c | 106 +++++++++++++++++++++++++++++++++++++++++--
>  lib/intel_multigpu.h |  12 ++++-
>  2 files changed, 112 insertions(+), 6 deletions(-)
> 
> diff --git a/lib/intel_multigpu.c b/lib/intel_multigpu.c
> index 0e76d8aa3..689c4f10c 100644
> --- a/lib/intel_multigpu.c
> +++ b/lib/intel_multigpu.c
> @@ -4,10 +4,19 @@
>   */
>  
>  #include "drmtest.h"
> +#include "i915/gem.h"
>  #include "igt_core.h"
>  #include "igt_device_scan.h"
>  #include "intel_multigpu.h"
>  
> +/**
> + * gem_multigpu_count_class:
> + * @class: chipset, e.g. DRIVER_XE or DRIVER_INTEL
> + *
> + * Function counts number of GPU cards with the help of opening all of them.
> + *
> + * Returns: number of GPUs cards found
> + */
>  int gem_multigpu_count_class(int class)
>  {
>  	int count = 0;
> @@ -18,7 +27,7 @@ int gem_multigpu_count_class(int class)
>  	return count;
>  }
>  
> -void gem_require_multigpu(int count)
> +static void print_gpus(int count, int gpu_num)
>  {
>  	struct igt_devices_print_format fmt = {
>  		.type = IGT_PRINT_SIMPLE,
> @@ -26,14 +35,101 @@ void gem_require_multigpu(int count)
>  	};
>  	int devices;
>  
> -	if (igt_device_filter_count() >= count)
> -		return;
> -
>  	igt_info("PCI devices available in the system:\n");
>  
>  	igt_devices_scan(true);
>  	devices = igt_device_filter_pci();
>  	igt_devices_print(&fmt);
>  
> -	igt_skip("Test requires at least %d GPUs, %d available.\n", count, devices);
> +	igt_info("Test requires at least %d GPUs, got %d, available %d\n", count, gpu_num, devices);
> +}
> +
> +/**
> + * gem_require_multigpu:
> + * @count: minimum number of GPUs required
> + *
> + * Function checks number of filtered GPU cards.
> + * On error skips and prints available GPUs found on PCI bus.
> + */
> +void gem_require_multigpu(int count)
> +{
> +	int gpu_count = igt_device_filter_count();
> +
> +	if (gpu_count >= count)
> +		return;
> +
> +	print_gpus(count, gpu_count);
> +	igt_skip_on(gpu_count < count);
> +}

I don't get, what for is previous change in gem_require_multigpu()?

--
Zbigniew

> +
> +/**
> + * multigpu_acquire_view:
> + * @gpus_wanted: minimum number of GPUs required
> + * @chipset: chipset, e.g. DRIVER_XE or DRIVER_INTEL
> + *
> + * Function prepares filtered view for GPU cards with given chipset.
> + * On error skips and prints available GPUs found on PCI bus.
> + * Returns: number of GPUs found
> + */
> +int multigpu_acquire_view(int gpus_wanted, unsigned int chipset)
> +{
> +	int gpu_count = drm_prepare_filtered_multigpu(chipset);
> +
> +	igt_assert(gpus_wanted > 1);
> +	if (gpu_count >= gpus_wanted)
> +		return gpu_count;
> +
> +	print_gpus(gpus_wanted, gpu_count);
> +	igt_skip_on(gpu_count < gpus_wanted);
> +
> +	return gpu_count; /* non-reachable */
> +}
> +
> +/**
> + * multigpu_open_another:
> + * @idx: index of GPU card, starting from 0
> + * @chipset: chipset, e.g. DRIVER_XE or DRIVER_INTEL
> + *
> + * Function opens GPU card with drm_open_driver_another(). For i915 it checks
> + * if opened card is functional. Skips on errors.
> + *
> + * Returns: opened fd for @idx card
> + */
> +int multigpu_open_another(int idx, unsigned int chipset)
> +{
> +	int fd;
> +
> +	igt_assert(idx >= 0);
> +	fd = drm_open_driver_another(idx, chipset);
> +
> +	if (chipset == DRIVER_INTEL)
> +		igt_require_gem(fd);
> +
> +	return fd;
> +}
> +
> +/**
> + * multigpu_open_filtered_card:
> + * @idx: index of GPU card, starting from 0
> + * @chipset: chipset, e.g. DRIVER_XE or DRIVER_INTEL
> + *
> + * Function opens GPU card prepared with filtered view. It also checks if
> + * opened card agrees with desired chipset or checks if opened card is
> + * functional. Skips on errors.
> + *
> + * Returns: opened fd for @idx card
> + */
> +int multigpu_open_filtered_card(int idx, unsigned int chipset)
> +{
> +	int fd;
> +
> +	igt_assert(idx >= 0);
> +	fd = drm_open_filtered_card(idx);
> +	igt_require(fd != -1);
> +	if (chipset == DRIVER_XE)
> +		igt_require_xe(fd);
> +	else if (chipset == DRIVER_INTEL)
> +		igt_require_gem(fd);
> +
> +	return fd;
>  }
> diff --git a/lib/intel_multigpu.h b/lib/intel_multigpu.h
> index 0ebc73e4a..3fbf83e21 100644
> --- a/lib/intel_multigpu.h
> +++ b/lib/intel_multigpu.h
> @@ -12,6 +12,10 @@
>  void gem_require_multigpu(int count);
>  int gem_multigpu_count_class(int class);
>  
> +int multigpu_acquire_view(int min_gpus_wanted, unsigned int chipset);
> +int multigpu_open_another(int idx, unsigned int chipset);
> +int multigpu_open_filtered_card(int idx, unsigned int chipset);
> +
>  #define igt_foreach_gpu(fd__, id__) \
>  	for (int igt_unique(i) = 0, fd__; \
>  		(fd__ = __drm_open_driver_another(igt_unique(i)++, id__)) >= 0; \
> @@ -19,8 +23,14 @@ int gem_multigpu_count_class(int class);
>  
>  #define igt_multi_fork_foreach_gpu(__fd, __id) \
>  	igt_multi_fork(igt_unique(__i), gem_multigpu_count_class(__id)) \
> -		for (int __fd = drm_open_driver_another(igt_unique(__i), __id); \
> +		for (int __fd = multigpu_open_another(igt_unique(__i), __id); \
>  			__fd >= 0; \
>  			close(__fd), __fd = -1) \
>  
> +#define xe_multi_fork_foreach_gpu(__fd, __gpu_index) \
> +	igt_multi_fork(__gpu_index, multigpu_acquire_view(2, DRIVER_XE)) \
> +		for (int __fd = multigpu_open_filtered_card(__gpu_index, DRIVER_XE); \
> +			__fd >= 0; \
> +			drm_close_driver(__fd), __fd = -1) \
> +
>  #endif /* __INTEL_MULTIGPU_H */
> -- 
> 2.42.0
> 


More information about the igt-dev mailing list