All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Mastro <amastro@fb.com>
To: David Matlack <dmatlack@google.com>
Cc: Alex Williamson <alex@shazbot.org>, Shuah Khan <shuah@kernel.org>,
	Raghavendra Rao Ananta <rananta@google.com>,
	Vipin Sharma <vipinsh@google.com>, <kvm@vger.kernel.org>,
	<linux-kselftest@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	Shuah Khan <skhan@linuxfoundation.org>
Subject: Re: [PATCH v3 1/2] vfio: selftests: Add calloc_assert() helper
Date: Tue, 16 Jun 2026 09:04:38 -0700	[thread overview]
Message-ID: <ajF0Fistyj7SXlDi@devgpu015.cco6.facebook.com> (raw)
In-Reply-To: <CALzav=ekpRKjyUTNax17SRMHg21OHa4Jq3OGzu+Y0TXW12EeJQ@mail.gmail.com>

On Mon, Jun 15, 2026 at 03:51:26PM -0700, David Matlack wrote:
> On Mon, Jun 15, 2026 at 12:45 PM Alex Mastro <amastro@fb.com> wrote:
> >
> > Add a calloc_assert() helper alongside the existing ioctl_assert() and
> > snprintf_assert() helpers.
> >
> > Use it for VFIO selftest allocations that immediately assert a
> > non-NULL result.
> >
> > Assisted-by: Codex:gpt-5.5-high
> > Signed-off-by: Alex Mastro <amastro@fb.com>
> > ---
> >  tools/testing/selftests/vfio/lib/include/libvfio/assert.h    | 10 ++++++++++
> >  tools/testing/selftests/vfio/lib/iommu.c                     | 12 ++++--------
> >  tools/testing/selftests/vfio/lib/iova_allocator.c            |  4 +---
> >  tools/testing/selftests/vfio/lib/sysfs.c                     |  3 +--
> >  tools/testing/selftests/vfio/lib/vfio_pci_device.c           |  6 ++----
> >  .../testing/selftests/vfio/vfio_pci_device_init_perf_test.c  |  4 ++--
> >  6 files changed, 20 insertions(+), 19 deletions(-)
> >
> > diff --git a/tools/testing/selftests/vfio/lib/include/libvfio/assert.h b/tools/testing/selftests/vfio/lib/include/libvfio/assert.h
> > index 77b68c7129a6..f0490a403826 100644
> > --- a/tools/testing/selftests/vfio/lib/include/libvfio/assert.h
> > +++ b/tools/testing/selftests/vfio/lib/include/libvfio/assert.h
> > @@ -3,6 +3,7 @@
> >  #define SELFTESTS_VFIO_LIB_INCLUDE_LIBVFIO_ASSERT_H
> >
> >  #include <stdio.h>
> > +#include <stdlib.h>
> >  #include <string.h>
> >  #include <sys/ioctl.h>
> >
> > @@ -45,6 +46,15 @@
> >         VFIO_LOG_AND_EXIT(_fmt, ##__VA_ARGS__);                 \
> >  } while (0)
> >
> > +#define calloc_assert(_nmemb, _size) ({                                \
> > +       size_t __nmemb = (_nmemb);                              \
> > +       size_t __size = (_size);                                \
> > +       void *__ptr = calloc(__nmemb, __size);                  \
> > +       VFIO_ASSERT_NOT_NULL(__ptr, "calloc(%zu, %zu) failed",  \
> > +                            __nmemb, __size);                  \
> > +       __ptr;                                                  \
> > +})
> > +
> >  #define ioctl_assert(_fd, _op, _arg) do {                                                     \
> >         void *__arg = (_arg);                                                                  \
> >         int __ret = ioctl((_fd), (_op), (__arg));                                              \
> > diff --git a/tools/testing/selftests/vfio/lib/iommu.c b/tools/testing/selftests/vfio/lib/iommu.c
> > index 035dac069d60..31aba9fda8e5 100644
> > --- a/tools/testing/selftests/vfio/lib/iommu.c
> > +++ b/tools/testing/selftests/vfio/lib/iommu.c
> > @@ -286,8 +286,7 @@ static struct vfio_iommu_type1_info *vfio_iommu_get_info(int container_fd)
> >  {
> >         struct vfio_iommu_type1_info *info;
> >
> > -       info = malloc(sizeof(*info));
> > -       VFIO_ASSERT_NOT_NULL(info);
> > +       info = calloc_assert(1, sizeof(*info));
> >
> >         *info = (struct vfio_iommu_type1_info) {
> >                 .argsz = sizeof(*info),
> > @@ -324,8 +323,7 @@ static struct iommu_iova_range *vfio_iommu_iova_ranges(struct iommu *iommu,
> >         cap_range = container_of(hdr, struct vfio_iommu_type1_info_cap_iova_range, header);
> >         VFIO_ASSERT_GT(cap_range->nr_iovas, 0);
> >
> > -       ranges = calloc(cap_range->nr_iovas, sizeof(*ranges));
> > -       VFIO_ASSERT_NOT_NULL(ranges);
> > +       ranges = calloc_assert(cap_range->nr_iovas, sizeof(*ranges));
> >
> >         for (u32 i = 0; i < cap_range->nr_iovas; i++) {
> >                 ranges[i] = (struct iommu_iova_range){
> > @@ -357,8 +355,7 @@ static struct iommu_iova_range *iommufd_iova_ranges(struct iommu *iommu,
> >         VFIO_ASSERT_EQ(errno, EMSGSIZE);
> >         VFIO_ASSERT_GT(query.num_iovas, 0);
> >
> > -       ranges = calloc(query.num_iovas, sizeof(*ranges));
> > -       VFIO_ASSERT_NOT_NULL(ranges);
> > +       ranges = calloc_assert(query.num_iovas, sizeof(*ranges));
> >
> >         query.allowed_iovas = (uintptr_t)ranges;
> >
> > @@ -424,8 +421,7 @@ struct iommu *iommu_init(const char *iommu_mode)
> >         struct iommu *iommu;
> >         int version;
> >
> > -       iommu = calloc(1, sizeof(*iommu));
> > -       VFIO_ASSERT_NOT_NULL(iommu);
> > +       iommu = calloc_assert(1, sizeof(*iommu));
> >
> >         INIT_LIST_HEAD(&iommu->dma_regions);
> >
> > diff --git a/tools/testing/selftests/vfio/lib/iova_allocator.c b/tools/testing/selftests/vfio/lib/iova_allocator.c
> > index 8c1cc86b70cd..2e7d54e1b4c6 100644
> > --- a/tools/testing/selftests/vfio/lib/iova_allocator.c
> > +++ b/tools/testing/selftests/vfio/lib/iova_allocator.c
> > @@ -29,8 +29,7 @@ struct iova_allocator *iova_allocator_init(struct iommu *iommu)
> >         ranges = iommu_iova_ranges(iommu, &nranges);
> >         VFIO_ASSERT_NOT_NULL(ranges);
> >
> > -       allocator = malloc(sizeof(*allocator));
> > -       VFIO_ASSERT_NOT_NULL(allocator);
> > +       allocator = calloc_assert(1, sizeof(*allocator));
> 
> Did you mean to replace malloc() with calloc()? Feel free to add a
> malloc_assert().

Yes! Since all malloc() can be expressed as calloc() (because we shouldn't care
about potentially redundant zeroing overhead), I think the single
calloc_assert() is fine.

> 
> >
> >         *allocator = (struct iova_allocator){
> >                 .ranges = ranges,
> > @@ -90,4 +89,3 @@ iova_t iova_allocator_alloc(struct iova_allocator *allocator, size_t size)
> >                 allocator->range_offset = 0;
> >         }
> >  }
> > -
> > diff --git a/tools/testing/selftests/vfio/lib/sysfs.c b/tools/testing/selftests/vfio/lib/sysfs.c
> > index 11415448b2e2..98a46a2543cd 100644
> > --- a/tools/testing/selftests/vfio/lib/sysfs.c
> > +++ b/tools/testing/selftests/vfio/lib/sysfs.c
> > @@ -107,8 +107,7 @@ char *sysfs_sriov_vf_bdf_get(const char *pf_bdf, int i)
> >         char *out_vf_bdf;
> >
> >         /* Fit "0000:00:00.0" */
> > -       out_vf_bdf = calloc(16, sizeof(char));
> > -       VFIO_ASSERT_NOT_NULL(out_vf_bdf);
> > +       out_vf_bdf = calloc_assert(16, sizeof(char));
> >
> >         snprintf_assert(path, PATH_MAX, "/sys/bus/pci/devices/%s/virtfn%d", pf_bdf, i);
> >         readlink_base(path, "%s", out_vf_bdf);
> > diff --git a/tools/testing/selftests/vfio/lib/vfio_pci_device.c b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
> > index 94dc5fcecbeb..eb40f7159bae 100644
> > --- a/tools/testing/selftests/vfio/lib/vfio_pci_device.c
> > +++ b/tools/testing/selftests/vfio/lib/vfio_pci_device.c
> > @@ -343,8 +343,7 @@ const char *vfio_pci_get_cdev_path(const char *bdf)
> >         char *cdev_path;
> >         DIR *dir;
> >
> > -       cdev_path = calloc(PATH_MAX, 1);
> > -       VFIO_ASSERT_NOT_NULL(cdev_path);
> > +       cdev_path = calloc_assert(PATH_MAX, 1);
> >
> >         snprintf_assert(dir_path, sizeof(dir_path), "/sys/bus/pci/devices/%s/vfio-dev/", bdf);
> >
> > @@ -425,8 +424,7 @@ struct vfio_pci_device *vfio_pci_device_alloc(const char *bdf, struct iommu *iom
> >  {
> >         struct vfio_pci_device *device;
> >
> > -       device = calloc(1, sizeof(*device));
> > -       VFIO_ASSERT_NOT_NULL(device);
> > +       device = calloc_assert(1, sizeof(*device));
> >
> >         VFIO_ASSERT_NOT_NULL(iommu);
> >         device->iommu = iommu;
> > diff --git a/tools/testing/selftests/vfio/vfio_pci_device_init_perf_test.c b/tools/testing/selftests/vfio/vfio_pci_device_init_perf_test.c
> > index 33b0c31fe2ed..e1a54e153cd3 100644
> > --- a/tools/testing/selftests/vfio/vfio_pci_device_init_perf_test.c
> > +++ b/tools/testing/selftests/vfio/vfio_pci_device_init_perf_test.c
> > @@ -45,8 +45,8 @@ FIXTURE_SETUP(vfio_pci_device_init_perf_test)
> >         int i;
> >
> >         self->iommu = iommu_init(variant->iommu_mode);
> > -       self->threads = calloc(nr_devices, sizeof(self->threads[0]));
> > -       self->thread_args = calloc(nr_devices, sizeof(self->thread_args[0]));
> > +       self->threads = calloc_assert(nr_devices, sizeof(self->threads[0]));
> > +       self->thread_args = calloc_assert(nr_devices, sizeof(self->thread_args[0]));
> >
> >         pthread_barrier_init(&self->barrier, NULL, nr_devices);
> >
> >
> > --
> > 2.53.0-Meta
> >

  reply	other threads:[~2026-06-16 16:04 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-06-15 19:44 [PATCH v3 0/2] vfio: selftests: Add calloc_assert() and avoid VLAs Alex Mastro
2026-06-15 19:44 ` [PATCH v3 1/2] vfio: selftests: Add calloc_assert() helper Alex Mastro
2026-06-15 22:51   ` David Matlack
2026-06-16 16:04     ` Alex Mastro [this message]
2026-06-15 19:44 ` [PATCH v3 2/2] vfio: selftests: Avoid VLAs Alex Mastro
2026-06-15 22:56   ` 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=ajF0Fistyj7SXlDi@devgpu015.cco6.facebook.com \
    --to=amastro@fb.com \
    --cc=alex@shazbot.org \
    --cc=dmatlack@google.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=rananta@google.com \
    --cc=shuah@kernel.org \
    --cc=skhan@linuxfoundation.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.