Even though we have the pointer to user_struct and can recover uid of the user who has created the program, it usually contains 0 (root) which is not very informative. Let's store the comm of the calling process and export it via bpf_prog_info. This should help answer the question "which process loaded this particular program". Signed-off-by: Stanislav Fomichev <sdf@xxxxxxxxxx> --- include/linux/bpf.h | 1 + include/uapi/linux/bpf.h | 2 ++ kernel/bpf/syscall.c | 4 ++++ 3 files changed, 7 insertions(+) diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 5b9d22338606..b03ea396afe5 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -421,6 +421,7 @@ struct bpf_prog_aux { struct work_struct work; struct rcu_head rcu; }; + char created_by_comm[BPF_CREATED_COMM_LEN]; }; struct bpf_array { diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h index a65c3b0c6935..4e883ecbba1e 100644 --- a/include/uapi/linux/bpf.h +++ b/include/uapi/linux/bpf.h @@ -326,6 +326,7 @@ enum bpf_attach_type { #define BPF_F_NUMA_NODE (1U << 2) #define BPF_OBJ_NAME_LEN 16U +#define BPF_CREATED_COMM_LEN 16U /* Flags for accessing BPF object from syscall side. */ #define BPF_F_RDONLY (1U << 3) @@ -3252,6 +3253,7 @@ struct bpf_prog_info { __aligned_u64 prog_tags; __u64 run_time_ns; __u64 run_cnt; + char created_by_comm[BPF_CREATED_COMM_LEN]; } __attribute__((aligned(8))); struct bpf_map_info { diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c index 82eabd4e38ad..51c125292eaf 100644 --- a/kernel/bpf/syscall.c +++ b/kernel/bpf/syscall.c @@ -1735,6 +1735,8 @@ static int bpf_prog_load(union bpf_attr *attr, union bpf_attr __user *uattr) bpf_prog_kallsyms_add(prog); perf_event_bpf_event(prog, PERF_BPF_EVENT_PROG_LOAD, 0); + get_task_comm(prog->aux->created_by_comm, current); + err = bpf_prog_new_fd(prog); if (err < 0) bpf_prog_put(prog); @@ -2337,6 +2339,8 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog, memcpy(info.tag, prog->tag, sizeof(prog->tag)); memcpy(info.name, prog->aux->name, sizeof(prog->aux->name)); + memcpy(info.created_by_comm, prog->aux->created_by_comm, + sizeof(prog->aux->created_by_comm)); ulen = info.nr_map_ids; info.nr_map_ids = prog->aux->used_map_cnt; -- 2.23.0.700.g56cf767bdb-goog