Loading...
1// SPDX-License-Identifier: GPL-2.0
2/* Copyright (c) 2020 Facebook */
3#include <linux/bpf.h>
4#include <bpf/bpf_helpers.h>
5#include <bpf/bpf_core_read.h>
6
7#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)
8struct seq_file;
9struct bpf_iter_meta {
10 struct seq_file *seq;
11 __u64 session_id;
12 __u64 seq_num;
13};
14
15struct bpf_map {
16 __u32 id;
17 char name[16];
18 __u32 max_entries;
19};
20
21struct bpf_iter__bpf_map {
22 struct bpf_iter_meta *meta;
23 struct bpf_map *map;
24};
25
26struct btf_type {
27 __u32 name_off;
28};
29
30struct btf_header {
31 __u32 str_len;
32};
33
34struct btf {
35 const char *strings;
36 struct btf_type **types;
37 struct btf_header hdr;
38};
39
40struct bpf_prog_aux {
41 __u32 id;
42 char name[16];
43 const char *attach_func_name;
44 struct bpf_prog *dst_prog;
45 struct bpf_func_info *func_info;
46 struct btf *btf;
47};
48
49struct bpf_prog {
50 struct bpf_prog_aux *aux;
51};
52
53struct bpf_iter__bpf_prog {
54 struct bpf_iter_meta *meta;
55 struct bpf_prog *prog;
56};
57#pragma clang attribute pop
58
59static const char *get_name(struct btf *btf, long btf_id, const char *fallback)
60{
61 struct btf_type **types, *t;
62 unsigned int name_off;
63 const char *str;
64
65 if (!btf)
66 return fallback;
67 str = btf->strings;
68 types = btf->types;
69 bpf_probe_read_kernel(&t, sizeof(t), types + btf_id);
70 name_off = BPF_CORE_READ(t, name_off);
71 if (name_off >= btf->hdr.str_len)
72 return fallback;
73 return str + name_off;
74}
75
76__s64 bpf_map_sum_elem_count(struct bpf_map *map) __ksym;
77
78SEC("iter/bpf_map")
79int dump_bpf_map(struct bpf_iter__bpf_map *ctx)
80{
81 struct seq_file *seq = ctx->meta->seq;
82 __u64 seq_num = ctx->meta->seq_num;
83 struct bpf_map *map = ctx->map;
84
85 if (!map)
86 return 0;
87
88 if (seq_num == 0)
89 BPF_SEQ_PRINTF(seq, " id name max_entries cur_entries\n");
90
91 BPF_SEQ_PRINTF(seq, "%4u %-16s %10d %10lld\n",
92 map->id, map->name, map->max_entries,
93 bpf_map_sum_elem_count(map));
94
95 return 0;
96}
97
98SEC("iter/bpf_prog")
99int dump_bpf_prog(struct bpf_iter__bpf_prog *ctx)
100{
101 struct seq_file *seq = ctx->meta->seq;
102 __u64 seq_num = ctx->meta->seq_num;
103 struct bpf_prog *prog = ctx->prog;
104 struct bpf_prog_aux *aux;
105
106 if (!prog)
107 return 0;
108
109 aux = prog->aux;
110 if (seq_num == 0)
111 BPF_SEQ_PRINTF(seq, " id name attached\n");
112
113 BPF_SEQ_PRINTF(seq, "%4u %-16s %s %s\n", aux->id,
114 get_name(aux->btf, aux->func_info[0].type_id, aux->name),
115 aux->attach_func_name, aux->dst_prog->aux->name);
116 return 0;
117}
118char LICENSE[] SEC("license") = "GPL";