[igt-dev] [PATCH i-g-t 2/3] lib/drmtest: add multigpu helpers
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Mon Sep 25 20:30:17 UTC 2023
On Wed, Sep 20, 2023 at 06:19:12PM +0200, Kamil Konieczny wrote:
> Create helpers for multigpu tests so they may use not only cards
> but also renders.
>
> Signed-off-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
> ---
> lib/drmtest.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++---
> lib/drmtest.h | 4 +++
> 2 files changed, 94 insertions(+), 4 deletions(-)
>
> diff --git a/lib/drmtest.c b/lib/drmtest.c
> index 926f388ee..72fa22ee9 100644
> --- a/lib/drmtest.c
> +++ b/lib/drmtest.c
> @@ -293,6 +293,10 @@ static struct {
>
> static int _opened_fds_count;
>
> +static struct igt_device_card _multigpu_cards[64];
> +static int _multigpu_count;
> +static bool _multigpu_use_render;
> +
> static void _set_opened_fd(int idx, int fd)
> {
> assert(idx < ARRAY_SIZE(_opened_fds));
> @@ -499,6 +503,7 @@ int __drm_open_driver_another(int idx, int chipset)
> igt_debug("card idx: %d chipset: %d\n", idx, chipset);
> if (chipset != DRIVER_VGEM && igt_device_filter_count() > idx) {
> struct igt_device_card card;
> + char *name;
> bool found;
>
> found = __get_card_for_nth_filter(idx, &card);
> @@ -509,14 +514,15 @@ int __drm_open_driver_another(int idx, int chipset)
> found = __get_card_for_nth_filter(idx, &card);
> }
>
> - if (!found || !strlen(card.card))
> + name = _multigpu_use_render ? card.render : card.card;
> + if (!found || !strlen(name))
> igt_warn("No card matches the filter! [%s]\n",
> igt_device_filter_get(idx));
> - else if (_is_already_opened(card.card, idx))
> + else if (_is_already_opened(name, idx))
> igt_warn("card maching filter %d is already opened\n", idx);
Hi Kamil.
> else {
> - igt_debug("card idx: %d found: %s\n", idx, card.card);
> - fd = __open_driver_exact(card.card, chipset);
> + igt_debug("card idx: %d found: %s\n", idx, name);
> + fd = __open_driver_exact(name, chipset);
> }
>
This looks ok for me.
> } else {
> @@ -794,6 +800,86 @@ int drm_reopen_driver(int fd)
> return fd;
> }
>
> +static int __drm_multigpu_prepare(int chipset)
> +{
> + int gpu_count;
> +
> + if (_multigpu_count)
> + return _multigpu_count < 0 ? 0 : _multigpu_count; /* already prepared */
> +
> + memset(&_multigpu_cards[0], 0, sizeof(_multigpu_cards));
As _multigpu_cards is static you don't need to zeroing it. Above if
prevents to reenter this part of code.
> +
> + gpu_count = igt_device_filter_count();
> + for (int i = 0; i < gpu_count; i++) {
> + struct igt_device_card *newcard;
> + const char *filter;
> +
> + newcard = &_multigpu_cards[i];
> + filter = igt_device_filter_get(i);
> + if (strlen(filter) > 0 && igt_device_card_match(filter, newcard)) {
> + igt_debug("Filter matched %s | %s\n", newcard->card, newcard->render);
> + ++_multigpu_count;
> + }
> + }
> +
> + if (_multigpu_count < 2) {
> + igt_debug("Multigpu prepare failed, no multi-gpu board or no --device nor IGT_DEVICE used\n");
I think 'no multi-gpu board _AND_ no --device...' should be used here.
I've tried to run ./xe_create without passing IGT_DEVICE and I've failed.
I think as you're require chipset you should handle legacy (iterating)
device opening (one by one which matches chipset).
> + _multigpu_count = -1; /* do not count 1 as multigpu */
> +
> + /* check if we may find intel discrete cards with filters */
> + if (chipset & (DRIVER_INTEL | DRIVER_XE)) {
> + struct igt_device_card gpucard;
> + char filter[128];
> +
> + for (int i = 0; i < 16; i++) {
Hmm, why 16 and not 64?
--
Zbigniew
> + snprintf(filter, sizeof(filter), "pci:vendor=Intel,device=discrete,card=%d", i);
> + if (igt_device_card_match(filter, &gpucard))
> + igt_debug("Found card: %s\n", gpucard.card);
> + }
> + }
> + }
> +
> + return _multigpu_count;
> +}
> +/**
> + * drm_multigpu_prepare_cards:
> + * @chipset: flag for chipset to use in multigpu opens
> + *
> + * Prepares __drm_open_drivers_another to use card.card at opens.
> + * Returns: number of cards found by filter given by --device or IGT_DEVICE
> + */
> +int drm_multigpu_prepare_cards(int chipset)
> +{
> + _multigpu_use_render = false;
> +
> + return __drm_multigpu_prepare(chipset);
> +}
> +
> +/**
> + * drm_multigpu_prepare_renders:
> + * @chipset: flag for chipset to use in multigpu opens
> + *
> + * Prepares __drm_open_drivers_another to use card.render at opens.
> + * Returns: number of cards found by filter given by --device or IGT_DEVICE
> + */
> +int drm_multigpu_prepare_renders(int chipset)
> +{
> + _multigpu_use_render = true;
> +
> + return __drm_multigpu_prepare(chipset);
> +}
> +
> +/**
> + * drm_get_multigpu_count:
> + *
> + * Returns: number of cards found by drm_multigpu_prepare_cards or
> + * drm_multigpu_prepare_renders
> + */
> +int drm_get_multigpu_count(void)
> +{
> + return _multigpu_count;
> +}
> +
> void igt_require_amdgpu(int fd)
> {
> igt_require(is_amdgpu_device(fd));
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 97ab6e759..2fab50a36 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -109,6 +109,10 @@ int drm_close_driver(int fd);
>
> int drm_reopen_driver(int fd);
>
> +int drm_multigpu_prepare_cards(int chipset);
> +int drm_multigpu_prepare_renders(int chipset);
> +int drm_get_multigpu_count(void);
> +
> void igt_require_amdgpu(int fd);
> void igt_require_intel(int fd);
> void igt_require_i915(int fd);
> --
> 2.42.0
>
More information about the igt-dev
mailing list