mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 10:01:41 +00:00
d6a6a55518
These macros are convenient wrappers around the bpf_seq_printf and bpf_snprintf helpers. They are currently provided by bpf_tracing.h which targets low level tracing primitives. bpf_helpers.h is a better fit. The __bpf_narg and __bpf_apply are needed in both files and provided twice. __bpf_empty isn't used anywhere and is removed from bpf_tracing.h Reported-by: Andrii Nakryiko <andrii@kernel.org> Signed-off-by: Florent Revest <revest@chromium.org> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20210526164643.2881368-1-revest@chromium.org
114 lines
2.3 KiB
C
114 lines
2.3 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/* Copyright (c) 2020 Facebook */
|
|
#include <linux/bpf.h>
|
|
#include <bpf/bpf_helpers.h>
|
|
#include <bpf/bpf_core_read.h>
|
|
|
|
#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)
|
|
struct seq_file;
|
|
struct bpf_iter_meta {
|
|
struct seq_file *seq;
|
|
__u64 session_id;
|
|
__u64 seq_num;
|
|
};
|
|
|
|
struct bpf_map {
|
|
__u32 id;
|
|
char name[16];
|
|
__u32 max_entries;
|
|
};
|
|
|
|
struct bpf_iter__bpf_map {
|
|
struct bpf_iter_meta *meta;
|
|
struct bpf_map *map;
|
|
};
|
|
|
|
struct btf_type {
|
|
__u32 name_off;
|
|
};
|
|
|
|
struct btf_header {
|
|
__u32 str_len;
|
|
};
|
|
|
|
struct btf {
|
|
const char *strings;
|
|
struct btf_type **types;
|
|
struct btf_header hdr;
|
|
};
|
|
|
|
struct bpf_prog_aux {
|
|
__u32 id;
|
|
char name[16];
|
|
const char *attach_func_name;
|
|
struct bpf_prog *dst_prog;
|
|
struct bpf_func_info *func_info;
|
|
struct btf *btf;
|
|
};
|
|
|
|
struct bpf_prog {
|
|
struct bpf_prog_aux *aux;
|
|
};
|
|
|
|
struct bpf_iter__bpf_prog {
|
|
struct bpf_iter_meta *meta;
|
|
struct bpf_prog *prog;
|
|
};
|
|
#pragma clang attribute pop
|
|
|
|
static const char *get_name(struct btf *btf, long btf_id, const char *fallback)
|
|
{
|
|
struct btf_type **types, *t;
|
|
unsigned int name_off;
|
|
const char *str;
|
|
|
|
if (!btf)
|
|
return fallback;
|
|
str = btf->strings;
|
|
types = btf->types;
|
|
bpf_probe_read_kernel(&t, sizeof(t), types + btf_id);
|
|
name_off = BPF_CORE_READ(t, name_off);
|
|
if (name_off >= btf->hdr.str_len)
|
|
return fallback;
|
|
return str + name_off;
|
|
}
|
|
|
|
SEC("iter/bpf_map")
|
|
int dump_bpf_map(struct bpf_iter__bpf_map *ctx)
|
|
{
|
|
struct seq_file *seq = ctx->meta->seq;
|
|
__u64 seq_num = ctx->meta->seq_num;
|
|
struct bpf_map *map = ctx->map;
|
|
|
|
if (!map)
|
|
return 0;
|
|
|
|
if (seq_num == 0)
|
|
BPF_SEQ_PRINTF(seq, " id name max_entries\n");
|
|
|
|
BPF_SEQ_PRINTF(seq, "%4u %-16s%6d\n", map->id, map->name, map->max_entries);
|
|
return 0;
|
|
}
|
|
|
|
SEC("iter/bpf_prog")
|
|
int dump_bpf_prog(struct bpf_iter__bpf_prog *ctx)
|
|
{
|
|
struct seq_file *seq = ctx->meta->seq;
|
|
__u64 seq_num = ctx->meta->seq_num;
|
|
struct bpf_prog *prog = ctx->prog;
|
|
struct bpf_prog_aux *aux;
|
|
|
|
if (!prog)
|
|
return 0;
|
|
|
|
aux = prog->aux;
|
|
if (seq_num == 0)
|
|
BPF_SEQ_PRINTF(seq, " id name attached\n");
|
|
|
|
BPF_SEQ_PRINTF(seq, "%4u %-16s %s %s\n", aux->id,
|
|
get_name(aux->btf, aux->func_info[0].type_id, aux->name),
|
|
aux->attach_func_name, aux->dst_prog->aux->name);
|
|
return 0;
|
|
}
|
|
char LICENSE[] SEC("license") = "GPL";
|