public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: David Matlack <dmatlack@google.com>
To: Alex Williamson <alex@shazbot.org>
Cc: Alex Mastro <amastro@fb.com>, David Matlack <dmatlack@google.com>,
	 Jason Gunthorpe <jgg@nvidia.com>,
	Josh Hilke <jrhilke@google.com>,
	kvm@vger.kernel.org,  linux-kernel@vger.kernel.org,
	linux-kselftest@vger.kernel.org,
	 Raghavendra Rao Ananta <rananta@google.com>,
	Vipin Sharma <vipinsh@google.com>
Subject: [PATCH v3 03/18] vfio: selftests: Allow passing multiple BDFs on the command line
Date: Fri, 21 Nov 2025 18:14:14 +0000	[thread overview]
Message-ID: <20251121181429.1421717-4-dmatlack@google.com> (raw)
In-Reply-To: <20251121181429.1421717-1-dmatlack@google.com>

Add support for passing multiple device BDFs to a test via the command
line. This is a prerequisite for multi-device tests.

Single-device tests can continue using vfio_selftests_get_bdf(), which
will continue to return argv[argc - 1] (if it is a BDF string), or the
environment variable $VFIO_SELFTESTS_BDF otherwise.

For multi-device tests, a new helper called vfio_selftests_get_bdfs() is
introduced which will return an array of all BDFs found at the end of
argv[], as well as the number of BDFs found (passed back to the caller
via argument). The array of BDFs returned does not need to be freed by
the caller.

The environment variable VFIO_SELFTESTS_BDF continues to support only a
single BDF for the time being.

Reviewed-by: Alex Mastro <amastro@fb.com>
Tested-by: Alex Mastro <amastro@fb.com>
Signed-off-by: David Matlack <dmatlack@google.com>
---
 .../selftests/vfio/lib/include/vfio_util.h    |  2 +
 .../selftests/vfio/lib/vfio_pci_device.c      | 57 +++++++++++++++----
 2 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/tools/testing/selftests/vfio/lib/include/vfio_util.h b/tools/testing/selftests/vfio/lib/include/vfio_util.h
index 69ec0c856481..0b9a5628d23e 100644
--- a/tools/testing/selftests/vfio/lib/include/vfio_util.h
+++ b/tools/testing/selftests/vfio/lib/include/vfio_util.h
@@ -208,6 +208,8 @@ struct iova_allocator {
  * If BDF cannot be determined then the test will exit with KSFT_SKIP.
  */
 const char *vfio_selftests_get_bdf(int *argc, char *argv[]);
+char **vfio_selftests_get_bdfs(int *argc, char *argv[], int *nr_bdfs);
+
 const char *vfio_pci_get_cdev_path(const char *bdf);
 
 extern const char *default_iommu_mode;
diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_device.c b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
index b479a359da12..eda8f14de797 100644
--- a/tools/testing/selftests/vfio/lib/vfio_pci_device.c
+++ b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
@@ -868,29 +868,64 @@ static bool is_bdf(const char *str)
 	return count == 4 && length == strlen(str);
 }
 
-const char *vfio_selftests_get_bdf(int *argc, char *argv[])
+static char **get_bdfs_cmdline(int *argc, char *argv[], int *nr_bdfs)
 {
-	char *bdf;
+	int i;
 
-	if (*argc > 1 && is_bdf(argv[*argc - 1]))
-		return argv[--(*argc)];
+	for (i = *argc - 1; i > 0 && is_bdf(argv[i]); i--)
+		continue;
+
+	i++;
+	*nr_bdfs = *argc - i;
+	*argc -= *nr_bdfs;
+
+	return *nr_bdfs ? &argv[i] : NULL;
+}
+
+static char *get_bdf_env(void)
+{
+	char *bdf;
 
 	bdf = getenv("VFIO_SELFTESTS_BDF");
-	if (bdf) {
-		VFIO_ASSERT_TRUE(is_bdf(bdf), "Invalid BDF: %s\n", bdf);
-		return bdf;
+	if (!bdf)
+		return NULL;
+
+	VFIO_ASSERT_TRUE(is_bdf(bdf), "Invalid BDF: %s\n", bdf);
+	return bdf;
+}
+
+char **vfio_selftests_get_bdfs(int *argc, char *argv[], int *nr_bdfs)
+{
+	static char *env_bdf;
+	char **bdfs;
+
+	bdfs = get_bdfs_cmdline(argc, argv, nr_bdfs);
+	if (bdfs)
+		return bdfs;
+
+	env_bdf = get_bdf_env();
+	if (env_bdf) {
+		*nr_bdfs = 1;
+		return &env_bdf;
 	}
 
-	fprintf(stderr, "Unable to determine which device to use, skipping test.\n");
+	fprintf(stderr, "Unable to determine which device(s) to use, skipping test.\n");
 	fprintf(stderr, "\n");
 	fprintf(stderr, "To pass the device address via environment variable:\n");
 	fprintf(stderr, "\n");
-	fprintf(stderr, "    export VFIO_SELFTESTS_BDF=segment:bus:device.function\n");
+	fprintf(stderr, "    export VFIO_SELFTESTS_BDF=\"segment:bus:device.function\"\n");
 	fprintf(stderr, "    %s [options]\n", argv[0]);
 	fprintf(stderr, "\n");
-	fprintf(stderr, "To pass the device address via argv:\n");
+	fprintf(stderr, "To pass the device address(es) via argv:\n");
 	fprintf(stderr, "\n");
-	fprintf(stderr, "    %s [options] segment:bus:device.function\n", argv[0]);
+	fprintf(stderr, "    %s [options] segment:bus:device.function ...\n", argv[0]);
 	fprintf(stderr, "\n");
 	exit(KSFT_SKIP);
 }
+
+const char *vfio_selftests_get_bdf(int *argc, char *argv[])
+{
+	int nr_bdfs;
+
+	return vfio_selftests_get_bdfs(argc, argv, &nr_bdfs)[0];
+}
-- 
2.52.0.rc2.455.g230fcf2819-goog


  parent reply	other threads:[~2025-11-21 18:14 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-21 18:14 [PATCH v3 00/18] vfio: selftests: Support for multi-device tests David Matlack
2025-11-21 18:14 ` [PATCH v3 01/18] vfio: selftests: Move run.sh into scripts directory David Matlack
2025-11-21 18:14 ` [PATCH v3 02/18] vfio: selftests: Split run.sh into separate scripts David Matlack
2025-11-21 18:14 ` David Matlack [this message]
2025-11-21 18:14 ` [PATCH v3 04/18] vfio: selftests: Rename struct vfio_iommu_mode to iommu_mode David Matlack
2025-11-21 18:14 ` [PATCH v3 05/18] vfio: selftests: Introduce struct iommu David Matlack
2025-11-21 18:14 ` [PATCH v3 06/18] vfio: selftests: Support multiple devices in the same container/iommufd David Matlack
2025-11-24 11:17   ` Raghavendra Rao Ananta
2025-11-25 17:37     ` David Matlack
2025-11-21 18:14 ` [PATCH v3 07/18] vfio: selftests: Eliminate overly chatty logging David Matlack
2025-11-22 14:56   ` kernel test robot
2025-11-21 18:14 ` [PATCH v3 08/18] vfio: selftests: Prefix logs with device BDF where relevant David Matlack
2025-11-21 18:14 ` [PATCH v3 09/18] vfio: selftests: Upgrade driver logging to dev_err() David Matlack
2025-11-21 18:14 ` [PATCH v3 10/18] vfio: selftests: Rename struct vfio_dma_region to dma_region David Matlack
2025-11-21 18:14 ` [PATCH v3 11/18] vfio: selftests: Move IOMMU library code into iommu.c David Matlack
2025-11-23  1:59   ` kernel test robot
2025-11-21 18:14 ` [PATCH v3 12/18] vfio: selftests: Move IOVA allocator into iova_allocator.c David Matlack
2025-11-23  1:57   ` kernel test robot
2025-11-21 18:14 ` [PATCH v3 13/18] vfio: selftests: Stop passing device for IOMMU operations David Matlack
2025-11-21 18:14 ` [PATCH v3 14/18] vfio: selftests: Rename vfio_util.h to libvfio.h David Matlack
2025-11-21 18:14 ` [PATCH v3 15/18] vfio: selftests: Move vfio_selftests_*() helpers into libvfio.c David Matlack
2025-11-21 18:14 ` [PATCH v3 16/18] vfio: selftests: Split libvfio.h into separate header files David Matlack
2025-11-21 18:14 ` [PATCH v3 17/18] vfio: selftests: Eliminate INVALID_IOVA David Matlack
2025-11-21 18:14 ` [PATCH v3 18/18] vfio: selftests: Add vfio_pci_device_init_perf_test David Matlack
2025-11-24 11:20 ` [PATCH v3 00/18] vfio: selftests: Support for multi-device tests Raghavendra Rao Ananta
2025-11-25 17:38   ` David Matlack

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251121181429.1421717-4-dmatlack@google.com \
    --to=dmatlack@google.com \
    --cc=alex@shazbot.org \
    --cc=amastro@fb.com \
    --cc=jgg@nvidia.com \
    --cc=jrhilke@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=rananta@google.com \
    --cc=vipinsh@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox