On Wed, Dec 3, 2025 at 4:05 PM T.J. Mercier tjmercier@google.com 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 tjmercier@google.com
.../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