Signed-off-by: Hannes Frederic Sowa <han...@stressinduktion.org> --- include/uapi/linux/bpf.h | 32 +++++++++++++++++++------------- kernel/bpf/core.c | 30 +++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 14 deletions(-)
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index e553529929f683..d6506e320953d5 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -101,20 +101,26 @@ enum bpf_map_type { BPF_MAP_TYPE_HASH_OF_MAPS, }; +#define BPF_PROG_TYPES \ + X(BPF_PROG_TYPE_UNSPEC), \ + X(BPF_PROG_TYPE_SOCKET_FILTER), \ + X(BPF_PROG_TYPE_KPROBE), \ + X(BPF_PROG_TYPE_SCHED_CLS), \ + X(BPF_PROG_TYPE_SCHED_ACT), \ + X(BPF_PROG_TYPE_TRACEPOINT), \ + X(BPF_PROG_TYPE_XDP), \ + X(BPF_PROG_TYPE_PERF_EVENT), \ + X(BPF_PROG_TYPE_CGROUP_SKB), \ + X(BPF_PROG_TYPE_CGROUP_SOCK), \ + X(BPF_PROG_TYPE_LWT_IN), \ + X(BPF_PROG_TYPE_LWT_OUT), \ + X(BPF_PROG_TYPE_LWT_XMIT), + + enum bpf_prog_type { - BPF_PROG_TYPE_UNSPEC, - BPF_PROG_TYPE_SOCKET_FILTER, - BPF_PROG_TYPE_KPROBE, - BPF_PROG_TYPE_SCHED_CLS, - BPF_PROG_TYPE_SCHED_ACT, - BPF_PROG_TYPE_TRACEPOINT, - BPF_PROG_TYPE_XDP, - BPF_PROG_TYPE_PERF_EVENT, - BPF_PROG_TYPE_CGROUP_SKB, - BPF_PROG_TYPE_CGROUP_SOCK, - BPF_PROG_TYPE_LWT_IN, - BPF_PROG_TYPE_LWT_OUT, - BPF_PROG_TYPE_LWT_XMIT, +#define X(type) type + BPF_PROG_TYPES +#undef X }; enum bpf_attach_type { diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c index 3ba175a24e971a..685c1d0f31e029 100644 --- a/kernel/bpf/core.c +++ b/kernel/bpf/core.c @@ -536,13 +536,41 @@ static void ebpf_proc_stop(struct seq_file *s, void *v) rcu_read_unlock(); } +static const char *bpf_type_string(enum bpf_prog_type type) +{ + static const char *bpf_type_names[] = { +#define X(type) #type + BPF_PROG_TYPES +#undef X + }; + + if (type >= ARRAY_SIZE(bpf_type_names)) + return "<unknown>"; + + return bpf_type_names[type]; +} + static int ebpf_proc_show(struct seq_file *s, void *v) { + struct bpf_prog *prog; + struct bpf_prog_aux *aux; + char prog_tag[sizeof(prog->tag) * 2 + 1] = { }; + if (v == SEQ_START_TOKEN) { - seq_printf(s, "# tag\n"); + seq_printf(s, "# tag\t\t\ttype\t\t\truntime\tcap\tmemlock\n"); return 0; } + aux = v; + prog = aux->prog; + + bin2hex(prog_tag, prog->tag, sizeof(prog->tag)); + seq_printf(s, "%s\t%s\t%s\t%s\t%llu\n", prog_tag, + bpf_type_string(prog->type), + prog->jited ? "jit" : "int", + prog->priv_cap_sys_admin ? "priv" : "unpriv", + prog->pages * 1ULL << PAGE_SHIFT); + return 0; } -- 2.9.3