bpf: move verbose_linfo() into kernel/bpf/log.c
authorAndrii Nakryiko <andrii@kernel.org>
Sat, 18 Nov 2023 03:46:16 +0000 (19:46 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Sat, 18 Nov 2023 19:39:58 +0000 (11:39 -0800)
verifier.c is huge. Let's try to move out parts that are logging-related
into log.c, as we previously did with bpf_log() and other related stuff.
This patch moves line info verbose output routines: it's pretty
self-contained and isolated code, so there is no problem with this.

Acked-by: Eduard Zingerman <eddyz87@gmail.com>
Acked-by: Stanislav Fomichev <sdf@google.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/r/20231118034623.3320920-2-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
include/linux/bpf_verifier.h
kernel/bpf/log.c
kernel/bpf/verifier.c

index 52a4012b825550ffbf97c40ac31a5bcca66aa70f..d896f3db6a223a4a296a2fec26a9e5c6f3de29f7 100644 (file)
@@ -680,6 +680,10 @@ int bpf_vlog_init(struct bpf_verifier_log *log, u32 log_level,
 void bpf_vlog_reset(struct bpf_verifier_log *log, u64 new_pos);
 int bpf_vlog_finalize(struct bpf_verifier_log *log, u32 *log_size_actual);
 
+__printf(3, 4) void verbose_linfo(struct bpf_verifier_env *env,
+                                 u32 insn_off,
+                                 const char *prefix_fmt, ...);
+
 static inline struct bpf_func_state *cur_func(struct bpf_verifier_env *env)
 {
        struct bpf_verifier_state *cur = env->cur_state;
index 850494423530eebb5e53f05582003e287f43eedf..f20e1449c882b3a625f07e5695bd7f0d7dbbe2c5 100644 (file)
@@ -10,6 +10,8 @@
 #include <linux/bpf_verifier.h>
 #include <linux/math64.h>
 
+#define verbose(env, fmt, args...) bpf_verifier_log_write(env, fmt, ##args)
+
 static bool bpf_verifier_log_attr_valid(const struct bpf_verifier_log *log)
 {
        /* ubuf and len_total should both be specified (or not) together */
@@ -325,3 +327,60 @@ __printf(2, 3) void bpf_log(struct bpf_verifier_log *log,
        va_end(args);
 }
 EXPORT_SYMBOL_GPL(bpf_log);
+
+static const struct bpf_line_info *
+find_linfo(const struct bpf_verifier_env *env, u32 insn_off)
+{
+       const struct bpf_line_info *linfo;
+       const struct bpf_prog *prog;
+       u32 i, nr_linfo;
+
+       prog = env->prog;
+       nr_linfo = prog->aux->nr_linfo;
+
+       if (!nr_linfo || insn_off >= prog->len)
+               return NULL;
+
+       linfo = prog->aux->linfo;
+       for (i = 1; i < nr_linfo; i++)
+               if (insn_off < linfo[i].insn_off)
+                       break;
+
+       return &linfo[i - 1];
+}
+
+static const char *ltrim(const char *s)
+{
+       while (isspace(*s))
+               s++;
+
+       return s;
+}
+
+__printf(3, 4) void verbose_linfo(struct bpf_verifier_env *env,
+                                 u32 insn_off,
+                                 const char *prefix_fmt, ...)
+{
+       const struct bpf_line_info *linfo;
+
+       if (!bpf_verifier_log_needed(&env->log))
+               return;
+
+       linfo = find_linfo(env, insn_off);
+       if (!linfo || linfo == env->prev_linfo)
+               return;
+
+       if (prefix_fmt) {
+               va_list args;
+
+               va_start(args, prefix_fmt);
+               bpf_verifier_vlog(&env->log, prefix_fmt, args);
+               va_end(args);
+       }
+
+       verbose(env, "%s\n",
+               ltrim(btf_name_by_offset(env->prog->aux->btf,
+                                        linfo->line_off)));
+
+       env->prev_linfo = linfo;
+}
index 7c3461b89513d5a197c8742dce61ff780d5278b3..683fdda25c135992d3d5f7a066d91fc3a630c081 100644 (file)
@@ -337,27 +337,6 @@ struct btf *btf_vmlinux;
 
 static DEFINE_MUTEX(bpf_verifier_lock);
 
-static const struct bpf_line_info *
-find_linfo(const struct bpf_verifier_env *env, u32 insn_off)
-{
-       const struct bpf_line_info *linfo;
-       const struct bpf_prog *prog;
-       u32 i, nr_linfo;
-
-       prog = env->prog;
-       nr_linfo = prog->aux->nr_linfo;
-
-       if (!nr_linfo || insn_off >= prog->len)
-               return NULL;
-
-       linfo = prog->aux->linfo;
-       for (i = 1; i < nr_linfo; i++)
-               if (insn_off < linfo[i].insn_off)
-                       break;
-
-       return &linfo[i - 1];
-}
-
 __printf(2, 3) static void verbose(void *private_data, const char *fmt, ...)
 {
        struct bpf_verifier_env *env = private_data;
@@ -371,42 +350,6 @@ __printf(2, 3) static void verbose(void *private_data, const char *fmt, ...)
        va_end(args);
 }
 
-static const char *ltrim(const char *s)
-{
-       while (isspace(*s))
-               s++;
-
-       return s;
-}
-
-__printf(3, 4) static void verbose_linfo(struct bpf_verifier_env *env,
-                                        u32 insn_off,
-                                        const char *prefix_fmt, ...)
-{
-       const struct bpf_line_info *linfo;
-
-       if (!bpf_verifier_log_needed(&env->log))
-               return;
-
-       linfo = find_linfo(env, insn_off);
-       if (!linfo || linfo == env->prev_linfo)
-               return;
-
-       if (prefix_fmt) {
-               va_list args;
-
-               va_start(args, prefix_fmt);
-               bpf_verifier_vlog(&env->log, prefix_fmt, args);
-               va_end(args);
-       }
-
-       verbose(env, "%s\n",
-               ltrim(btf_name_by_offset(env->prog->aux->btf,
-                                        linfo->line_off)));
-
-       env->prev_linfo = linfo;
-}
-
 static void verbose_invalid_scalar(struct bpf_verifier_env *env,
                                   struct bpf_reg_state *reg,
                                   struct tnum *range, const char *ctx,