Re: [PATCH] tests/sriov_basic: Validate PF unbind with VFs enabled
"Bernatowicz, Marcin" <[email protected]>
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <[email protected]> |
On 7/17/2026 3:44 PM, Lukasz Laguna wrote: > 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 <[email protected]> > --- > tests/sriov_basic.c | 82 +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 82 insertions(+) > > diff --git a/tests/sriov_basic.c b/tests/sriov_basic.c > index 1e563cee9..1c5bb878e 100644 > --- a/tests/sriov_basic.c > +++ b/tests/sriov_basic.c > @@ -3,8 +3,13 @@ > * Copyright(c) 2023 Intel Corporation. All rights reserved. > */ > > +#include <limits.h> > +#include <dirent.h> > + > #include "drmtest.h" > #include "igt_core.h" > +#include "igt_device.h" > +#include "igt_pci.h" > #include "igt_sriov_device.h" > > IGT_TEST_DESCRIPTION("Basic tests for enabling SR-IOV Virtual Functions"); > @@ -118,6 +123,51 @@ 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(!igt_pci_device_unbind(pci_slot)); Is hot-unbind with the PF fd kept open intentional ? > + igt_assert(!igt_pci_get_bound_driver_name(pci_slot, NULL, 0)); > + igt_assert_eq(count_pci_virtfn_entries(pci_slot), 0); > +} > + > int igt_main() > { > int pf_fd; > @@ -210,7 +260,39 @@ int igt_main() > } > } > > + igt_subtest_group() { > + char pci_slot[NAME_MAX]; > + char driver[NAME_MAX]; > + > + igt_fixture() { > + 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() { > + if (!igt_pci_get_bound_driver_name(pci_slot, NULL, 0)) { > + close(pf_fd); > + pf_fd = -1; > + igt_assert(!igt_pci_driver_bind(driver, pci_slot)); > + pf_fd = drm_open_driver(DRIVER_ANY); We should ensure we reopen the same PF device, especially in multi-GPU configurations, by setting a device filter as in igt@core_hotunplug. > + } > + } > + } > + > 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)");