summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJanusz Krzysztofik <janusz.krzysztofik@linux.intel.com>2020-04-03 13:47:27 +0200
committerArkadiusz Hiler <arkadiusz.hiler@intel.com>2020-04-06 12:34:12 +0300
commit6c124b5c8501d900966c033ac86c3dc55c16a2da (patch)
treefeecfec72875781d65492e910d3750bbec432a50 /lib
parentda79d5fa2ebed237f0561a54b4b63bae6f21503a (diff)
lib: Fix device lists not cleaned up sufficiently before rescan
Some effort is already taken to clean up previous content of device lists before forced device rescan is performed but it is not sufficient. An attempt to use forced device rescan in a test results in that test crashing or spinning until being killed by OOM killer. Fix it. v2: Remove device from the list before device attributes are destroyed Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik@linux.intel.com> Reviewed-by: Zbigniew KempczyƄski <zbigniew.kempczynski@intel.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/igt_device_scan.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
index cf7c4d95..30a9704a 100644
--- a/lib/igt_device_scan.c
+++ b/lib/igt_device_scan.c
@@ -353,14 +353,11 @@ static void set_vendor_device(struct igt_device *dev)
dev->device = strndup(pci_id + 5, 4);
}
-/* Allocate arrays for keeping scanned devices */
+/* Initialize lists for keeping scanned devices */
static bool prepare_scan(void)
{
- if (igt_devs.all.prev == NULL || igt_devs.all.next == NULL)
- IGT_INIT_LIST_HEAD(&igt_devs.all);
-
- if (igt_devs.filtered.prev == NULL || igt_devs.filtered.next == NULL)
- IGT_INIT_LIST_HEAD(&igt_devs.filtered);
+ IGT_INIT_LIST_HEAD(&igt_devs.all);
+ IGT_INIT_LIST_HEAD(&igt_devs.filtered);
return true;
}
@@ -595,7 +592,14 @@ void igt_devices_scan(bool force)
{
if (force && igt_devs.devs_scanned) {
struct igt_device *dev, *tmp;
+
+ igt_list_for_each_entry_safe(dev, tmp, &igt_devs.filtered,
+ link) {
+ igt_list_del(&dev->link);
+ free(dev);
+ }
igt_list_for_each_entry_safe(dev, tmp, &igt_devs.all, link) {
+ igt_list_del(&dev->link);
igt_device_free(dev);
free(dev);
}