[igt-dev] [PATCH i-g-t] lib/igt_device_scan: Assert if there's empty PCI_SLOT_NAME
Kamil Konieczny
kamil.konieczny at linux.intel.com
Fri Jul 29 08:22:03 UTC 2022
On 2022-07-28 at 09:00:24 +0200, Zbigniew Kempczyński wrote:
> On one of our testing machines executed i915_pm_rpm at module-reload subtest
> catches SIGSEGV with following callstack:
>
> Received signal SIGSEGV.
> Stack trace:
You could put here a few relevant lines, but it's not blocker.
Reviewed-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
>
> There's single suspicious code line in devtype_intel() which might trigger
> this behavior - it is strncmp(). But that means pci_slot variable would be
> null or point to some garbage. This variable is initialized before from
> uevent property so lets verify and assert if there's no PCI_SLOT_NAME
> passed from the kernel for pci device. Additionally dump all properties
> and attributes to get bigger picture what comes from the kernel to device
> scanning library.
>
> Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
> Cc: Petri Latvala <petri.latvala at intel.com>
> ---
> lib/igt_device_scan.c | 31 ++++++++++++++++++++++++-------
> 1 file changed, 24 insertions(+), 7 deletions(-)
>
> diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
> index aad7966764..d6fae0650c 100644
> --- a/lib/igt_device_scan.c
> +++ b/lib/igt_device_scan.c
> @@ -558,6 +558,16 @@ static void get_attrs(struct udev_device *dev, struct igt_device *idev)
> #define is_drm_subsystem(dev) (strequal(get_prop_subsystem(dev), "drm"))
> #define is_pci_subsystem(dev) (strequal(get_prop_subsystem(dev), "pci"))
>
> +static void print_ht(GHashTable *ht);
> +static void dump_props_and_attrs(const struct igt_device *dev)
> +{
> + printf("\n[properties]\n");
> + print_ht(dev->props_ht);
> + printf("\n[attributes]\n");
> + print_ht(dev->attrs_ht);
> + printf("\n");
> +}
> +
> /*
> * Get PCI_SLOT_NAME property, it should be in format of
> * xxxx:yy:zz.z
> @@ -565,9 +575,20 @@ static void get_attrs(struct udev_device *dev, struct igt_device *idev)
> static void set_pci_slot_name(struct igt_device *dev)
> {
> const char *pci_slot_name = get_prop(dev, "PCI_SLOT_NAME");
> + int len;
> +
> + if (!pci_slot_name) {
> + dump_props_and_attrs(dev);
> + igt_assert_f(pci_slot_name, "PCI_SLOT_NAME property == NULL\n");
> + }
> +
> + len = strlen(pci_slot_name);
> + if (len != PCI_SLOT_NAME_SIZE) {
> + dump_props_and_attrs(dev);
> + igt_assert_f(len != PCI_SLOT_NAME_SIZE,
> + "PCI_SLOT_NAME length != %d [%s]\n", len, pci_slot_name);
> + }
>
> - if (!pci_slot_name || (strlen(pci_slot_name) != PCI_SLOT_NAME_SIZE))
> - return;
> dev->pci_slot_name = strdup(pci_slot_name);
> }
>
> @@ -1249,11 +1270,7 @@ igt_devs_print_detail(struct igt_list_head *view,
> _print_key_value("codename", dev->codename);
> }
>
> - printf("\n[properties]\n");
> - print_ht(dev->props_ht);
> - printf("\n[attributes]\n");
> - print_ht(dev->attrs_ht);
> - printf("\n");
> + dump_props_and_attrs(dev);
> }
> }
>
> --
> 2.34.1
>
More information about the igt-dev
mailing list