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)");
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.