public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
From: David Matlack <dmatlack@google.com>
To: Alex Williamson <alex.williamson@redhat.com>
Cc: David Matlack <dmatlack@google.com>,
	Jason Gunthorpe <jgg@nvidia.com>, Josh Hilke <jrhilke@google.com>,
	 kvm@vger.kernel.org, Vipin Sharma <vipinsh@google.com>
Subject: [PATCH 02/12] vfio: selftests: Allow passing multiple BDFs on the command line
Date: Wed,  8 Oct 2025 23:25:21 +0000	[thread overview]
Message-ID: <20251008232531.1152035-3-dmatlack@google.com> (raw)
In-Reply-To: <20251008232531.1152035-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.

Signed-off-by: David Matlack <dmatlack@google.com>
---
 .../selftests/vfio/lib/include/vfio_util.h    |  2 +
 .../selftests/vfio/lib/vfio_pci_device.c      | 58 +++++++++++++++----
 2 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/tools/testing/selftests/vfio/lib/include/vfio_util.h b/tools/testing/selftests/vfio/lib/include/vfio_util.h
index ed31606e01b7..2acf119cbedb 100644
--- a/tools/testing/selftests/vfio/lib/include/vfio_util.h
+++ b/tools/testing/selftests/vfio/lib/include/vfio_util.h
@@ -198,6 +198,8 @@ struct vfio_pci_device {
  * 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 0921b2451ba5..f2fc5a52902b 100644
--- a/tools/testing/selftests/vfio/lib/vfio_pci_device.c
+++ b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
@@ -566,29 +566,63 @@ 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 **vfio_selftests_get_bdfs_cmdline(int *argc, char *argv[], int *nr_bdfs)
 {
-	char *bdf;
+	int i;
+
+	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;
+}
 
-	if (*argc > 1 && is_bdf(argv[*argc - 1]))
-		return argv[--(*argc)];
+static char **vfio_selftests_get_bdfs_env(int *argc, char *argv[], int *nr_bdfs)
+{
+	static 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;
+
+	*nr_bdfs = 1;
+	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)
+{
+	char **bdfs;
+
+	bdfs = vfio_selftests_get_bdfs_cmdline(argc, argv, nr_bdfs);
+	if (bdfs)
+		return bdfs;
+
+	bdfs = vfio_selftests_get_bdfs_env(argc, argv, nr_bdfs);
+	if (bdfs)
+		return bdfs;
 
-	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.51.0.710.ga91ca5db03-goog


  parent reply	other threads:[~2025-10-08 23:26 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-08 23:25 [PATCH 00/12] vfio: selftests: Support for multi-device tests David Matlack
2025-10-08 23:25 ` [PATCH 01/12] vfio: selftests: Split run.sh into separate scripts David Matlack
2025-11-10  3:21   ` Raghavendra Rao Ananta
2025-11-10 18:19     ` David Matlack
2025-10-08 23:25 ` David Matlack [this message]
2025-11-10  3:45   ` [PATCH 02/12] vfio: selftests: Allow passing multiple BDFs on the command line Raghavendra Rao Ananta
2025-11-10 18:31     ` David Matlack
2025-10-08 23:25 ` [PATCH 03/12] vfio: selftests: Rename struct vfio_iommu_mode to iommu_mode David Matlack
2025-10-08 23:25 ` [PATCH 04/12] vfio: selftests: Introduce struct iommu David Matlack
2025-10-08 23:25 ` [PATCH 05/12] vfio: selftests: Support multiple devices in the same container/iommufd David Matlack
2025-10-27 16:21   ` David Matlack
2025-11-07  3:37     ` Josh Hilke
2025-10-08 23:25 ` [PATCH 06/12] vfio: selftests: Eliminate overly chatty logging David Matlack
2025-10-08 23:25 ` [PATCH 07/12] vfio: selftests: Prefix logs with device BDF where relevant David Matlack
2025-11-10  4:54   ` Raghavendra Rao Ananta
2025-11-10 18:28     ` David Matlack
2025-10-08 23:25 ` [PATCH 08/12] vfio: selftests: Rename struct vfio_dma_region to dma_region David Matlack
2025-10-08 23:25 ` [PATCH 09/12] vfio: selftests: Move iommu_*() functions into iommu.c David Matlack
2025-10-08 23:25 ` [PATCH 10/12] vfio: selftests: Rename vfio_util.h to libvfio.h David Matlack
2025-10-08 23:25 ` [PATCH 11/12] vfio: selftests: Split libvfio.h into separate header files David Matlack
2025-10-08 23:25 ` [PATCH 12/12] vfio: selftests: Add vfio_pci_device_init_perf_test David Matlack
2025-10-16 16:12   ` David Matlack
2025-11-05 19:06 ` [PATCH 00/12] vfio: selftests: Support for multi-device tests Alex Williamson
2025-11-05 21:03   ` David Matlack
2025-11-05 21:54     ` Alex Williamson

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=20251008232531.1152035-3-dmatlack@google.com \
    --to=dmatlack@google.com \
    --cc=alex.williamson@redhat.com \
    --cc=jgg@nvidia.com \
    --cc=jrhilke@google.com \
    --cc=kvm@vger.kernel.org \
    --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