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