Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /* Copyright (c) 2020, Oracle and/or its affiliates. */
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         /* NULL task or task->fs, don't count it as an error. */
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 }