tools/testing/selftests/drivers/dma-buf/udmabuf.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
udmabuf's test 6 and 7 is intended to verify the behavior of 2MB huge pages migration,
but the helper function still calculates the size using standard (4KB) pages.
Signed-off-by: zishun yi <zishun.yi.dev@gmail.com>
---
tools/testing/selftests/drivers/dma-buf/udmabuf.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/tools/testing/selftests/drivers/dma-buf/udmabuf.c b/tools/testing/selftests/drivers/dma-buf/udmabuf.c
index d78aec662586..8887fb9b79df 100644
--- a/tools/testing/selftests/drivers/dma-buf/udmabuf.c
+++ b/tools/testing/selftests/drivers/dma-buf/udmabuf.c
@@ -69,7 +69,7 @@ static int create_udmabuf_list(int devfd, int memfd, off64_t memfd_size)
for (i = 0; i < NUM_ENTRIES; i++) {
list->list[i].memfd = memfd;
list->list[i].offset = i * (memfd_size / NUM_ENTRIES);
- list->list[i].size = getpagesize() * NUM_PAGES;
+ list->list[i].size = page_size * NUM_PAGES;
}
list->count = NUM_ENTRIES;
@@ -115,8 +115,8 @@ static int compare_chunks(void *addr1, void *addr2, off64_t memfd_size)
while (i < NUM_ENTRIES) {
off = i * (memfd_size / NUM_ENTRIES);
for (j = 0; j < NUM_PAGES; j++, k++) {
- char1 = *((char *)addr1 + off + (j * getpagesize()));
- char2 = *((char *)addr2 + (k * getpagesize()));
+ char1 = *((char *)addr1 + off + (j * page_size));
+ char2 = *((char *)addr2 + (k * page_size));
if (char1 != char2) {
ret = -1;
goto err;
@@ -126,7 +126,7 @@ static int compare_chunks(void *addr1, void *addr2, off64_t memfd_size)
}
err:
munmap(addr1, memfd_size);
- munmap(addr2, NUM_ENTRIES * NUM_PAGES * getpagesize());
+ munmap(addr2, NUM_ENTRIES * NUM_PAGES * page_size);
return ret;
}
@@ -240,7 +240,7 @@ int main(int argc, char *argv[])
addr1 = mmap_fd(memfd, size);
write_to_memfd(addr1, size, 'a');
buf = create_udmabuf_list(devfd, memfd, size);
- addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * getpagesize());
+ addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * page_size);
write_to_memfd(addr1, size, 'b');
ret = compare_chunks(addr1, addr2, size);
if (ret < 0)
@@ -256,7 +256,7 @@ int main(int argc, char *argv[])
size = MEMFD_SIZE * page_size;
memfd = create_memfd_with_seals(size, true);
buf = create_udmabuf_list(devfd, memfd, size);
- addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * getpagesize());
+ addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * page_size);
addr1 = mmap_fd(memfd, size);
write_to_memfd(addr1, size, 'a');
write_to_memfd(addr1, size, 'b');
--
2.52.0
On Sun, 18 Jan 2026 21:51:26 +0800 zishun yi <zishun.yi.dev@gmail.com> wrote:
> udmabuf's test 6 and 7 is intended to verify the behavior of 2MB huge pages migration,
> but the helper function still calculates the size using standard (4KB) pages.
>
lgtm. Vivek, can you please check it? Feel free to merge into another
tree and I'll drop the mm.git ccopy.
> --- a/tools/testing/selftests/drivers/dma-buf/udmabuf.c
> +++ b/tools/testing/selftests/drivers/dma-buf/udmabuf.c
> @@ -69,7 +69,7 @@ static int create_udmabuf_list(int devfd, int memfd, off64_t memfd_size)
> for (i = 0; i < NUM_ENTRIES; i++) {
> list->list[i].memfd = memfd;
> list->list[i].offset = i * (memfd_size / NUM_ENTRIES);
> - list->list[i].size = getpagesize() * NUM_PAGES;
> + list->list[i].size = page_size * NUM_PAGES;
> }
>
> list->count = NUM_ENTRIES;
> @@ -115,8 +115,8 @@ static int compare_chunks(void *addr1, void *addr2, off64_t memfd_size)
> while (i < NUM_ENTRIES) {
> off = i * (memfd_size / NUM_ENTRIES);
> for (j = 0; j < NUM_PAGES; j++, k++) {
> - char1 = *((char *)addr1 + off + (j * getpagesize()));
> - char2 = *((char *)addr2 + (k * getpagesize()));
> + char1 = *((char *)addr1 + off + (j * page_size));
> + char2 = *((char *)addr2 + (k * page_size));
> if (char1 != char2) {
> ret = -1;
> goto err;
> @@ -126,7 +126,7 @@ static int compare_chunks(void *addr1, void *addr2, off64_t memfd_size)
> }
> err:
> munmap(addr1, memfd_size);
> - munmap(addr2, NUM_ENTRIES * NUM_PAGES * getpagesize());
> + munmap(addr2, NUM_ENTRIES * NUM_PAGES * page_size);
> return ret;
> }
>
> @@ -240,7 +240,7 @@ int main(int argc, char *argv[])
> addr1 = mmap_fd(memfd, size);
> write_to_memfd(addr1, size, 'a');
> buf = create_udmabuf_list(devfd, memfd, size);
> - addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * getpagesize());
> + addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * page_size);
> write_to_memfd(addr1, size, 'b');
> ret = compare_chunks(addr1, addr2, size);
> if (ret < 0)
> @@ -256,7 +256,7 @@ int main(int argc, char *argv[])
> size = MEMFD_SIZE * page_size;
> memfd = create_memfd_with_seals(size, true);
> buf = create_udmabuf_list(devfd, memfd, size);
> - addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * getpagesize());
> + addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * page_size);
> addr1 = mmap_fd(memfd, size);
> write_to_memfd(addr1, size, 'a');
> write_to_memfd(addr1, size, 'b');
> --
> 2.52.0
Hi Andrew, Zishun Yi,
> Subject: Re: [PATCH v1] selftests: udmabuf: fix hugepage size calculation
>
> On Sun, 18 Jan 2026 21:51:26 +0800 zishun yi <zishun.yi.dev@gmail.com>
> wrote:
>
> > udmabuf's test 6 and 7 is intended to verify the behavior of 2MB huge
> pages migration,
> > but the helper function still calculates the size using standard (4KB)
> pages.
This behavior is intentional given that a udmabuf is often created for memfd
ranges that do not coincide with huge page (size) boundaries. In other words,
udmabuf is not always populated with full huge pages. Instead, the ranges
mostly align with regular 4K sized page boundaries (which means subpages of
huge page), which is exactly what the tests verify.
> >
>
> lgtm. Vivek, can you please check it? Feel free to merge into another
> tree and I'll drop the mm.git ccopy.
I think you can go ahead and drop it as this patch is not fixing a bug but is
modifying the tests' behavior to create the udmabuf with huge page sized
chunks which, although not wrong, but is not the intended objective for the
given tests.
Thanks,
Vivek
>
> > --- a/tools/testing/selftests/drivers/dma-buf/udmabuf.c
> > +++ b/tools/testing/selftests/drivers/dma-buf/udmabuf.c
> > @@ -69,7 +69,7 @@ static int create_udmabuf_list(int devfd, int
> memfd, off64_t memfd_size)
> > for (i = 0; i < NUM_ENTRIES; i++) {
> > list->list[i].memfd = memfd;
> > list->list[i].offset = i * (memfd_size / NUM_ENTRIES);
> > - list->list[i].size = getpagesize() * NUM_PAGES;
> > + list->list[i].size = page_size * NUM_PAGES;
> > }
> >
> > list->count = NUM_ENTRIES;
> > @@ -115,8 +115,8 @@ static int compare_chunks(void *addr1, void
> *addr2, off64_t memfd_size)
> > while (i < NUM_ENTRIES) {
> > off = i * (memfd_size / NUM_ENTRIES);
> > for (j = 0; j < NUM_PAGES; j++, k++) {
> > - char1 = *((char *)addr1 + off + (j * getpagesize()));
> > - char2 = *((char *)addr2 + (k * getpagesize()));
> > + char1 = *((char *)addr1 + off + (j * page_size));
> > + char2 = *((char *)addr2 + (k * page_size));
> > if (char1 != char2) {
> > ret = -1;
> > goto err;
> > @@ -126,7 +126,7 @@ static int compare_chunks(void *addr1, void
> *addr2, off64_t memfd_size)
> > }
> > err:
> > munmap(addr1, memfd_size);
> > - munmap(addr2, NUM_ENTRIES * NUM_PAGES * getpagesize());
> > + munmap(addr2, NUM_ENTRIES * NUM_PAGES * page_size);
> > return ret;
> > }
> >
> > @@ -240,7 +240,7 @@ int main(int argc, char *argv[])
> > addr1 = mmap_fd(memfd, size);
> > write_to_memfd(addr1, size, 'a');
> > buf = create_udmabuf_list(devfd, memfd, size);
> > - addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES *
> getpagesize());
> > + addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * page_size);
> > write_to_memfd(addr1, size, 'b');
> > ret = compare_chunks(addr1, addr2, size);
> > if (ret < 0)
> > @@ -256,7 +256,7 @@ int main(int argc, char *argv[])
> > size = MEMFD_SIZE * page_size;
> > memfd = create_memfd_with_seals(size, true);
> > buf = create_udmabuf_list(devfd, memfd, size);
> > - addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES *
> getpagesize());
> > + addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * page_size);
> > addr1 = mmap_fd(memfd, size);
> > write_to_memfd(addr1, size, 'a');
> > write_to_memfd(addr1, size, 'b');
> > --
> > 2.52.0
On Thu, Jan 22, 2026 at 06:47:54AM +0000, Kasireddy, Vivek wrote: > This behavior is intentional given that a udmabuf is often created for memfd > ranges that do not coincide with huge page (size) boundaries. In other words, > udmabuf is not always populated with full huge pages. Instead, the ranges > mostly align with regular 4K sized page boundaries (which means subpages of > huge page), which is exactly what the tests verify. Thanks for the clarification. I agree with dropping this patch. Thanks for your review. Best regards, Zishun
On Thu, 22 Jan 2026 06:47:54 +0000 "Kasireddy, Vivek" <vivek.kasireddy@intel.com> wrote: > > > > > > > lgtm. Vivek, can you please check it? Feel free to merge into another > > tree and I'll drop the mm.git ccopy. > I think you can go ahead and drop it as this patch is not fixing a bug but is > modifying the tests' behavior to create the udmabuf with huge page sized > chunks which, although not wrong, but is not the intended objective for the > given tests. Great, thanks, I've removed this patch from mm.git.
© 2016 - 2026 Red Hat, Inc.