mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-15 22:41:38 +00:00
Drop bpf_iter.h header which uses vmlinux.h but re-defines a bunch of iterator structures and some of BPF constants for use in BPF iterator selftests. None of that is necessary when fresh vmlinux.h header is generated for vmlinux image that matches latest selftests. So drop ugly hacks and have a nice plain vmlinux.h usage everywhere. We could do the same with all the kfunc __ksym redefinitions, but that has dependency on very fresh pahole, so I'm not addressing that here. Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/r/20241029203919.1948941-1-andrii@kernel.org Signed-off-by: Alexei Starovoitov <ast@kernel.org>
89 lines
2.0 KiB
C
89 lines
2.0 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (c) 2020 Facebook */
|
|
#include <vmlinux.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
#include <bpf/bpf_tracing.h>
|
|
|
|
char _license[] SEC("license") = "GPL";
|
|
|
|
uint32_t tid = 0;
|
|
int num_unknown_tid = 0;
|
|
int num_known_tid = 0;
|
|
|
|
SEC("iter/task")
|
|
int dump_task(struct bpf_iter__task *ctx)
|
|
{
|
|
struct seq_file *seq = ctx->meta->seq;
|
|
struct task_struct *task = ctx->task;
|
|
static char info[] = " === END ===";
|
|
|
|
if (task == (void *)0) {
|
|
BPF_SEQ_PRINTF(seq, "%s\n", info);
|
|
return 0;
|
|
}
|
|
|
|
if (task->pid != (pid_t)tid)
|
|
num_unknown_tid++;
|
|
else
|
|
num_known_tid++;
|
|
|
|
if (ctx->meta->seq_num == 0)
|
|
BPF_SEQ_PRINTF(seq, " tgid gid\n");
|
|
|
|
BPF_SEQ_PRINTF(seq, "%8d %8d\n", task->tgid, task->pid);
|
|
return 0;
|
|
}
|
|
|
|
int num_expected_failure_copy_from_user_task = 0;
|
|
int num_success_copy_from_user_task = 0;
|
|
|
|
SEC("iter.s/task")
|
|
int dump_task_sleepable(struct bpf_iter__task *ctx)
|
|
{
|
|
struct seq_file *seq = ctx->meta->seq;
|
|
struct task_struct *task = ctx->task;
|
|
static const char info[] = " === END ===";
|
|
struct pt_regs *regs;
|
|
void *ptr;
|
|
uint32_t user_data = 0;
|
|
int ret;
|
|
|
|
if (task == (void *)0) {
|
|
BPF_SEQ_PRINTF(seq, "%s\n", info);
|
|
return 0;
|
|
}
|
|
|
|
/* Read an invalid pointer and ensure we get an error */
|
|
ptr = NULL;
|
|
ret = bpf_copy_from_user_task(&user_data, sizeof(uint32_t), ptr, task, 0);
|
|
if (ret) {
|
|
++num_expected_failure_copy_from_user_task;
|
|
} else {
|
|
BPF_SEQ_PRINTF(seq, "%s\n", info);
|
|
return 0;
|
|
}
|
|
|
|
/* Try to read the contents of the task's instruction pointer from the
|
|
* remote task's address space.
|
|
*/
|
|
regs = (struct pt_regs *)bpf_task_pt_regs(task);
|
|
if (regs == (void *)0) {
|
|
BPF_SEQ_PRINTF(seq, "%s\n", info);
|
|
return 0;
|
|
}
|
|
ptr = (void *)PT_REGS_IP(regs);
|
|
|
|
ret = bpf_copy_from_user_task(&user_data, sizeof(uint32_t), ptr, task, 0);
|
|
if (ret) {
|
|
BPF_SEQ_PRINTF(seq, "%s\n", info);
|
|
return 0;
|
|
}
|
|
++num_success_copy_from_user_task;
|
|
|
|
if (ctx->meta->seq_num == 0)
|
|
BPF_SEQ_PRINTF(seq, " tgid gid data\n");
|
|
|
|
BPF_SEQ_PRINTF(seq, "%8d %8d %8d\n", task->tgid, task->pid, user_data);
|
|
return 0;
|
|
}
|