0001
0002
0003 #include "bpf_iter.h"
0004 #include <bpf/bpf_helpers.h>
0005 #include <bpf/bpf_tracing.h>
0006
0007 char _license[] SEC("license") = "GPL";
0008
0009 SEC("iter/task")
0010 int dump_task(struct bpf_iter__task *ctx)
0011 {
0012 struct seq_file *seq = ctx->meta->seq;
0013 struct task_struct *task = ctx->task;
0014 static char info[] = " === END ===";
0015
0016 if (task == (void *)0) {
0017 BPF_SEQ_PRINTF(seq, "%s\n", info);
0018 return 0;
0019 }
0020
0021 if (ctx->meta->seq_num == 0)
0022 BPF_SEQ_PRINTF(seq, " tgid gid\n");
0023
0024 BPF_SEQ_PRINTF(seq, "%8d %8d\n", task->tgid, task->pid);
0025 return 0;
0026 }
0027
0028 int num_expected_failure_copy_from_user_task = 0;
0029 int num_success_copy_from_user_task = 0;
0030
0031 SEC("iter.s/task")
0032 int dump_task_sleepable(struct bpf_iter__task *ctx)
0033 {
0034 struct seq_file *seq = ctx->meta->seq;
0035 struct task_struct *task = ctx->task;
0036 static const char info[] = " === END ===";
0037 struct pt_regs *regs;
0038 void *ptr;
0039 uint32_t user_data = 0;
0040 int ret;
0041
0042 if (task == (void *)0) {
0043 BPF_SEQ_PRINTF(seq, "%s\n", info);
0044 return 0;
0045 }
0046
0047
0048 ptr = NULL;
0049 ret = bpf_copy_from_user_task(&user_data, sizeof(uint32_t), ptr, task, 0);
0050 if (ret) {
0051 ++num_expected_failure_copy_from_user_task;
0052 } else {
0053 BPF_SEQ_PRINTF(seq, "%s\n", info);
0054 return 0;
0055 }
0056
0057
0058
0059
0060 regs = (struct pt_regs *)bpf_task_pt_regs(task);
0061 if (regs == (void *)0) {
0062 BPF_SEQ_PRINTF(seq, "%s\n", info);
0063 return 0;
0064 }
0065 ptr = (void *)PT_REGS_IP(regs);
0066
0067 ret = bpf_copy_from_user_task(&user_data, sizeof(uint32_t), ptr, task, 0);
0068 if (ret) {
0069 BPF_SEQ_PRINTF(seq, "%s\n", info);
0070 return 0;
0071 }
0072 ++num_success_copy_from_user_task;
0073
0074 if (ctx->meta->seq_num == 0)
0075 BPF_SEQ_PRINTF(seq, " tgid gid data\n");
0076
0077 BPF_SEQ_PRINTF(seq, "%8d %8d %8d\n", task->tgid, task->pid, user_data);
0078 return 0;
0079 }