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: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
Коммит
2abb5fad3a
|
@ -153,7 +153,7 @@ struct bpf_insn_aux_data {
|
|||
|
||||
#define BPF_VERIFIER_TMP_LOG_SIZE 1024
|
||||
|
||||
struct bpf_verifer_log {
|
||||
struct bpf_verifier_log {
|
||||
u32 level;
|
||||
char kbuf[BPF_VERIFIER_TMP_LOG_SIZE];
|
||||
char __user *ubuf;
|
||||
|
@ -161,11 +161,16 @@ struct bpf_verifer_log {
|
|||
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;
|
||||
}
|
||||
|
||||
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
|
||||
|
||||
/* single container for all structs
|
||||
|
@ -185,13 +190,15 @@ struct bpf_verifier_env {
|
|||
bool allow_ptr_leaks;
|
||||
bool seen_direct_write;
|
||||
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];
|
||||
/* computes the stack depth of each bpf function */
|
||||
u16 subprog_stack_depth[BPF_MAX_SUBPROGS + 1];
|
||||
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,
|
||||
const char *fmt, ...);
|
||||
|
||||
|
|
|
@ -168,15 +168,11 @@ struct bpf_call_arg_meta {
|
|||
|
||||
static DEFINE_MUTEX(bpf_verifier_lock);
|
||||
|
||||
static void log_write(struct bpf_verifier_env *env, const char *fmt,
|
||||
va_list args)
|
||||
void bpf_verifier_vlog(struct bpf_verifier_log *log, const char *fmt,
|
||||
va_list args)
|
||||
{
|
||||
struct bpf_verifer_log *log = &env->log;
|
||||
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);
|
||||
|
||||
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,
|
|||
{
|
||||
va_list args;
|
||||
|
||||
if (!bpf_verifier_log_needed(&env->log))
|
||||
return;
|
||||
|
||||
va_start(args, fmt);
|
||||
log_write(env, fmt, args);
|
||||
bpf_verifier_vlog(&env->log, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(bpf_verifier_log_write);
|
||||
|
||||
__printf(2, 3) static void verbose(void *private_data, const char *fmt, ...)
|
||||
{
|
||||
struct bpf_verifier_env *env = private_data;
|
||||
va_list args;
|
||||
|
||||
if (!bpf_verifier_log_needed(&env->log))
|
||||
return;
|
||||
|
||||
va_start(args, fmt);
|
||||
log_write(private_data, fmt, args);
|
||||
bpf_verifier_vlog(&env->log, fmt, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
|
@ -5611,7 +5614,7 @@ static void free_states(struct bpf_verifier_env *env)
|
|||
int bpf_check(struct bpf_prog **prog, union bpf_attr *attr)
|
||||
{
|
||||
struct bpf_verifier_env *env;
|
||||
struct bpf_verifer_log *log;
|
||||
struct bpf_verifier_log *log;
|
||||
int ret = -EINVAL;
|
||||
|
||||
/* no program is valid */
|
||||
|
|
Загрузка…
Ссылка в новой задаче