* [PATCH v2] vfio: selftests: Remove libuuid dependency
@ 2026-11-02 20:06 Samiullah Khawaja
2026-11-02 22:06 ` David Matlack
0 siblings, 1 reply; 2+ messages in thread
From: Samiullah Khawaja @ 2026-11-02 20:06 UTC (permalink / raw)
To: Alex Williamson, David Matlack
Cc: Shuah Khan, kvm, linux-kselftest, linux-kernel, Samiullah Khawaja
Libvfio depends on an external dependency libuuid for parsing vf_tokens.
Building it in cross compilation environments gives the following error,
ld: cannot find -luuid: No such file or directory
It also complicates building with glibc alternatives like musl, see
https://lore.kernel.org/kvm/c2f7e904-2646-4b01-864d-d185221c7f56@gmail.com/
As it is only used for parsing vf_tokens, remove the dependency by
adding a minimal uuid_t and uuid_parse() to libvfio.
Tested by running vfio_pci_sriov_uapi_test selftest.
Signed-off-by: Samiullah Khawaja <skhawaja@google.com>
---
v2:
- Move the parser to lib/uuid.c and lib/include/libvfio/uuid.h (David)
- Drop the vfio_ prefixes and add a uuid_t (David)
- Mention musl in the commit message (David)
v1: https://lore.kernel.org/all/20260925013110.3447626-1-skhawaja@google.com/
---
.../selftests/vfio/lib/include/libvfio.h | 1 +
.../selftests/vfio/lib/include/libvfio/uuid.h | 11 +++++
tools/testing/selftests/vfio/lib/libvfio.mk | 3 +-
tools/testing/selftests/vfio/lib/uuid.c | 47 +++++++++++++++++++
.../selftests/vfio/lib/vfio_pci_device.c | 2 -
5 files changed, 60 insertions(+), 4 deletions(-)
create mode 100644 tools/testing/selftests/vfio/lib/include/libvfio/uuid.h
create mode 100644 tools/testing/selftests/vfio/lib/uuid.c
diff --git a/tools/testing/selftests/vfio/lib/include/libvfio.h b/tools/testing/selftests/vfio/lib/include/libvfio.h
index 07862b470777..e9d513c3a08e 100644
--- a/tools/testing/selftests/vfio/lib/include/libvfio.h
+++ b/tools/testing/selftests/vfio/lib/include/libvfio.h
@@ -6,6 +6,7 @@
#include <libvfio/iommu.h>
#include <libvfio/iova_allocator.h>
#include <libvfio/sysfs.h>
+#include <libvfio/uuid.h>
#include <libvfio/vfio_pci_device.h>
#include <libvfio/vfio_pci_driver.h>
diff --git a/tools/testing/selftests/vfio/lib/include/libvfio/uuid.h b/tools/testing/selftests/vfio/lib/include/libvfio/uuid.h
new file mode 100644
index 000000000000..52406f3409b7
--- /dev/null
+++ b/tools/testing/selftests/vfio/lib/include/libvfio/uuid.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_UUID_H
+#define SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_UUID_H
+
+#define UUID_SIZE 16
+
+typedef unsigned char uuid_t[UUID_SIZE];
+
+int uuid_parse(const char *in, uuid_t uu);
+
+#endif /* SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_UUID_H */
diff --git a/tools/testing/selftests/vfio/lib/libvfio.mk b/tools/testing/selftests/vfio/lib/libvfio.mk
index eff95828719e..d1d1b2b05af1 100644
--- a/tools/testing/selftests/vfio/lib/libvfio.mk
+++ b/tools/testing/selftests/vfio/lib/libvfio.mk
@@ -7,6 +7,7 @@ LIBVFIO_C := iommu.c
LIBVFIO_C += iova_allocator.c
LIBVFIO_C += libvfio.c
LIBVFIO_C += sysfs.c
+LIBVFIO_C += uuid.c
LIBVFIO_C += vfio_pci_device.c
LIBVFIO_C += vfio_pci_driver.c
@@ -30,8 +31,6 @@ $(LIBVFIO_O_DIRS):
CFLAGS += -I$(LIBVFIO_SRCDIR)/include
-LDLIBS += -luuid
-
$(LIBVFIO_O): $(LIBVFIO_OUTPUT)/%.o : $(LIBVFIO_SRCDIR)/%.c | $(LIBVFIO_O_DIRS)
$(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
diff --git a/tools/testing/selftests/vfio/lib/uuid.c b/tools/testing/selftests/vfio/lib/uuid.c
new file mode 100644
index 000000000000..378904d9340a
--- /dev/null
+++ b/tools/testing/selftests/vfio/lib/uuid.c
@@ -0,0 +1,47 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include <string.h>
+
+#include <libvfio.h>
+
+/*
+ * Minimal replacement for libuuid's uuid_parse(). libuuid is part of
+ * util-linux and is routinely absent from cross-compilation sysroots, which
+ * makes the vfio selftests unbuildable for non-native architectures.
+ */
+#define UUID_STRING_LEN 36
+
+static int hexval(char c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+ return -1;
+}
+
+int uuid_parse(const char *in, uuid_t uu)
+{
+ const char *p = in;
+ int i, hi, lo;
+
+ if (strlen(in) != UUID_STRING_LEN)
+ return -1;
+
+ for (i = 0; i < UUID_SIZE; i++) {
+ if (i == 4 || i == 6 || i == 8 || i == 10) {
+ if (*p++ != '-')
+ return -1;
+ }
+
+ hi = hexval(*p++);
+ lo = hexval(*p++);
+ if (hi < 0 || lo < 0)
+ return -1;
+
+ uu[i] = (hi << 4) | lo;
+ }
+
+ return 0;
+}
diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_device.c b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
index 4063a0e2b3df..4ae6ac1f8ed8 100644
--- a/tools/testing/selftests/vfio/lib/vfio_pci_device.c
+++ b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
@@ -23,8 +23,6 @@
#include <linux/types.h>
#include <linux/vfio.h>
-#include <uuid/uuid.h>
-
#include "kselftest.h"
#include <libvfio.h>
base-commit: 2637bdec0535a2044cd830eba9a79363651d9043
--
2.56.0.385.gac671c819a-goog
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH v2] vfio: selftests: Remove libuuid dependency
2026-11-02 20:06 [PATCH v2] vfio: selftests: Remove libuuid dependency Samiullah Khawaja
@ 2026-11-02 22:06 ` David Matlack
0 siblings, 0 replies; 2+ messages in thread
From: David Matlack @ 2026-11-02 22:06 UTC (permalink / raw)
To: Samiullah Khawaja
Cc: Alex Williamson, Shuah Khan, kvm, linux-kselftest, linux-kernel
On 2026-11-02 08:06 PM, Samiullah Khawaja wrote:
> Libvfio depends on an external dependency libuuid for parsing vf_tokens.
> Building it in cross compilation environments gives the following error,
>
> ld: cannot find -luuid: No such file or directory
>
> It also complicates building with glibc alternatives like musl, see
> https://lore.kernel.org/kvm/c2f7e904-2646-4b01-864d-d185221c7f56@gmail.com/
>
> As it is only used for parsing vf_tokens, remove the dependency by
> adding a minimal uuid_t and uuid_parse() to libvfio.
>
> Tested by running vfio_pci_sriov_uapi_test selftest.
>
> Signed-off-by: Samiullah Khawaja <skhawaja@google.com>
Please lead the commit message with what the patch does, and then follow
up with the background and motivation. The VFIO selftests documentation
(merged for 7.4-rc1) asks contributors to follow the KVM x86 guidelines
for changelogs:
https://docs.kernel.org/driver-api/vfio-selftests.html#contribution-guidelines
https://docs.kernel.org/process/maintainer-kvm-x86.html#changelog
Also please drop the "Tested by ..." line. Details about how you tested
the patch are useful to reviewers, but they do not belong in the commit
message. Put them below the "---" line (e.g. next to the v2 changelog)
instead.
How about something like this:
vfio: selftests: Remove libuuid dependency
Replace libuuid with a minimal uuid_t and uuid_parse() in libvfio, and
drop -luuid from the build. libvfio only uses libuuid to parse VF
tokens, so pulling in an external library is not worth it.
libuuid is often missing from cross-compilation sysroots, which causes
the VFIO selftests to fail to link:
ld: cannot find -luuid: No such file or directory
It also complicates building against glibc alternatives such as musl,
see https://lore.kernel.org/kvm/c2f7e904-2646-4b01-864d-d185221c7f56@gmail.com/
Signed-off-by: Samiullah Khawaja <skhawaja@google.com>
Other than the commit message and the minor comment nit below, the patch
looks good. Feel free to add my R-b tag in v3.
Reviewed-by: David Matlack <dmatlack@google.com>
> ---
> v2:
> - Move the parser to lib/uuid.c and lib/include/libvfio/uuid.h (David)
> - Drop the vfio_ prefixes and add a uuid_t (David)
> - Mention musl in the commit message (David)
>
> v1: https://lore.kernel.org/all/20260925013110.3447626-1-skhawaja@google.com/
> ---
> .../selftests/vfio/lib/include/libvfio.h | 1 +
> .../selftests/vfio/lib/include/libvfio/uuid.h | 11 +++++
> tools/testing/selftests/vfio/lib/libvfio.mk | 3 +-
> tools/testing/selftests/vfio/lib/uuid.c | 47 +++++++++++++++++++
> .../selftests/vfio/lib/vfio_pci_device.c | 2 -
> 5 files changed, 60 insertions(+), 4 deletions(-)
> create mode 100644 tools/testing/selftests/vfio/lib/include/libvfio/uuid.h
> create mode 100644 tools/testing/selftests/vfio/lib/uuid.c
>
> diff --git a/tools/testing/selftests/vfio/lib/include/libvfio.h b/tools/testing/selftests/vfio/lib/include/libvfio.h
> index 07862b470777..e9d513c3a08e 100644
> --- a/tools/testing/selftests/vfio/lib/include/libvfio.h
> +++ b/tools/testing/selftests/vfio/lib/include/libvfio.h
> @@ -6,6 +6,7 @@
> #include <libvfio/iommu.h>
> #include <libvfio/iova_allocator.h>
> #include <libvfio/sysfs.h>
> +#include <libvfio/uuid.h>
> #include <libvfio/vfio_pci_device.h>
> #include <libvfio/vfio_pci_driver.h>
>
> diff --git a/tools/testing/selftests/vfio/lib/include/libvfio/uuid.h b/tools/testing/selftests/vfio/lib/include/libvfio/uuid.h
> new file mode 100644
> index 000000000000..52406f3409b7
> --- /dev/null
> +++ b/tools/testing/selftests/vfio/lib/include/libvfio/uuid.h
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +#ifndef SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_UUID_H
> +#define SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_UUID_H
> +
> +#define UUID_SIZE 16
> +
> +typedef unsigned char uuid_t[UUID_SIZE];
> +
> +int uuid_parse(const char *in, uuid_t uu);
Note that this differs from the kernel's uuid_t, which is a struct, and
the kernel's uuid_parse(), which takes a uuid_t *. I think matching the
libuuid API is the right call since this is userspace code (and it keeps
the callers unchanged), but it would be good to call that out here. The
"Minimal replacement for libuuid's uuid_parse()" comment in uuid.c could
move to this header and mention that uuid_t and uuid_parse() mirror
libuuid, so readers familiar with the kernel API aren't surprised that
uu is not a pointer.
> +
> +#endif /* SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_UUID_H */
> diff --git a/tools/testing/selftests/vfio/lib/libvfio.mk b/tools/testing/selftests/vfio/lib/libvfio.mk
> index eff95828719e..d1d1b2b05af1 100644
> --- a/tools/testing/selftests/vfio/lib/libvfio.mk
> +++ b/tools/testing/selftests/vfio/lib/libvfio.mk
> @@ -7,6 +7,7 @@ LIBVFIO_C := iommu.c
> LIBVFIO_C += iova_allocator.c
> LIBVFIO_C += libvfio.c
> LIBVFIO_C += sysfs.c
> +LIBVFIO_C += uuid.c
> LIBVFIO_C += vfio_pci_device.c
> LIBVFIO_C += vfio_pci_driver.c
>
> @@ -30,8 +31,6 @@ $(LIBVFIO_O_DIRS):
>
> CFLAGS += -I$(LIBVFIO_SRCDIR)/include
>
> -LDLIBS += -luuid
> -
> $(LIBVFIO_O): $(LIBVFIO_OUTPUT)/%.o : $(LIBVFIO_SRCDIR)/%.c | $(LIBVFIO_O_DIRS)
> $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c $< -o $@
>
> diff --git a/tools/testing/selftests/vfio/lib/uuid.c b/tools/testing/selftests/vfio/lib/uuid.c
> new file mode 100644
> index 000000000000..378904d9340a
> --- /dev/null
> +++ b/tools/testing/selftests/vfio/lib/uuid.c
> @@ -0,0 +1,47 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +#include <string.h>
> +
> +#include <libvfio.h>
> +
> +/*
> + * Minimal replacement for libuuid's uuid_parse(). libuuid is part of
> + * util-linux and is routinely absent from cross-compilation sysroots, which
> + * makes the vfio selftests unbuildable for non-native architectures.
> + */
> +#define UUID_STRING_LEN 36
> +
> +static int hexval(char c)
> +{
> + if (c >= '0' && c <= '9')
> + return c - '0';
> + if (c >= 'a' && c <= 'f')
> + return c - 'a' + 10;
> + if (c >= 'A' && c <= 'F')
> + return c - 'A' + 10;
> + return -1;
> +}
> +
> +int uuid_parse(const char *in, uuid_t uu)
> +{
> + const char *p = in;
> + int i, hi, lo;
> +
> + if (strlen(in) != UUID_STRING_LEN)
> + return -1;
> +
> + for (i = 0; i < UUID_SIZE; i++) {
> + if (i == 4 || i == 6 || i == 8 || i == 10) {
> + if (*p++ != '-')
> + return -1;
> + }
> +
> + hi = hexval(*p++);
> + lo = hexval(*p++);
> + if (hi < 0 || lo < 0)
> + return -1;
> +
> + uu[i] = (hi << 4) | lo;
> + }
> +
> + return 0;
> +}
> diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_device.c b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
> index 4063a0e2b3df..4ae6ac1f8ed8 100644
> --- a/tools/testing/selftests/vfio/lib/vfio_pci_device.c
> +++ b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
> @@ -23,8 +23,6 @@
> #include <linux/types.h>
> #include <linux/vfio.h>
>
> -#include <uuid/uuid.h>
> -
> #include "kselftest.h"
> #include <libvfio.h>
>
>
> base-commit: 2637bdec0535a2044cd830eba9a79363651d9043
> --
> 2.56.0.385.gac671c819a-goog
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-11-02 22:06 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-02 20:06 [PATCH v2] vfio: selftests: Remove libuuid dependency Samiullah Khawaja
2026-11-02 22:06 ` David Matlack
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®