Commit 2abb5fad authored by Daniel Borkmann's avatar Daniel Borkmann

Merge branch 'bpf-verifier-log-btf-prep'

Martin KaFai Lau says:

====================
This patch set has some changes and clean-up works for
the bpf_verifier_log.  They are the prep works for the
BTF (BPF Type Format).
====================
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parents 639a53da 77d2e05a
...@@ -153,7 +153,7 @@ struct bpf_insn_aux_data { ...@@ -153,7 +153,7 @@ struct bpf_insn_aux_data {
#define BPF_VERIFIER_TMP_LOG_SIZE 1024 #define BPF_VERIFIER_TMP_LOG_SIZE 1024
struct bpf_verifer_log { struct bpf_verifier_log {
u32 level; u32 level;
char kbuf[BPF_VERIFIER_TMP_LOG_SIZE]; char kbuf[BPF_VERIFIER_TMP_LOG_SIZE];
char __user *ubuf; char __user *ubuf;
...@@ -161,11 +161,16 @@ struct bpf_verifer_log { ...@@ -161,11 +161,16 @@ struct bpf_verifer_log {
u32 len_total; u32 len_total;
}; };
static inline bool bpf_verifier_log_full(const struct bpf_verifer_log *log) static inline bool bpf_verifier_log_full(const struct bpf_verifier_log *log)
{ {
return log->len_used >= log->len_total - 1; return log->len_used >= log->len_total - 1;
} }
static inline bool bpf_verifier_log_needed(const struct bpf_verifier_log *log)
{
return log->level && log->ubuf && !bpf_verifier_log_full(log);
}
#define BPF_MAX_SUBPROGS 256 #define BPF_MAX_SUBPROGS 256
/* single container for all structs /* single container for all structs
...@@ -185,13 +190,15 @@ struct bpf_verifier_env { ...@@ -185,13 +190,15 @@ struct bpf_verifier_env {
bool allow_ptr_leaks; bool allow_ptr_leaks;
bool seen_direct_write; bool seen_direct_write;
struct bpf_insn_aux_data *insn_aux_data; /* array of per-insn state */ struct bpf_insn_aux_data *insn_aux_data; /* array of per-insn state */
struct bpf_verifer_log log; struct bpf_verifier_log log;
u32 subprog_starts[BPF_MAX_SUBPROGS]; u32 subprog_starts[BPF_MAX_SUBPROGS];
/* computes the stack depth of each bpf function */ /* computes the stack depth of each bpf function */
u16 subprog_stack_depth[BPF_MAX_SUBPROGS + 1]; u16 subprog_stack_depth[BPF_MAX_SUBPROGS + 1];
u32 subprog_cnt; u32 subprog_cnt;
}; };
void bpf_verifier_vlog(struct bpf_verifier_log *log, const char *fmt,
va_list args);
__printf(2, 3) void bpf_verifier_log_write(struct bpf_verifier_env *env, __printf(2, 3) void bpf_verifier_log_write(struct bpf_verifier_env *env,
const char *fmt, ...); const char *fmt, ...);
......
...@@ -168,15 +168,11 @@ struct bpf_call_arg_meta { ...@@ -168,15 +168,11 @@ struct bpf_call_arg_meta {
static DEFINE_MUTEX(bpf_verifier_lock); static DEFINE_MUTEX(bpf_verifier_lock);
static void log_write(struct bpf_verifier_env *env, const char *fmt, void bpf_verifier_vlog(struct bpf_verifier_log *log, const char *fmt,
va_list args) va_list args)
{ {
struct bpf_verifer_log *log = &env->log;
unsigned int n; unsigned int n;
if (!log->level || !log->ubuf || bpf_verifier_log_full(log))
return;
n = vscnprintf(log->kbuf, BPF_VERIFIER_TMP_LOG_SIZE, fmt, args); n = vscnprintf(log->kbuf, BPF_VERIFIER_TMP_LOG_SIZE, fmt, args);
WARN_ONCE(n >= BPF_VERIFIER_TMP_LOG_SIZE - 1, WARN_ONCE(n >= BPF_VERIFIER_TMP_LOG_SIZE - 1,
...@@ -200,18 +196,25 @@ __printf(2, 3) void bpf_verifier_log_write(struct bpf_verifier_env *env, ...@@ -200,18 +196,25 @@ __printf(2, 3) void bpf_verifier_log_write(struct bpf_verifier_env *env,
{ {
va_list args; va_list args;
if (!bpf_verifier_log_needed(&env->log))
return;
va_start(args, fmt); va_start(args, fmt);
log_write(env, fmt, args); bpf_verifier_vlog(&env->log, fmt, args);
va_end(args); va_end(args);
} }
EXPORT_SYMBOL_GPL(bpf_verifier_log_write); EXPORT_SYMBOL_GPL(bpf_verifier_log_write);
__printf(2, 3) static void verbose(void *private_data, const char *fmt, ...) __printf(2, 3) static void verbose(void *private_data, const char *fmt, ...)
{ {
struct bpf_verifier_env *env = private_data;
va_list args; va_list args;
if (!bpf_verifier_log_needed(&env->log))
return;
va_start(args, fmt); va_start(args, fmt);
log_write(private_data, fmt, args); bpf_verifier_vlog(&env->log, fmt, args);
va_end(args); va_end(args);
} }
...@@ -5611,7 +5614,7 @@ static void free_states(struct bpf_verifier_env *env) ...@@ -5611,7 +5614,7 @@ static void free_states(struct bpf_verifier_env *env)
int bpf_check(struct bpf_prog **prog, union bpf_attr *attr) int bpf_check(struct bpf_prog **prog, union bpf_attr *attr)
{ {
struct bpf_verifier_env *env; struct bpf_verifier_env *env;
struct bpf_verifer_log *log; struct bpf_verifier_log *log;
int ret = -EINVAL; int ret = -EINVAL;
/* no program is valid */ /* no program is valid */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment