Commit b3e1331e authored by Kui-Feng Lee's avatar Kui-Feng Lee Committed by Andrii Nakryiko

selftests/bpf: Test parameterized task BPF iterators.

Test iterators of vma, files and tasks.

Ensure the API works appropriately to visit all tasks,
tasks in a process, or a particular task.
Signed-off-by: default avatarKui-Feng Lee <kuifeng@fb.com>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Acked-by: default avatarYonghong Song <yhs@fb.com>
Acked-by: default avatarMartin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/bpf/20220926184957.208194-5-kuifeng@fb.com
parent 2c4fe44f
...@@ -764,7 +764,7 @@ static void test_btf_dump_struct_data(struct btf *btf, struct btf_dump *d, ...@@ -764,7 +764,7 @@ static void test_btf_dump_struct_data(struct btf *btf, struct btf_dump *d,
/* union with nested struct */ /* union with nested struct */
TEST_BTF_DUMP_DATA(btf, d, "union", str, union bpf_iter_link_info, BTF_F_COMPACT, TEST_BTF_DUMP_DATA(btf, d, "union", str, union bpf_iter_link_info, BTF_F_COMPACT,
"(union bpf_iter_link_info){.map = (struct){.map_fd = (__u32)1,},.cgroup = (struct){.order = (enum bpf_cgroup_iter_order)BPF_CGROUP_ITER_SELF_ONLY,.cgroup_fd = (__u32)1,},}", "(union bpf_iter_link_info){.map = (struct){.map_fd = (__u32)1,},.cgroup = (struct){.order = (enum bpf_cgroup_iter_order)BPF_CGROUP_ITER_SELF_ONLY,.cgroup_fd = (__u32)1,},.task = (struct){.tid = (__u32)1,.pid = (__u32)1,},}",
{ .cgroup = { .order = 1, .cgroup_fd = 1, }}); { .cgroup = { .order = 1, .cgroup_fd = 1, }});
/* struct skb with nested structs/unions; because type output is so /* struct skb with nested structs/unions; because type output is so
......
...@@ -6,6 +6,10 @@ ...@@ -6,6 +6,10 @@
char _license[] SEC("license") = "GPL"; char _license[] SEC("license") = "GPL";
uint32_t tid = 0;
int num_unknown_tid = 0;
int num_known_tid = 0;
SEC("iter/task") SEC("iter/task")
int dump_task(struct bpf_iter__task *ctx) int dump_task(struct bpf_iter__task *ctx)
{ {
...@@ -18,6 +22,11 @@ int dump_task(struct bpf_iter__task *ctx) ...@@ -18,6 +22,11 @@ int dump_task(struct bpf_iter__task *ctx)
return 0; return 0;
} }
if (task->pid != tid)
num_unknown_tid++;
else
num_known_tid++;
if (ctx->meta->seq_num == 0) if (ctx->meta->seq_num == 0)
BPF_SEQ_PRINTF(seq, " tgid gid\n"); BPF_SEQ_PRINTF(seq, " tgid gid\n");
......
...@@ -7,14 +7,16 @@ char _license[] SEC("license") = "GPL"; ...@@ -7,14 +7,16 @@ char _license[] SEC("license") = "GPL";
int count = 0; int count = 0;
int tgid = 0; int tgid = 0;
int last_tgid = 0;
int unique_tgid_count = 0;
SEC("iter/task_file") SEC("iter/task_file")
int dump_task_file(struct bpf_iter__task_file *ctx) int dump_task_file(struct bpf_iter__task_file *ctx)
{ {
struct seq_file *seq = ctx->meta->seq; struct seq_file *seq = ctx->meta->seq;
struct task_struct *task = ctx->task; struct task_struct *task = ctx->task;
__u32 fd = ctx->fd;
struct file *file = ctx->file; struct file *file = ctx->file;
__u32 fd = ctx->fd;
if (task == (void *)0 || file == (void *)0) if (task == (void *)0 || file == (void *)0)
return 0; return 0;
...@@ -27,6 +29,11 @@ int dump_task_file(struct bpf_iter__task_file *ctx) ...@@ -27,6 +29,11 @@ int dump_task_file(struct bpf_iter__task_file *ctx)
if (tgid == task->tgid && task->tgid != task->pid) if (tgid == task->tgid && task->tgid != task->pid)
count++; count++;
if (last_tgid != task->tgid) {
last_tgid = task->tgid;
unique_tgid_count++;
}
BPF_SEQ_PRINTF(seq, "%8d %8d %8d %lx\n", task->tgid, task->pid, fd, BPF_SEQ_PRINTF(seq, "%8d %8d %8d %lx\n", task->tgid, task->pid, fd,
(long)file->f_op); (long)file->f_op);
return 0; return 0;
......
...@@ -20,6 +20,8 @@ char _license[] SEC("license") = "GPL"; ...@@ -20,6 +20,8 @@ char _license[] SEC("license") = "GPL";
#define D_PATH_BUF_SIZE 1024 #define D_PATH_BUF_SIZE 1024
char d_path_buf[D_PATH_BUF_SIZE] = {}; char d_path_buf[D_PATH_BUF_SIZE] = {};
__u32 pid = 0; __u32 pid = 0;
__u32 one_task = 0;
__u32 one_task_error = 0;
SEC("iter/task_vma") int proc_maps(struct bpf_iter__task_vma *ctx) SEC("iter/task_vma") int proc_maps(struct bpf_iter__task_vma *ctx)
{ {
...@@ -33,8 +35,11 @@ SEC("iter/task_vma") int proc_maps(struct bpf_iter__task_vma *ctx) ...@@ -33,8 +35,11 @@ SEC("iter/task_vma") int proc_maps(struct bpf_iter__task_vma *ctx)
return 0; return 0;
file = vma->vm_file; file = vma->vm_file;
if (task->tgid != pid) if (task->tgid != pid) {
if (one_task)
one_task_error = 1;
return 0; return 0;
}
perm_str[0] = (vma->vm_flags & VM_READ) ? 'r' : '-'; perm_str[0] = (vma->vm_flags & VM_READ) ? 'r' : '-';
perm_str[1] = (vma->vm_flags & VM_WRITE) ? 'w' : '-'; perm_str[1] = (vma->vm_flags & VM_WRITE) ? 'w' : '-';
perm_str[2] = (vma->vm_flags & VM_EXEC) ? 'x' : '-'; perm_str[2] = (vma->vm_flags & VM_EXEC) ? 'x' : '-';
......
// SPDX-License-Identifier: GPL-2.0
/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */
#include "bpf_iter.h"
#include <bpf/bpf_helpers.h>
char _license[] SEC("license") = "GPL";
__u32 unique_tgid_cnt = 0;
uintptr_t address = 0;
uintptr_t offset = 0;
__u32 last_tgid = 0;
__u32 pid = 0;
__u32 page_shift = 0;
SEC("iter/task_vma")
int get_vma_offset(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;
if (task == NULL || vma == NULL)
return 0;
if (last_tgid != task->tgid)
unique_tgid_cnt++;
last_tgid = task->tgid;
if (task->tgid != pid)
return 0;
if (vma->vm_start <= address && vma->vm_end > address) {
offset = address - vma->vm_start + (vma->vm_pgoff << page_shift);
BPF_SEQ_PRINTF(seq, "OK\n");
}
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment