bpf: Add verified_insns to bpf_prog_info and fdinfo
authorDave Marchevsky <davemarchevsky@fb.com>
Wed, 20 Oct 2021 07:48:17 +0000 (00:48 -0700)
committerAndrii Nakryiko <andrii@kernel.org>
Thu, 21 Oct 2021 22:51:47 +0000 (15:51 -0700)
This stat is currently printed in the verifier log and not stored
anywhere. To ease consumption of this data, add a field to bpf_prog_aux
so it can be exposed via BPF_OBJ_GET_INFO_BY_FD and fdinfo.

Signed-off-by: Dave Marchevsky <davemarchevsky@fb.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20211020074818.1017682-2-davemarchevsky@fb.com
include/linux/bpf.h
include/uapi/linux/bpf.h
kernel/bpf/syscall.c
kernel/bpf/verifier.c
tools/include/uapi/linux/bpf.h

index be3102b..31421c7 100644 (file)
@@ -887,6 +887,7 @@ struct bpf_prog_aux {
        struct bpf_prog *prog;
        struct user_struct *user;
        u64 load_time; /* ns since boottime */
+       u32 verified_insns;
        struct bpf_map *cgroup_storage[MAX_BPF_CGROUP_STORAGE_TYPE];
        char name[BPF_OBJ_NAME_LEN];
 #ifdef CONFIG_SECURITY
index 22e7a3f..c108200 100644 (file)
@@ -5620,6 +5620,7 @@ struct bpf_prog_info {
        __u64 run_time_ns;
        __u64 run_cnt;
        __u64 recursion_misses;
+       __u32 verified_insns;
 } __attribute__((aligned(8)));
 
 struct bpf_map_info {
index 4e50c0b..5beb321 100644 (file)
@@ -1848,7 +1848,8 @@ static void bpf_prog_show_fdinfo(struct seq_file *m, struct file *filp)
                   "prog_id:\t%u\n"
                   "run_time_ns:\t%llu\n"
                   "run_cnt:\t%llu\n"
-                  "recursion_misses:\t%llu\n",
+                  "recursion_misses:\t%llu\n"
+                  "verified_insns:\t%u\n",
                   prog->type,
                   prog->jited,
                   prog_tag,
@@ -1856,7 +1857,8 @@ static void bpf_prog_show_fdinfo(struct seq_file *m, struct file *filp)
                   prog->aux->id,
                   stats.nsecs,
                   stats.cnt,
-                  stats.misses);
+                  stats.misses,
+                  prog->aux->verified_insns);
 }
 #endif
 
@@ -3625,6 +3627,8 @@ static int bpf_prog_get_info_by_fd(struct file *file,
        info.run_cnt = stats.cnt;
        info.recursion_misses = stats.misses;
 
+       info.verified_insns = prog->aux->verified_insns;
+
        if (!bpf_capable()) {
                info.jited_prog_len = 0;
                info.xlated_prog_len = 0;
index 21cdff3..c6616e3 100644 (file)
@@ -14033,6 +14033,7 @@ skip_full_check:
 
        env->verification_time = ktime_get_ns() - start_time;
        print_verification_stats(env);
+       env->prog->aux->verified_insns = env->insn_processed;
 
        if (log->level && bpf_verifier_log_full(log))
                ret = -ENOSPC;
index 22e7a3f..c108200 100644 (file)
@@ -5620,6 +5620,7 @@ struct bpf_prog_info {
        __u64 run_time_ns;
        __u64 run_cnt;
        __u64 recursion_misses;
+       __u32 verified_insns;
 } __attribute__((aligned(8)));
 
 struct bpf_map_info {