1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2020, Oracle and/or its affiliates. */
3 #include "bpf_iter.h"
4 #include <bpf/bpf_helpers.h>
5 #include <bpf/bpf_core_read.h>
6 
7 #include <errno.h>
8 
9 char _license[] SEC("license") = "GPL";
10 
11 long tasks = 0;
12 long seq_err = 0;
13 bool skip = false;
14 
15 SEC("iter/task")
dump_task_struct(struct bpf_iter__task * ctx)16 int dump_task_struct(struct bpf_iter__task *ctx)
17 {
18 	struct seq_file *seq = ctx->meta->seq;
19 	struct task_struct *task = ctx->task;
20 	static struct btf_ptr ptr = { };
21 	long ret;
22 
23 #if __has_builtin(__builtin_btf_type_id)
24 	ptr.type_id = bpf_core_type_id_kernel(struct task_struct);
25 	ptr.ptr = task;
26 
27 	if (ctx->meta->seq_num == 0)
28 		BPF_SEQ_PRINTF(seq, "Raw BTF task\n");
29 
30 	ret = bpf_seq_printf_btf(seq, &ptr, sizeof(ptr), 0);
31 	switch (ret) {
32 	case 0:
33 		tasks++;
34 		break;
35 	case -ERANGE:
36 		/* NULL task or task->fs, don't count it as an error. */
37 		break;
38 	case -E2BIG:
39 		return 1;
40 	default:
41 		seq_err = ret;
42 		break;
43 	}
44 #else
45 	skip = true;
46 #endif
47 
48 	return 0;
49 }
50