From 3fd44345c40bcccc43ee440626ddeff591d6e198 Mon Sep 17 00:00:00 2001 From: Tranquillity Codes Date: Fri, 19 Jan 2024 06:02:13 +0100 Subject: [PATCH] intel: Skip ioctls for querying device info when hardware is unsupported While enumerating devices on a system with multiple implementations, unnecessary ioctls will be issued before a driver checks if it supports a given device. This patch makes the driver fail early based on a intel_device_info.ver check with 2 new parameters added to intel_get_device_info_from_fd. Reviewed-by: Lionel Landwerlin Part-of: --- src/gallium/drivers/crocus/crocus_screen.c | 2 +- src/gallium/drivers/iris/iris_bufmgr.c | 2 +- src/intel/common/tests/mi_builder_test.cpp | 2 +- src/intel/dev/intel_dev_info.c | 2 +- src/intel/dev/intel_device_info.c | 8 +++++++- src/intel/dev/intel_device_info.h | 2 +- src/intel/dev/intel_device_info_override_test.c | 2 +- src/intel/ds/intel_pps_perf.cc | 2 +- src/intel/tools/intel_dump_gpu.c | 2 +- src/intel/tools/intel_hang_replay.c | 2 +- src/intel/vulkan/anv_device.c | 2 +- src/intel/vulkan_hasvk/anv_device.c | 2 +- 12 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/gallium/drivers/crocus/crocus_screen.c b/src/gallium/drivers/crocus/crocus_screen.c index 10927b1ea21..70c68ce0f9e 100644 --- a/src/gallium/drivers/crocus/crocus_screen.c +++ b/src/gallium/drivers/crocus/crocus_screen.c @@ -724,7 +724,7 @@ crocus_screen_create(int fd, const struct pipe_screen_config *config) if (!screen) return NULL; - if (!intel_get_device_info_from_fd(fd, &screen->devinfo)) + if (!intel_get_device_info_from_fd(fd, &screen->devinfo, 4, 8)) return NULL; screen->pci_id = screen->devinfo.pci_device_id; diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c index d24c14cb294..ca069bbc629 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.c +++ b/src/gallium/drivers/iris/iris_bufmgr.c @@ -2478,7 +2478,7 @@ iris_bufmgr_get_for_fd(int fd, bool bo_reuse) } } - if (!intel_get_device_info_from_fd(fd, &devinfo)) + if (!intel_get_device_info_from_fd(fd, &devinfo, 8, -1)) return NULL; if (devinfo.ver < 8 || devinfo.platform == INTEL_PLATFORM_CHV) diff --git a/src/intel/common/tests/mi_builder_test.cpp b/src/intel/common/tests/mi_builder_test.cpp index 054d266c4ec..003e8cf69d7 100644 --- a/src/intel/common/tests/mi_builder_test.cpp +++ b/src/intel/common/tests/mi_builder_test.cpp @@ -195,7 +195,7 @@ mi_builder_test::SetUp() ASSERT_TRUE(intel_gem_get_param(fd, I915_PARAM_CHIPSET_ID, &device_id)) << strerror(errno); - ASSERT_TRUE(intel_get_device_info_from_fd(fd, &devinfo)); + ASSERT_TRUE(intel_get_device_info_from_fd(fd, &devinfo, -1, -1)); if (devinfo.ver != GFX_VER || (devinfo.platform == INTEL_PLATFORM_HSW) != (GFX_VERx10 == 75)) { close(fd); diff --git a/src/intel/dev/intel_dev_info.c b/src/intel/dev/intel_dev_info.c index 360ca206804..5434640b0b4 100644 --- a/src/intel/dev/intel_dev_info.c +++ b/src/intel/dev/intel_dev_info.c @@ -249,7 +249,7 @@ main(int argc, char *argv[]) if (fd < 0) continue; - bool success = intel_get_device_info_from_fd(fd, &devinfo); + bool success = intel_get_device_info_from_fd(fd, &devinfo, -1, -1); close(fd); if (!success) diff --git a/src/intel/dev/intel_device_info.c b/src/intel/dev/intel_device_info.c index 7df82033223..2dc8c728cd7 100644 --- a/src/intel/dev/intel_device_info.c +++ b/src/intel/dev/intel_device_info.c @@ -1618,7 +1618,7 @@ intel_device_info_calc_engine_prefetch(const struct intel_device_info *devinfo, } bool -intel_get_device_info_from_fd(int fd, struct intel_device_info *devinfo) +intel_get_device_info_from_fd(int fd, struct intel_device_info *devinfo, int min_ver, int max_ver) { /* Get PCI info. * @@ -1639,6 +1639,12 @@ intel_get_device_info_from_fd(int fd, struct intel_device_info *devinfo) drmFreeDevice(&drmdev); return false; } + + if ((min_ver > 0 && devinfo->ver < min_ver) || (max_ver > 0 && devinfo->ver > max_ver)) { + drmFreeDevice(&drmdev); + return false; + } + devinfo->pci_domain = drmdev->businfo.pci->domain; devinfo->pci_bus = drmdev->businfo.pci->bus; devinfo->pci_dev = drmdev->businfo.pci->dev; diff --git a/src/intel/dev/intel_device_info.h b/src/intel/dev/intel_device_info.h index ba729153312..8a45e76fef8 100644 --- a/src/intel/dev/intel_device_info.h +++ b/src/intel/dev/intel_device_info.h @@ -641,7 +641,7 @@ intel_vram_all_mappable(const struct intel_device_info *devinfo) return devinfo->mem.vram.unmappable.size == 0; } -bool intel_get_device_info_from_fd(int fh, struct intel_device_info *devinfo); +bool intel_get_device_info_from_fd(int fh, struct intel_device_info *devinfo, int min_ver, int max_ver); bool intel_get_device_info_from_pci_id(int pci_id, struct intel_device_info *devinfo); diff --git a/src/intel/dev/intel_device_info_override_test.c b/src/intel/dev/intel_device_info_override_test.c index 8d678afcb57..519c3db17bf 100644 --- a/src/intel/dev/intel_device_info_override_test.c +++ b/src/intel/dev/intel_device_info_override_test.c @@ -62,7 +62,7 @@ main(int argc, char *argv[]) if (fd < 0) continue; - bool success = intel_get_device_info_from_fd(fd, &devinfo); + bool success = intel_get_device_info_from_fd(fd, &devinfo, -1, -1); close(fd); if (!success) diff --git a/src/intel/ds/intel_pps_perf.cc b/src/intel/ds/intel_pps_perf.cc index 71b605c89f7..73c840e452f 100644 --- a/src/intel/ds/intel_pps_perf.cc +++ b/src/intel/ds/intel_pps_perf.cc @@ -25,7 +25,7 @@ IntelPerf::IntelPerf(const int drm_fd) { assert(drm_fd >= 0 && "DRM fd is not valid"); - if (!intel_get_device_info_from_fd(drm_fd, &devinfo)) { + if (!intel_get_device_info_from_fd(drm_fd, &devinfo, -1, -1)) { PPS_LOG_FATAL("Failed to get devinfo"); } diff --git a/src/intel/tools/intel_dump_gpu.c b/src/intel/tools/intel_dump_gpu.c index 2e047cd2797..b1764c8e1cd 100644 --- a/src/intel/tools/intel_dump_gpu.c +++ b/src/intel/tools/intel_dump_gpu.c @@ -118,7 +118,7 @@ ensure_device_info(int fd) { /* We can't do this at open time as we're not yet authenticated. */ if (device == 0) { - fail_if(!intel_get_device_info_from_fd(fd, &devinfo), + fail_if(!intel_get_device_info_from_fd(fd, &devinfo, -1, -1), "failed to identify chipset.\n"); device = devinfo.pci_device_id; } else if (devinfo.ver == 0) { diff --git a/src/intel/tools/intel_hang_replay.c b/src/intel/tools/intel_hang_replay.c index cb3b666e906..f9a6a4f0de3 100644 --- a/src/intel/tools/intel_hang_replay.c +++ b/src/intel/tools/intel_hang_replay.c @@ -139,7 +139,7 @@ get_drm_device(struct intel_device_info *devinfo) if (fd < 0) continue; - if (!intel_get_device_info_from_fd(fd, devinfo) || + if (!intel_get_device_info_from_fd(fd, devinfo, -1, -1) || devinfo->ver < 8) { close(fd); fd = -1; diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 4f3ed545cf5..5a4b9905e25 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -2131,7 +2131,7 @@ anv_physical_device_try_create(struct vk_instance *vk_instance, } struct intel_device_info devinfo; - if (!intel_get_device_info_from_fd(fd, &devinfo)) { + if (!intel_get_device_info_from_fd(fd, &devinfo, 9, -1)) { result = vk_error(instance, VK_ERROR_INCOMPATIBLE_DRIVER); goto fail_fd; } diff --git a/src/intel/vulkan_hasvk/anv_device.c b/src/intel/vulkan_hasvk/anv_device.c index 3ecee75f83a..3c45345503d 100644 --- a/src/intel/vulkan_hasvk/anv_device.c +++ b/src/intel/vulkan_hasvk/anv_device.c @@ -989,7 +989,7 @@ anv_physical_device_try_create(struct vk_instance *vk_instance, } struct intel_device_info devinfo; - if (!intel_get_device_info_from_fd(fd, &devinfo)) { + if (!intel_get_device_info_from_fd(fd, &devinfo, 7, 8)) { result = vk_error(instance, VK_ERROR_INCOMPATIBLE_DRIVER); goto fail_fd; }