Path: blob/master/kernel/bpf/preload/iterators/iterators.bpf.c
29281 views
// SPDX-License-Identifier: GPL-2.01/* Copyright (c) 2020 Facebook */2#include <linux/bpf.h>3#include <bpf/bpf_helpers.h>4#include <bpf/bpf_core_read.h>56#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)7struct seq_file;8struct bpf_iter_meta {9struct seq_file *seq;10__u64 session_id;11__u64 seq_num;12};1314struct bpf_map {15__u32 id;16char name[16];17__u32 max_entries;18};1920struct bpf_iter__bpf_map {21struct bpf_iter_meta *meta;22struct bpf_map *map;23};2425struct btf_type {26__u32 name_off;27};2829struct btf_header {30__u32 str_len;31};3233struct btf {34const char *strings;35struct btf_type **types;36struct btf_header hdr;37};3839struct bpf_prog_aux {40__u32 id;41char name[16];42const char *attach_func_name;43struct bpf_prog *dst_prog;44struct bpf_func_info *func_info;45struct btf *btf;46};4748struct bpf_prog {49struct bpf_prog_aux *aux;50};5152struct bpf_iter__bpf_prog {53struct bpf_iter_meta *meta;54struct bpf_prog *prog;55};56#pragma clang attribute pop5758static const char *get_name(struct btf *btf, long btf_id, const char *fallback)59{60struct btf_type **types, *t;61unsigned int name_off;62const char *str;6364if (!btf)65return fallback;66str = btf->strings;67types = btf->types;68bpf_probe_read_kernel(&t, sizeof(t), types + btf_id);69name_off = BPF_CORE_READ(t, name_off);70if (name_off >= btf->hdr.str_len)71return fallback;72return str + name_off;73}7475__s64 bpf_map_sum_elem_count(struct bpf_map *map) __ksym;7677SEC("iter/bpf_map")78int dump_bpf_map(struct bpf_iter__bpf_map *ctx)79{80struct seq_file *seq = ctx->meta->seq;81__u64 seq_num = ctx->meta->seq_num;82struct bpf_map *map = ctx->map;8384if (!map)85return 0;8687if (seq_num == 0)88BPF_SEQ_PRINTF(seq, " id name max_entries cur_entries\n");8990BPF_SEQ_PRINTF(seq, "%4u %-16s %10d %10lld\n",91map->id, map->name, map->max_entries,92bpf_map_sum_elem_count(map));9394return 0;95}9697SEC("iter/bpf_prog")98int dump_bpf_prog(struct bpf_iter__bpf_prog *ctx)99{100struct seq_file *seq = ctx->meta->seq;101__u64 seq_num = ctx->meta->seq_num;102struct bpf_prog *prog = ctx->prog;103struct bpf_prog_aux *aux;104105if (!prog)106return 0;107108aux = prog->aux;109if (seq_num == 0)110BPF_SEQ_PRINTF(seq, " id name attached\n");111112BPF_SEQ_PRINTF(seq, "%4u %-16s %s %s\n", aux->id,113get_name(aux->btf, aux->func_info[0].type_id, aux->name),114aux->attach_func_name, aux->dst_prog->aux->name);115return 0;116}117char LICENSE[] SEC("license") = "GPL";118119120