mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 05:44:11 +00:00
bpf: move verbose_linfo() into kernel/bpf/log.c
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>
This commit is contained in:
parent
ff8867af01
commit
db840d389b
3 changed files with 63 additions and 57 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue