linux/tools/testing/selftests/bpf/progs/bpf_iter_task_btf.c
<<
>>
Prefs
   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
   9char _license[] SEC("license") = "GPL";
  10
  11long tasks = 0;
  12long seq_err = 0;
  13bool skip = false;
  14
  15SEC("iter/task")
  16int 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