bpf: Fix the test_task_vma selftest to support output shorter than 1 kB
[ Upstream commitda54ab1495
] The test for bpf_iter_task_vma assumes that the output will be longer than 1 kB, as the comment above the loop says. Due to this assumption, the loop becomes infinite if the output turns to be shorter than 1 kB. The return value of read_fd_into_buffer is 0 when the end of file was reached, and len isn't being increased any more. This commit adds a break on EOF to handle short output correctly. For the reference, this is the contents that I get when running test_progs under vmtest.sh, and it's shorter than 1 kB: 00400000-00401000 r--p 00000000 fe:00 25867 /root/bpf/test_progs 00401000-00674000 r-xp 00001000 fe:00 25867 /root/bpf/test_progs 00674000-0095f000 r--p 00274000 fe:00 25867 /root/bpf/test_progs 0095f000-00983000 r--p 0055e000 fe:00 25867 /root/bpf/test_progs 00983000-00a8a000 rw-p 00582000 fe:00 25867 /root/bpf/test_progs 00a8a000-0484e000 rw-p 00000000 00:00 0 7f6c64000000-7f6c64021000 rw-p 00000000 00:00 0 7f6c64021000-7f6c68000000 ---p 00000000 00:00 0 7f6c6ac8f000-7f6c6ac90000 r--s 00000000 00:0d 8032 anon_inode:bpf-map 7f6c6ac90000-7f6c6ac91000 ---p 00000000 00:00 0 7f6c6ac91000-7f6c6b491000 rw-p 00000000 00:00 0 7f6c6b491000-7f6c6b492000 r--s 00000000 00:0d 8032 anon_inode:bpf-map 7f6c6b492000-7f6c6b493000 rw-s 00000000 00:0d 8032 anon_inode:bpf-map 7ffc1e23d000-7ffc1e25e000 rw-p 00000000 00:00 0 7ffc1e3b8000-7ffc1e3bc000 r--p 00000000 00:00 0 7ffc1e3bc000-7ffc1e3bd000 r-xp 00000000 00:00 0 7fffffffe000-7ffffffff000 --xp 00000000 00:00 0 Fixes:e8168840e1
("selftests/bpf: Add test for bpf_iter_task_vma") Signed-off-by: Maxim Mikityanskiy <maximmi@nvidia.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20211130181811.594220-1-maximmi@nvidia.com Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Родитель
35a89caf51
Коммит
48419bc90e
|
@ -1208,13 +1208,14 @@ static void test_task_vma(void)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Read CMP_BUFFER_SIZE (1kB) from bpf_iter. Read in small chunks
|
/* Read CMP_BUFFER_SIZE (1kB) from bpf_iter. Read in small chunks
|
||||||
* to trigger seq_file corner cases. The expected output is much
|
* to trigger seq_file corner cases.
|
||||||
* longer than 1kB, so the while loop will terminate.
|
|
||||||
*/
|
*/
|
||||||
len = 0;
|
len = 0;
|
||||||
while (len < CMP_BUFFER_SIZE) {
|
while (len < CMP_BUFFER_SIZE) {
|
||||||
err = read_fd_into_buffer(iter_fd, task_vma_output + len,
|
err = read_fd_into_buffer(iter_fd, task_vma_output + len,
|
||||||
min(read_size, CMP_BUFFER_SIZE - len));
|
min(read_size, CMP_BUFFER_SIZE - len));
|
||||||
|
if (!err)
|
||||||
|
break;
|
||||||
if (CHECK(err < 0, "read_iter_fd", "read_iter_fd failed\n"))
|
if (CHECK(err < 0, "read_iter_fd", "read_iter_fd failed\n"))
|
||||||
goto out;
|
goto out;
|
||||||
len += err;
|
len += err;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче