On Wed, Apr 26, 2017 at 08:24:19PM +0200, Hannes Frederic Sowa wrote: > > +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);
As I said several times already I'm strongly against procfs style of exposing information about the programs. I don't want this to become debugfs for bpf. Maintaining the list of all loaded programs is fine and we need a way to iterate through them, but procfs is obviously not the interface to do that. Programs/maps are binary whereas any fs interface is text. It also doesn't scale with large number of programs/maps. I prefer Daniel's suggestion on adding 'get_next' like API. Also would be good if you can wait for Martin to finish his prog->handle/id patches. Then user space will be able to iterate through all the progs/maps and fetch all info about them through syscall in extensible way. And you wouldn't need to abuse kallsyms list for different purpose.