diff options
| author | Lukasz Laguna <lukasz.laguna@intel.com> | 2026-07-17 15:38:24 +0200 |
|---|---|---|
| committer | Lukasz Laguna <lukasz.laguna@intel.com> | 2026-08-06 12:26:32 +0200 |
| commit | c9a41149d8438b061639f5f5074f33c4858c2d8a (patch) | |
| tree | 3d1a2c0aba18c7333451e2b56df5bf1d0469d308 | |
| parent | 0a635b5b1b9a17b74c5bcd4a0f1c992a5091b8d9 (diff) | |
tests/sriov_basic: Validate PF unbind with VFs enabled
Add new subtests covering PF driver unbind with VFs enabled in two
scenarios:
- with all VFs enabled,
- with one VF enabled and probed.
The tests verify that PF ends up unbound and VFs are disabled.
Signed-off-by: Lukasz Laguna <lukasz.laguna@intel.com>
Reviewed-by: Marcin Bernatowicz <marcin.bernatowicz@linux.intel.com>
| -rw-r--r-- | tests/sriov_basic.c | 98 |
1 files changed, 96 insertions, 2 deletions
diff --git a/tests/sriov_basic.c b/tests/sriov_basic.c index 1e563cee9..050d209b1 100644 --- a/tests/sriov_basic.c +++ b/tests/sriov_basic.c @@ -3,8 +3,13 @@ * Copyright(c) 2023 Intel Corporation. All rights reserved. */ +#include <dirent.h> + #include "drmtest.h" #include "igt_core.h" +#include "igt_device.h" +#include "igt_device_scan.h" +#include "igt_pci.h" #include "igt_sriov_device.h" IGT_TEST_DESCRIPTION("Basic tests for enabling SR-IOV Virtual Functions"); @@ -118,10 +123,71 @@ static void bind_unbind_vf(int pf_fd, unsigned int vf_num) igt_sriov_disable_vfs(pf_fd); } +static unsigned int count_pci_virtfn_entries(const char *pci_slot) +{ + char path[PATH_MAX]; + unsigned int count = 0; + struct dirent *de; + DIR *dir; + + snprintf(path, sizeof(path), "/sys/bus/pci/devices/%s", pci_slot); + dir = opendir(path); + igt_assert_f(dir, "Failed to open %s\n", path); + + while ((de = readdir(dir))) { + if (!strncmp(de->d_name, "virtfn", strlen("virtfn"))) + count++; + } + + closedir(dir); + + return count; +} + +/** + * SUBTEST: pf-unbind-with-vfs-enabled-numvfs-all + * Description: + * Verify the PF driver unbind when all VFs are enabled. + * + * SUBTEST: pf-unbind-with-vf-probed + * Description: + * Verify the PF driver unbind when one VF is enabled and probed. + */ +static void pf_unbind_with_vfs_enabled(int *pf_fd, unsigned int num_vfs, bool vf_probe) +{ + char pci_slot[NAME_MAX]; + + vf_probe ? igt_sriov_enable_driver_autoprobe(*pf_fd) : + igt_sriov_disable_driver_autoprobe(*pf_fd); + igt_sriov_enable_vfs(*pf_fd, num_vfs); + + igt_device_get_pci_slot_name(*pf_fd, pci_slot); + igt_assert_eq(count_pci_virtfn_entries(pci_slot), num_vfs); + igt_assert(!drm_close_driver(*pf_fd)); + *pf_fd = -1; + igt_assert(!igt_pci_device_unbind(pci_slot)); + igt_assert(!igt_pci_get_bound_driver_name(pci_slot, NULL, 0)); + igt_assert_eq(count_pci_virtfn_entries(pci_slot), 0); +} + +static void restore_pf_after_unbind(int *pf_fd, const char *pci_slot, const char *driver) +{ + int ret; + + ret = igt_pci_get_bound_driver_name(pci_slot, NULL, 0); + if (!ret) + igt_assert(!igt_pci_driver_bind(driver, pci_slot)); + else + igt_assert_eq(ret, 1); + + if (*pf_fd < 0) + *pf_fd = drm_open_driver(DRIVER_ANY); +} + int igt_main() { - int pf_fd; - bool autoprobe; + static int pf_fd = -1; + static bool autoprobe; igt_fixture() { pf_fd = drm_open_driver(DRIVER_ANY); @@ -210,7 +276,35 @@ int igt_main() } } + igt_subtest_group() { + static char pci_slot[NAME_MAX]; + static char driver[NAME_MAX]; + + igt_fixture() { + igt_device_set_filter_from_fd(pf_fd); + igt_device_get_pci_slot_name(pf_fd, pci_slot); + igt_assert(igt_pci_get_bound_driver_name(pci_slot, driver, sizeof(driver))); + } + + igt_describe("Test unbinds the PF driver when all VFs are enabled"); + igt_subtest("pf-unbind-with-vfs-enabled-numvfs-all") { + for_max_sriov_num_vfs(pf_fd, num_vfs) { + pf_unbind_with_vfs_enabled(&pf_fd, num_vfs, false); + } + } + + igt_describe("Test unbinds the PF driver when one VF is enabled and probed"); + igt_subtest("pf-unbind-with-vf-probed") { + pf_unbind_with_vfs_enabled(&pf_fd, 1, true); + } + + igt_fixture() { + restore_pf_after_unbind(&pf_fd, pci_slot, driver); + } + } + igt_fixture() { + igt_abort_on_f(pf_fd < 0, "Device is not accessible\n"); igt_sriov_disable_vfs(pf_fd); /* abort to avoid execution of next tests with enabled VFs */ igt_abort_on_f(igt_sriov_get_enabled_vfs(pf_fd) > 0, "Failed to disable VF(s)"); |
