> On Dec 15, 2020, at 12:21 PM, Yonghong Song <yhs@xxxxxx> wrote: > > > > On 12/11/20 6:48 PM, Song Liu wrote: >> The test dumps information similar to /proc/pid/maps. The first line of >> the output is compared against the /proc file to make sure they match. >> Signed-off-by: Song Liu <songliubraving@xxxxxx> >> --- >> .../selftests/bpf/prog_tests/bpf_iter.c | 106 ++++++++++++++++-- >> tools/testing/selftests/bpf/progs/bpf_iter.h | 9 ++ >> .../selftests/bpf/progs/bpf_iter_task_vma.c | 55 +++++++++ >> 3 files changed, 160 insertions(+), 10 deletions(-) >> create mode 100644 tools/testing/selftests/bpf/progs/bpf_iter_task_vma.c >> diff --git a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c >> index 0e586368948dd..7afd3abae1899 100644 >> --- a/tools/testing/selftests/bpf/prog_tests/bpf_iter.c >> +++ b/tools/testing/selftests/bpf/prog_tests/bpf_iter.c >> @@ -7,6 +7,7 @@ >> #include "bpf_iter_task.skel.h" >> #include "bpf_iter_task_stack.skel.h" >> #include "bpf_iter_task_file.skel.h" >> +#include "bpf_iter_task_vma.skel.h" >> #include "bpf_iter_task_btf.skel.h" >> #include "bpf_iter_tcp4.skel.h" >> #include "bpf_iter_tcp6.skel.h" >> @@ -64,6 +65,22 @@ static void do_dummy_read(struct bpf_program *prog) >> bpf_link__destroy(link); >> } >> > [...] >> diff --git a/tools/testing/selftests/bpf/progs/bpf_iter_task_vma.c b/tools/testing/selftests/bpf/progs/bpf_iter_task_vma.c >> new file mode 100644 >> index 0000000000000..d60b5b38cb396 >> --- /dev/null >> +++ b/tools/testing/selftests/bpf/progs/bpf_iter_task_vma.c >> @@ -0,0 +1,55 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +/* Copyright (c) 2020 Facebook */ >> +#include "bpf_iter.h" >> +#include <bpf/bpf_helpers.h> >> +#include <bpf/bpf_tracing.h> >> + >> +char _license[] SEC("license") = "GPL"; >> + >> +/* Copied from mm.h */ >> +#define VM_READ 0x00000001 >> +#define VM_WRITE 0x00000002 >> +#define VM_EXEC 0x00000004 >> +#define VM_MAYSHARE 0x00000080 >> + >> +/* Copied from kdev_t.h */ >> +#define MINORBITS 20 >> +#define MINORMASK ((1U << MINORBITS) - 1) >> +#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS)) >> +#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK)) >> + >> +#define D_PATH_BUF_SIZE 1024 >> +char d_path_buf[D_PATH_BUF_SIZE]; >> +__u32 pid; >> + >> +SEC("iter.s/task_vma") int proc_maps(struct bpf_iter__task_vma *ctx) >> +{ >> + struct __vm_area_struct *vma = ctx->vma; >> + struct seq_file *seq = ctx->meta->seq; >> + struct task_struct *task = ctx->task; >> + struct file *file = ctx->file; >> + char perm_str[] = "----"; >> + >> + if (task == (void *)0 || vma == (void *)0 || task->pid != pid) >> + return 0; >> + >> + perm_str[0] = (vma->flags & VM_READ) ? 'r' : '-'; >> + perm_str[1] = (vma->flags & VM_WRITE) ? 'w' : '-'; >> + perm_str[1] = (vma->flags & VM_EXEC) ? 'x' : '-'; > > typo here? The above should be perm_str[2]. Good catch! Fixing it in the next version. Song [...]