0001
0002
0003 #include "bpf_iter.h"
0004 #include <bpf/bpf_helpers.h>
0005 #include <bpf/bpf_core_read.h>
0006
0007 #include <errno.h>
0008
0009 char _license[] SEC("license") = "GPL";
0010
0011 long tasks = 0;
0012 long seq_err = 0;
0013 bool skip = false;
0014
0015 SEC("iter/task")
0016 int dump_task_struct(struct bpf_iter__task *ctx)
0017 {
0018 struct seq_file *seq = ctx->meta->seq;
0019 struct task_struct *task = ctx->task;
0020 static struct btf_ptr ptr = { };
0021 long ret;
0022
0023 #if __has_builtin(__builtin_btf_type_id)
0024 ptr.type_id = bpf_core_type_id_kernel(struct task_struct);
0025 ptr.ptr = task;
0026
0027 if (ctx->meta->seq_num == 0)
0028 BPF_SEQ_PRINTF(seq, "Raw BTF task\n");
0029
0030 ret = bpf_seq_printf_btf(seq, &ptr, sizeof(ptr), 0);
0031 switch (ret) {
0032 case 0:
0033 tasks++;
0034 break;
0035 case -ERANGE:
0036
0037 break;
0038 case -E2BIG:
0039 return 1;
0040 default:
0041 seq_err = ret;
0042 break;
0043 }
0044 #else
0045 skip = true;
0046 #endif
0047
0048 return 0;
0049 }