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