bpf: Change print_bpf_insn interface
Subsystems (5)
Jiri Olsa
reviewercover bpf: Change print_bpf_insn interface
hi,
this patchset removes struct bpf_verifier_env argument from print_bpf_insn function (patch 1) and changes user space bpftool user to use it that way (patch 2).
thanks,
jirka
---
Jiri Olsa (2):
bpf: Remove struct bpf_verifier_env argument from print_bpf_insn
bpftool: Adjust to new print_bpf_insn interface
kernel/bpf/disasm.c | 52 ++++++++++++++++++++++++++-------------------------- kernel/bpf/disasm.h | 5 +---- kernel/bpf/verifier.c | 44 +++++++++++++++++++++++++++----------------- tools/bpf/bpftool/xlated_dumper.c | 12 ++++++------ 4 files changed, 60 insertions(+), 53 deletions(-)
Jiri Olsa
reviewerPATCH 1/2 bpf: Remove struct bpf_verifier_env argument from print_bpf_insn
We use print_bpf_insn in user space (bpftool and soon perf), so it'd be nice to keep it generic and strip it off the kernel struct bpf_verifier_env argument.
This argument can be safely removed, because its users can use the struct bpf_insn_cbs::private_data to pass it.
By changing the argument type we can no longer have clean 'verbose' alias to 'bpf_verifier_log_write' in verifier.c. Instead we're adding the 'verbose' cb_print callback and removing the alias.
This way we have new cb_print callback in place, and all the 'verbose(env, ...) calls in verifier.c will cleanly cast to 'verbose(void *, ...)' so no other change is needed.
--- kernel/bpf/disasm.c | 52 +++++++++++++++++++++++++-------------------------- kernel/bpf/disasm.h | 5 +---- kernel/bpf/verifier.c | 44 ++++++++++++++++++++++++++----------------- 3 files changed, 54 insertions(+), 47 deletions(-)
kernel/bpf/disasm.c +26 -26
@@ -113,16 +113,16 @@ static const char *const bpf_jmp_string[16] = { };static void print_bpf_end_insn (bpf_insn_print_t verbose, -struct bpf_verifier_env *env, +void *private_data,const struct bpf_insn *insn) { -verbose (env,"(%02x) r%d = %s%d r%d\n" , insn->code, insn->dst_reg, +verbose (private_data,"(%02x) r%d = %s%d r%d\n" , + insn->code, insn->dst_reg,BPF_SRC (insn->code) ==BPF_TO_BE ?"be" :"le" , insn->imm, insn->dst_reg); }void print_bpf_insn (const struct bpf_insn_cbs *cbs, -struct bpf_verifier_env *env,const struct bpf_insn *insn,bool allow_ptr_leaks) {
@@ -132,23 +132,23 @@ void print_bpf_insn(const struct bpf_insn_cbs *cbs,if (class ==BPF_ALU || class ==BPF_ALU64 ) {if (BPF_OP (insn->code) ==BPF_END ) {if (class ==BPF_ALU64 ) -verbose (env,"BUG_alu64_%02x\n" , insn->code); +verbose (cbs->private_data,"BUG_alu64_%02x\n" , insn->code);else -print_bpf_end_insn (verbose, env, insn); +print_bpf_end_insn (verbose, cbs->private_data, insn); }else if (BPF_OP (insn->code) ==BPF_NEG ) { -verbose (env,"(%02x) r%d = %s-r%d\n" , +verbose (cbs->private_data,"(%02x) r%d = %s-r%d\n" , insn->code, insn->dst_reg, class ==BPF_ALU ?"(u32) " :"" , insn->dst_reg); }else if (BPF_SRC (insn->code) ==BPF_X ) { -verbose (env,"(%02x) %sr%d %s %sr%d\n" , +verbose (cbs->private_data,"(%02x) %sr%d %s %sr%d\n" , insn->code, class ==BPF_ALU ?"(u32) " :"" , insn->dst_reg, bpf_alu_string[BPF_OP (insn->code) >>4 ], class ==BPF_ALU ?"(u32) " :"" , insn->src_reg); }else { - verbose(env, "(%02x) %sr%d %s %s%d\n", + verbose(cbs->private_data, "(%02x) %sr%d %s %s%d\n", insn->code, class == BPF_ALU ? "(u32) " : "", insn->dst_reg, bpf_alu_string[BPF_OP(insn->code) >> 4],
@@ -157,46 +157,46 @@ void print_bpf_insn(const struct bpf_insn_cbs *cbs, } }else if (class ==BPF_STX ) {if (BPF_MODE (insn->code) ==BPF_MEM ) -verbose (env,"(%02x) *(%s *)(r%d %+d) = r%d\n" , +verbose (cbs->private_data,"(%02x) *(%s *)(r%d %+d) = r%d\n" , insn->code, bpf_ldst_string[BPF_SIZE (insn->code) >>3 ], insn->dst_reg, insn->off, insn->src_reg);else if (BPF_MODE (insn->code) ==BPF_XADD ) -verbose (env,"(%02x) lock *(%s *)(r%d %+d) += r%d\n" , +verbose (cbs->private_data,"(%02x) lock *(%s *)(r%d %+d) += r%d\n" , insn->code, bpf_ldst_string[BPF_SIZE (insn->code) >>3 ], insn->dst_reg, insn->off, insn->src_reg);else -verbose (env,"BUG_%02x\n" , insn->code); +verbose (cbs->private_data,"BUG_%02x\n" , insn->code); }else if (class ==BPF_ST ) {if (BPF_MODE (insn->code) !=BPF_MEM ) { -verbose (env,"BUG_st_%02x\n" , insn->code); +verbose (cbs->private_data,"BUG_st_%02x\n" , insn->code);return ; } -verbose (env,"(%02x) *(%s *)(r%d %+d) = %d\n" , +verbose (cbs->private_data,"(%02x) *(%s *)(r%d %+d) = %d\n" , insn->code, bpf_ldst_string[BPF_SIZE (insn->code) >>3 ], insn->dst_reg, insn->off, insn->imm); }else if (class ==BPF_LDX ) {if (BPF_MODE (insn->code) !=BPF_MEM ) { -verbose (env,"BUG_ldx_%02x\n" , insn->code); +verbose (cbs->private_data,"BUG_ldx_%02x\n" , insn->code);return ; } -verbose (env,"(%02x) r%d = *(%s *)(r%d %+d)\n" , +verbose (cbs->private_data,"(%02x) r%d = *(%s *)(r%d %+d)\n" , insn->code, insn->dst_reg, bpf_ldst_string[BPF_SIZE (insn->code) >>3 ], insn->src_reg, insn->off); }else if (class ==BPF_LD ) {if (BPF_MODE (insn->code) ==BPF_ABS ) { -verbose (env,"(%02x) r0 = *(%s *)skb[%d]\n" , +verbose (cbs->private_data,"(%02x) r0 = *(%s *)skb[%d]\n" , insn->code, bpf_ldst_string[BPF_SIZE (insn->code) >>3 ], insn->imm); }else if (BPF_MODE (insn->code) ==BPF_IND ) { -verbose (env,"(%02x) r0 = *(%s *)skb[r%d + %d]\n" , +verbose (cbs->private_data,"(%02x) r0 = *(%s *)skb[r%d + %d]\n" , insn->code, bpf_ldst_string[BPF_SIZE (insn->code) >>3 ], insn->src_reg, insn->imm);
@@ -212,12 +212,12 @@ void print_bpf_insn(const struct bpf_insn_cbs *cbs,if (map_ptr && !allow_ptr_leaks) imm =0 ; -verbose (env,"(%02x) r%d = %s\n" , +verbose (cbs->private_data,"(%02x) r%d = %s\n" , insn->code, insn->dst_reg,__func_imm_name (cbs, insn, imm, tmp,sizeof (tmp))); }else { -verbose (env,"BUG_ld_%02x\n" , insn->code); +verbose (cbs->private_data,"BUG_ld_%02x\n" , insn->code);return ; } }else if (class ==BPF_JMP ) {
@@ -227,35 +227,35 @@ void print_bpf_insn(const struct bpf_insn_cbs *cbs,char tmp[64 ];if (insn->src_reg ==BPF_PSEUDO_CALL ) { -verbose (env,"(%02x) call pc%s\n" , +verbose (cbs->private_data,"(%02x) call pc%s\n" , insn->code,__func_get_name (cbs, insn, tmp,sizeof (tmp))); }else {strcpy (tmp,"unknown" ); -verbose (env,"(%02x) call %s#%d\n" , insn->code, +verbose (cbs->private_data,"(%02x) call %s#%d\n" , insn->code,__func_get_name (cbs, insn, tmp,sizeof (tmp)), insn->imm); } }else if (insn->code == (BPF_JMP |BPF_JA )) { -verbose (env,"(%02x) goto pc%+d\n" , +verbose (cbs->private_data,"(%02x) goto pc%+d\n" , insn->code, insn->off); }else if (insn->code == (BPF_JMP |BPF_EXIT )) { -verbose (env,"(%02x) exit\n" , insn->code); +verbose (cbs->private_data,"(%02x) exit\n" , insn->code); }else if (BPF_SRC (insn->code) ==BPF_X ) { -verbose (env,"(%02x) if r%d %s r%d goto pc%+d\n" , +verbose (cbs->private_data,"(%02x) if r%d %s r%d goto pc%+d\n" , insn->code, insn->dst_reg, bpf_jmp_string[BPF_OP (insn->code) >>4 ], insn->src_reg, insn->off); }else { -verbose (env,"(%02x) if r%d %s 0x%x goto pc%+d\n" , +verbose (cbs->private_data,"(%02x) if r%d %s 0x%x goto pc%+d\n" , insn->code, insn->dst_reg, bpf_jmp_string[BPF_OP (insn->code) >>4 ], insn->imm, insn->off); } }else { -verbose (env,"(%02x) %s\n" , +verbose (cbs->private_data,"(%02x) %s\n" , insn->code, bpf_class_string[class]); } }
kernel/bpf/disasm.h +1 -4
@@ -22,14 +22,12 @@#include <string.h> #endif -struct bpf_verifier_env ; -extern const char *const bpf_alu_string[16 ];extern const char *const bpf_class_string[8 ];const char *func_id_name (int id); -typedef __printf(2, 3) void (*bpf_insn_print_t)(struct bpf_verifier_env *env, +typedef __printf(2, 3) void (*bpf_insn_print_t)(void *private_data, const char *, ...); typedef const char *(*bpf_insn_revmap_call_t)(void *private_data, const struct bpf_insn *insn);
@@ -45,7 +43,6 @@ struct bpf_insn_cbs { };void print_bpf_insn (const struct bpf_insn_cbs *cbs, -struct bpf_verifier_env *env,const struct bpf_insn *insn,bool allow_ptr_leaks);#endif
kernel/bpf/verifier.c +27 -17
74 lines not on this page · raw message
Signature · 1 line
2.13.6
Jiri Olsa
reviewerPATCH 2/2 bpftool: Adjust to new print_bpf_insn interface
In reply to Jiri OlsaChange bpftool to skip the removed struct bpf_verifier_env argument in print_bpf_insn. It was passed as NULL anyway.
No functional change intended.
--- tools/bpf/bpftool/xlated_dumper.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
tools/bpf/bpftool/xlated_dumper.c +6 -6
@@ -114,7 +114,7 @@ static struct kernel_sym *kernel_syms_search(struct dump_data *dd, sizeof(*dd->sym_mapping), kernel_syms_cmp) : NULL; } -static void print_insn (struct bpf_verifier_env *env,const char *fmt, ...) +static void print_insn (void *private_data,const char *fmt, ...) {va_list args;
@@ -124,7 +124,7 @@ static void print_insn(struct bpf_verifier_env *env, const char *fmt, ...) }static void -print_insn_for_graph (struct bpf_verifier_env *env,const char *fmt, ...) +print_insn_for_graph (void *private_data,const char *fmt, ...) {char buf[64 ], *p;va_list args;
@@ -154,7 +154,7 @@ print_insn_for_graph(struct bpf_verifier_env *env, const char *fmt, ...)printf ("%s" , buf); } -static void print_insn_json (struct bpf_verifier_env *env,const char *fmt, ...) +static void print_insn_json (void *private_data,const char *fmt, ...) {unsigned int l =strlen (fmt);char chomped_fmt[l];
@@ -248,7 +248,7 @@ void dump_xlated_json(struct dump_data *dd, void *buf, unsigned int len,jsonw_start_object (json_wtr);jsonw_name (json_wtr,"disasm" ); -print_bpf_insn (&cbs,NULL , insn + i, true); +print_bpf_insn (&cbs, insn + i, true);if (opcodes) {jsonw_name (json_wtr,"opcodes" );
@@ -302,7 +302,7 @@ void dump_xlated_plain(struct dump_data *dd, void *buf, unsigned int len, double_insn = insn[i].code == (BPF_LD |BPF_IMM |BPF_DW );printf ("% 4d: " , i); -print_bpf_insn (&cbs,NULL , insn + i, true); +print_bpf_insn (&cbs, insn + i, true);if (opcodes) {printf (" " );
@@ -331,7 +331,7 @@ void dump_xlated_for_graph(struct dump_data *dd, void *buf_start, void *buf_end,for (; cur <= insn_end; cur++) {printf ("% 4d: " , (int )(cur - insn_start + start_idx)); -print_bpf_insn (&cbs,NULL , cur, true); +print_bpf_insn (&cbs, cur, true);if (cur != insn_end)printf (" | " ); }
Signature · 1 line
2.13.6
2018-03-23 11:41 UTC+0100 ~ Jiri Olsa <[email protected]>
Quoted 13 lines
hi,
this patchset removes structbpf_verifier_envargument fromprint_bpf_insnfunction (patch 1) and changes user space bpftool user to use it that way (patch 2).thanks,
jirka---
Jiri Olsa (2):
bpf: Remove structbpf_verifier_envargument fromprint_bpf_insn
bpftool: Adjust to newprint_bpf_insninterface
Quoted 6 lines
kernel/bpf/disasm.c | 52 ++++++++++++++++++++++++++-------------------------- kernel/bpf/disasm.h | 5 +---- kernel/bpf/verifier.c | 44 +++++++++++++++++++++++++++----------------- tools/bpf/bpftool/xlated_dumper.c | 12 ++++++------ 4 files changed, 60 insertions(+), 53 deletions(-)
Thanks, this version looks good to me. Please keep the "Reviewed-by" tags when resubmitting new versions of your patch sets :)
For the series:
Quoted 21 lines · Quentin Monnet
2018-03-23 11:41 UTC+0100 ~ Jiri Olsa <[email protected]>
Quoted 13 lines
hi,
this patchset removes structbpf_verifier_envargument fromprint_bpf_insnfunction (patch 1) and changes user space bpftool user to use it that way (patch 2).thanks,
jirka---
Jiri Olsa (2):
bpf: Remove structbpf_verifier_envargument fromprint_bpf_insn
bpftool: Adjust to newprint_bpf_insninterfaceQuoted 6 lines
kernel/bpf/disasm.c | 52 ++++++++++++++++++++++++++-------------------------- kernel/bpf/disasm.h | 5 +---- kernel/bpf/verifier.c | 44 +++++++++++++++++++++++++++----------------- tools/bpf/bpftool/xlated_dumper.c | 12 ++++++------ 4 files changed, 60 insertions(+), 53 deletions(-)
Quoted 5 lines
Thanks, this version looks good to me. Please keep the "Reviewed-by" tags when resubmitting new versions of your patch sets :)
For the series:
Reviewed-by Quentin Monnet <[email protected]>
Applied to bpf-next, thanks everyone!