Re: [PATCH v3 3/8] vfio: selftests: Introduce a sysfs lib
From: Raghavendra Rao Ananta
Date: Tue Feb 24 2026 - 13:34:00 EST
On Fri, Feb 6, 2026 at 12:48 PM Alex Williamson <alex@xxxxxxxxxxx> wrote:
>
> On Wed, 4 Feb 2026 01:00:52 +0000
> Raghavendra Rao Ananta <rananta@xxxxxxxxxx> wrote:
>
> > Introduce a sysfs library to handle the common reads/writes to the
> > PCI sysfs files, for example, getting the total number of VFs supported
> > by the device via /sys/bus/pci/devices/$BDF/sriov_totalvfs. The library
> > will be used in the upcoming test patch to configure the VFs for a given
> > PF device.
> >
> > Opportunistically, move vfio_pci_get_group_from_dev() to this library as
> > it falls under the same bucket. Rename it to sysfs_iommu_group_get() to
> > align with other function names.
> >
> > Signed-off-by: Raghavendra Rao Ananta <rananta@xxxxxxxxxx>
> > ---
> > .../selftests/vfio/lib/include/libvfio.h | 1 +
> > .../vfio/lib/include/libvfio/sysfs.h | 12 ++
> > tools/testing/selftests/vfio/lib/libvfio.mk | 1 +
> > tools/testing/selftests/vfio/lib/sysfs.c | 136 ++++++++++++++++++
> > .../selftests/vfio/lib/vfio_pci_device.c | 22 +--
> > 5 files changed, 151 insertions(+), 21 deletions(-)
> > create mode 100644 tools/testing/selftests/vfio/lib/include/libvfio/sysfs.h
> > create mode 100644 tools/testing/selftests/vfio/lib/sysfs.c
> >
> > diff --git a/tools/testing/selftests/vfio/lib/include/libvfio.h b/tools/testing/selftests/vfio/lib/include/libvfio.h
> > index 279ddcd70194..bbe1d7616a64 100644
> > --- a/tools/testing/selftests/vfio/lib/include/libvfio.h
> > +++ b/tools/testing/selftests/vfio/lib/include/libvfio.h
> > @@ -5,6 +5,7 @@
> > #include <libvfio/assert.h>
> > #include <libvfio/iommu.h>
> > #include <libvfio/iova_allocator.h>
> > +#include <libvfio/sysfs.h>
> > #include <libvfio/vfio_pci_device.h>
> > #include <libvfio/vfio_pci_driver.h>
> >
> > diff --git a/tools/testing/selftests/vfio/lib/include/libvfio/sysfs.h b/tools/testing/selftests/vfio/lib/include/libvfio/sysfs.h
> > new file mode 100644
> > index 000000000000..c48d5ef00ba6
> > --- /dev/null
> > +++ b/tools/testing/selftests/vfio/lib/include/libvfio/sysfs.h
> > @@ -0,0 +1,12 @@
> > +/* SPDX-License-Identifier: GPL-2.0-only */
> > +#ifndef SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_SYSFS_H
> > +#define SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_SYSFS_H
> > +
> > +int sysfs_sriov_totalvfs_get(const char *bdf);
> > +int sysfs_sriov_numvfs_get(const char *bdf);
> > +void sysfs_sriov_numvfs_set(const char *bdfs, int numvfs);
> > +char *sysfs_sriov_vf_bdf_get(const char *pf_bdf, int i);
> > +unsigned int sysfs_iommu_group_get(const char *bdf);
> > +char *sysfs_driver_get(const char *bdf);
> > +
> > +#endif /* SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_SYSFS_H */
> > diff --git a/tools/testing/selftests/vfio/lib/libvfio.mk b/tools/testing/selftests/vfio/lib/libvfio.mk
> > index 9f47bceed16f..b7857319c3f1 100644
> > --- a/tools/testing/selftests/vfio/lib/libvfio.mk
> > +++ b/tools/testing/selftests/vfio/lib/libvfio.mk
> > @@ -6,6 +6,7 @@ LIBVFIO_SRCDIR := $(selfdir)/vfio/lib
> > LIBVFIO_C := iommu.c
> > LIBVFIO_C += iova_allocator.c
> > LIBVFIO_C += libvfio.c
> > +LIBVFIO_C += sysfs.c
> > LIBVFIO_C += vfio_pci_device.c
> > LIBVFIO_C += vfio_pci_driver.c
> >
> > diff --git a/tools/testing/selftests/vfio/lib/sysfs.c b/tools/testing/selftests/vfio/lib/sysfs.c
> > new file mode 100644
> > index 000000000000..f01598ff15d7
> > --- /dev/null
> > +++ b/tools/testing/selftests/vfio/lib/sysfs.c
> > @@ -0,0 +1,136 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +#include <fcntl.h>
> > +#include <unistd.h>
> > +#include <stdlib.h>
> > +#include <string.h>
> > +#include <linux/limits.h>
> > +
> > +#include <libvfio.h>
> > +
> > +static int sysfs_val_get(const char *component, const char *name,
> > + const char *file)
> > +{
> > + char path[PATH_MAX];
> > + char buf[32];
> > + int fd;
> > +
> > + snprintf_assert(path, PATH_MAX, "/sys/bus/pci/%s/%s/%s", component, name, file);
> > + fd = open(path, O_RDONLY);
> > + if (fd < 0)
> > + return fd;
> > +
> > + VFIO_ASSERT_GT(read(fd, buf, ARRAY_SIZE(buf)), 0);
> > + VFIO_ASSERT_EQ(close(fd), 0);
> > +
> > + return strtol(buf, NULL, 0);
>
> I'm surprised we're not sanitizing the strtol() here, ie.
>
> errno = 0;
> ret = strtol(buf, NULL, 0);
> VFIO_ASSERT_EQ(errno, 0, "sysfs path \"%s\" is not an integer: \"%s\"\n", path, buf);
>
> return ret;
>
Thanks for the suggestion. I've applied this in v4 and renamed the
function to sysfs_val_get_int() to make things clear.
- Raghavendra