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. -- Thanks, Mina
