[PATCH i-g-t v8 2/5] lib/igt_device_scan: Enable finding all matched IGT devices
Zbigniew Kempczyński
zbigniew.kempczynski at intel.com
Fri Apr 18 06:56:57 UTC 2025
On Thu, Apr 17, 2025 at 07:29:38PM +0530, Soham Purkait wrote:
> Use filter to find all the available
> GPUs or few among them by driver name
> and card type or card number.
>
> v2 : Fix for refactoring GPUTOP into a
> vendor-agnostic tool. (Lucas)
>
> v3 : Separate commit for lib. (Kamil)
>
> v4 : Refactor to use composition strategy
> for driver and device type filtering.
> Refactor code to improve memory
> allocation and error handling. (Lucas)
>
> v5 : Introduce device card match function
> to return collection of matching
> devices using device filter.
>
> v6 : Separate commit for device card match
> function. (Zbigniew)
> Function description modification for device
> card match function. (Zbigniew)
>
> v7 : Single return for card match function.
> (Krzysztof)
>
> v8 : Removed 'drivers' array as card match
> function parameter. (Zbigniew)
>
> Signed-off-by: Soham Purkait <soham.purkait at intel.com>
> ---
> lib/igt_device_scan.c | 56 +++++++++++++++++++++++++++++++++++++++++++
> lib/igt_device_scan.h | 2 ++
> 2 files changed, 58 insertions(+)
>
> diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
> index 3dbe06812..fd299d6ab 100644
> --- a/lib/igt_device_scan.c
> +++ b/lib/igt_device_scan.c
> @@ -2134,6 +2134,62 @@ bool igt_device_card_match_pci(const char *filter,
> return __igt_device_card_match(filter, card, true);
> }
>
> +/**
> + * igt_device_card_match_all
> + * @filter: filter string.
> + * @card: double pointer to igt_device_card structure, containing
> + * an array of igt_device_card structures upon successful return.
> + * @request_pci_ss: a boolean parameter determines whether to
> + * consider PCI subsystem information during this process.
> + *
> + * Function applies filter to match device from device array.
> + *
> + * Returns: the number of cards found.
> + *
> + * Note: The caller is responsible for freeing the memory which is
> + * dynamically allocated for the array of igt_device_card structures
> + * upon successful return.
> + */
> +int igt_device_card_match_all(const char *filter, struct igt_device_card **card,
> + bool request_pci_ss)
> +{
> + struct igt_device *dev = NULL;
> + struct igt_device_card *crd = NULL;
> + struct igt_device_card *tmp;
> + int count = 0;
> +
> + igt_devices_scan();
> +
> + if (igt_device_filter_apply(filter) == false)
> + return 0;
> +
> + if (igt_list_empty(&igt_devs.filtered))
> + return 0;
> +
I would probably iterate over the list counting number of devices
which matches request_pci_ss value then allocate crd array once.
Finally iterate second time to fill it. Costs less than realloc
for each element (more elements, more memcpy inside costs).
Anyway I may accept this as is. Decision fix or not is up to you.
If you decide to change I'll review it again. But for this shape
Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
--
Zbigniew
> + igt_list_for_each_entry(dev, &igt_devs.filtered, link) {
> + tmp = realloc(crd, sizeof(struct igt_device_card) * (count + 1));
> + if (!tmp) {
> + if (crd)
> + free(crd);
> + return 0;
> + }
> +
> + crd = tmp;
> +
> + if (request_pci_ss && !is_pci_subsystem(dev) &&
> + dev->parent && is_pci_subsystem(dev->parent))
> + __copy_dev_to_card(dev->parent, crd);
> + else
> + __copy_dev_to_card(dev, crd);
> + count++;
> + }
> +
> + if (count)
> + *card = crd;
> +
> + return count;
> +}
> +
> /**
> * igt_device_get_pretty_name
> * @card: pointer to igt_device_card struct
> diff --git a/lib/igt_device_scan.h b/lib/igt_device_scan.h
> index f1cd3b1e9..7bee65881 100644
> --- a/lib/igt_device_scan.h
> +++ b/lib/igt_device_scan.h
> @@ -89,6 +89,8 @@ int igt_device_filter_pci(void);
> bool igt_device_card_match(const char *filter, struct igt_device_card *card);
> bool igt_device_card_match_pci(const char *filter,
> struct igt_device_card *card);
> +int igt_device_card_match_all(const char *filter, struct igt_device_card **card,
> + bool request_pci_ss);
> bool igt_device_find_first_i915_discrete_card(struct igt_device_card *card);
> bool igt_device_find_integrated_card(struct igt_device_card *card);
> bool igt_device_find_first_xe_discrete_card(struct igt_device_card *card);
> --
> 2.34.1
>
More information about the igt-dev
mailing list