On Wed, Dec 3, 2025 at 4:05 PM T.J. Mercier <[email protected]> wrote: > > If many dmabufs are present, reads of the dmabuf iterator can be > truncated at PAGE_SIZE or user buffer size boundaries before the fix in > "selftests/bpf: Add test for open coded dmabuf_iter".
Copy/paste error here. This should be "bpf: Fix truncated dmabuf iterator reads" from the previous commit in patch 1. I didn't include the sha because I don't think they're guaranteed to be stable at this point. I also saw the warning from CI about the extra newline before subtest_dmabuf_iter_check_open_coded, but the current CI failures look unrelated to this change. Add a test to > confirm truncation does not occur. > > Signed-off-by: T.J. Mercier <[email protected]> > --- > .../selftests/bpf/prog_tests/dmabuf_iter.c | 47 +++++++++++++++++-- > 1 file changed, 42 insertions(+), 5 deletions(-) > > diff --git a/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c > b/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c > index 6c2b0c3dbcd8..e442be9dde7e 100644 > --- a/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c > +++ b/tools/testing/selftests/bpf/prog_tests/dmabuf_iter.c > @@ -73,12 +73,10 @@ static int create_udmabuf(void) > return -1; > } > > -static int create_sys_heap_dmabuf(void) > +static int create_sys_heap_dmabuf(size_t bytes) > { > - sysheap_test_buffer_size = 20 * getpagesize(); > - > struct dma_heap_allocation_data data = { > - .len = sysheap_test_buffer_size, > + .len = bytes, > .fd = 0, > .fd_flags = O_RDWR | O_CLOEXEC, > .heap_flags = 0, > @@ -110,7 +108,9 @@ static int create_sys_heap_dmabuf(void) > static int create_test_buffers(void) > { > udmabuf = create_udmabuf(); > - sysheap_dmabuf = create_sys_heap_dmabuf(); > + > + sysheap_test_buffer_size = 20 * getpagesize(); > + sysheap_dmabuf = create_sys_heap_dmabuf(sysheap_test_buffer_size); > > if (udmabuf < 0 || sysheap_dmabuf < 0) > return -1; > @@ -219,6 +219,26 @@ static void > subtest_dmabuf_iter_check_default_iter(struct dmabuf_iter *skel) > close(iter_fd); > } > > +static void subtest_dmabuf_iter_check_lots_of_buffers(struct dmabuf_iter > *skel) > +{ > + int iter_fd; > + char buf[1024]; > + size_t total_bytes_read = 0; > + ssize_t bytes_read; > + > + iter_fd = bpf_iter_create(bpf_link__fd(skel->links.dmabuf_collector)); > + if (!ASSERT_OK_FD(iter_fd, "iter_create")) > + return; > + > + while ((bytes_read = read(iter_fd, buf, sizeof(buf))) > 0) > + total_bytes_read += bytes_read; > + > + ASSERT_GT(total_bytes_read, getpagesize(), "total_bytes_read"); > + > + close(iter_fd); > +} > + > + > static void subtest_dmabuf_iter_check_open_coded(struct dmabuf_iter *skel, > int map_fd) > { > LIBBPF_OPTS(bpf_test_run_opts, topts); > @@ -275,6 +295,23 @@ void test_dmabuf_iter(void) > subtest_dmabuf_iter_check_no_infinite_reads(skel); > if (test__start_subtest("default_iter")) > subtest_dmabuf_iter_check_default_iter(skel); > + if (test__start_subtest("lots_of_buffers")) { > + size_t NUM_BUFS = 100; > + int buffers[NUM_BUFS]; > + int i; > + > + for (i = 0; i < NUM_BUFS; ++i) { > + buffers[i] = create_sys_heap_dmabuf(getpagesize()); > + if (!ASSERT_OK_FD(buffers[i], "dmabuf_fd")) > + goto cleanup_bufs; > + } > + > + subtest_dmabuf_iter_check_lots_of_buffers(skel); > + > +cleanup_bufs: > + for (--i; i >= 0; --i) > + close(buffers[i]); > + } > if (test__start_subtest("open_coded")) > subtest_dmabuf_iter_check_open_coded(skel, map_fd); > > -- > 2.52.0.177.g9f829587af-goog >
