Re: [PATCH v4 2/2] tests/sriov_basic: Validate PF unbind with VFs enabled

"Bernatowicz, Marcin" <[email protected]>
Newsgroups org.freedesktop.lists.igt-dev
Message-ID <[email protected]>
On 8/6/2026 12:03 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]>
> ---
> v4:
>   - Fix unspecified values of local variables after longjmp (Marcin)
> ---
>   tests/sriov_basic.c | 98 ++++++++++++++++++++++++++++++++++++++++++++-
>   1 file 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)");

LGTM,

Reviewed-by: Marcin Bernatowicz <[email protected]>
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.