On Mon, Jul 20, 2026 at 02:15:42PM -0700, Mina Almasry wrote: > On Wed, Jul 8, 2026 at 3:55 PM Bobby Eshleman <[email protected]> wrote: > > > > From: Bobby Eshleman <[email protected]> > > > > Add -b <bytes> to request a non-default niov size via > > NETDEV_A_DMABUF_RX_BUF_SIZE. When the value exceeds PAGE_SIZE, > > udmabuf_alloc() switches to an MFD_HUGETLB-backed memfd so each 2 MB > > hugepage produces one naturally-aligned sg entry. > > > > Signed-off-by: Bobby Eshleman <[email protected]> > > Acked-by: Stanislav Fomichev <[email protected]> > > Reviewed-by: Mina Almasry <[email protected]> > > > > --- > > tools/testing/selftests/drivers/net/hw/ncdevmem.c | 36 > > +++++++++++++++++++++-- > > 1 file changed, 33 insertions(+), 3 deletions(-) > > > > diff --git a/tools/testing/selftests/drivers/net/hw/ncdevmem.c > > b/tools/testing/selftests/drivers/net/hw/ncdevmem.c > > index d96e8a3b5a65..a16e55af51ee 100644 > > --- a/tools/testing/selftests/drivers/net/hw/ncdevmem.c > > +++ b/tools/testing/selftests/drivers/net/hw/ncdevmem.c > > @@ -40,6 +40,7 @@ > > > > #include <linux/uio.h> > > #include <stdarg.h> > > +#include <stdint.h> > > #include <stdio.h> > > #include <stdlib.h> > > #include <unistd.h> > > @@ -61,6 +62,7 @@ > > #include <sys/time.h> > > > > #include <linux/memfd.h> > > +#include <sys/param.h> > > #include <linux/dma-buf.h> > > #include <linux/errqueue.h> > > #include <linux/udmabuf.h> > > @@ -79,6 +81,7 @@ > > #define PAGE_SHIFT 12 > > #define TEST_PREFIX "ncdevmem" > > #define NUM_PAGES 16000 > > +#define MB(x) ((x) << 20) > > > > #ifndef MSG_SOCK_DEVMEM > > #define MSG_SOCK_DEVMEM 0x2000000 > > @@ -100,6 +103,7 @@ static unsigned int dmabuf_id; > > static uint32_t tx_dmabuf_id; > > static int waittime_ms = 500; > > static bool fail_on_linear; > > +static uint32_t rx_buf_size; > > > > /* System state loaded by current_config_load() */ > > #define MAX_FLOWS 8 > > @@ -142,6 +146,7 @@ static struct memory_buffer *udmabuf_alloc(size_t size) > > { > > struct udmabuf_create create; > > struct memory_buffer *ctx; > > + unsigned int memfd_flags; > > int ret; > > > > ctx = malloc(sizeof(*ctx)); > > @@ -156,9 +161,14 @@ static struct memory_buffer *udmabuf_alloc(size_t size) > > goto err_free_ctx; > > } > > > > - ctx->memfd = memfd_create("udmabuf-test", MFD_ALLOW_SEALING); > > + memfd_flags = MFD_ALLOW_SEALING; > > + if (rx_buf_size > getpagesize()) > > + memfd_flags |= MFD_HUGETLB | MFD_HUGE_2MB; > > + > > The fact that you are using HUGETLM and 2MB mappings here made me > realize there is a pathological edge case in the code where the netmem > size you're requesting is greater than the mapping size, so you > actually get no netmems. So like if you ask for a 64KB netmem size but > actually you did a normal udambuf mapping and all the maps (sg len > entries) are 4K or something. IDK if the code already handles this > well with an error or what not. Worth checking.
If I follow you correctly, in the case of sg len == 4K, and requested size of 64K, it will fail the !IS_ALIGNED(len=4k, niov_size=64K) check and return -EINVAL. > > -- > Thanks, > Mina Thanks for the review Mina! Best, Bobby
