• Christy Lee's avatar
    bpf: Only print scratched registers and stack slots to verifier logs. · 0f55f9ed
    Christy Lee authored
    When printing verifier state for any log level, print full verifier
    state only on function calls or on errors. Otherwise, only print the
    registers and stack slots that were accessed.
    
    Log size differences:
    
    verif_scale_loop6 before: 234566564
    verif_scale_loop6 after: 72143943
    69% size reduction
    
    kfree_skb before: 166406
    kfree_skb after: 55386
    69% size reduction
    
    Before:
    
    156: (61) r0 = *(u32 *)(r1 +0)
    157: R0_w=invP(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R1=ctx(id=0,off=0,imm=0) R2_w=invP0 R10=fp0 fp-8_w=00000000 fp-16_w=00\
    000000 fp-24_w=00000000 fp-32_w=00000000 fp-40_w=00000000 fp-48_w=00000000 fp-56_w=00000000 fp-64_w=00000000 fp-72_w=00000000 fp-80_w=00000\
    000 fp-88_w=00000000 fp-96_w=00000000 fp-104_w=00000000 fp-112_w=00000000 fp-120_w=00000000 fp-128_w=00000000 fp-136_w=00000000 fp-144_w=00\
    000000 fp-152_w=00000000 fp-160_w=00000000 fp-168_w=00000000 fp-176_w=00000000 fp-184_w=00000000 fp-192_w=00000000 fp-200_w=00000000 fp-208\
    _w=00000000 fp-216_w=00000000 fp-224_w=00000000 fp-232_w=00000000 fp-240_w=00000000 fp-248_w=00000000 fp-256_w=00000000 fp-264_w=00000000 f\
    p-272_w=00000000 fp-280_w=00000000 fp-288_w=00000000 fp-296_w=00000000 fp-304_w=00000000 fp-312_w=00000000 fp-320_w=00000000 fp-328_w=00000\
    000 fp-336_w=00000000 fp-344_w=00000000 fp-352_w=00000000 fp-360_w=00000000 fp-368_w=00000000 fp-376_w=00000000 fp-384_w=00000000 fp-392_w=\
    00000000 fp-400_w=00000000 fp-408_w=00000000 fp-416_w=00000000 fp-424_w=00000000 fp-432_w=00000000 fp-440_w=00000000 fp-448_w=00000000
    ; return skb->len;
    157: (95) exit
    Func#4 is safe for any args that match its prototype
    Validating get_constant() func#5...
    158: R1=invP(id=0) R10=fp0
    ; int get_constant(long val)
    158: (bf) r0 = r1
    159: R0_w=invP(id=1) R1=invP(id=1) R10=fp0
    ; return val - 122;
    159: (04) w0 += -122
    160: R0_w=invP(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R1=invP(id=1) R10=fp0
    ; return val - 122;
    160: (95) exit
    Func#5 is safe for any args that match its prototype
    Validating get_skb_ifindex() func#6...
    161: R1=invP(id=0) R2=ctx(id=0,off=0,imm=0) R3=invP(id=0) R10=fp0
    ; int get_skb_ifindex(int val, struct __sk_buff *skb, int var)
    161: (bc) w0 = w3
    162: R0_w=invP(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R1=invP(id=0) R2=ctx(id=0,off=0,imm=0) R3=invP(id=0) R10=fp0
    
    After:
    
    156: (61) r0 = *(u32 *)(r1 +0)
    157: R0_w=invP(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R1=ctx(id=0,off=0,imm=0)
    ; return skb->len;
    157: (95) exit
    Func#4 is safe for any args that match its prototype
    Validating get_constant() func#5...
    158: R1=invP(id=0) R10=fp0
    ; int get_constant(long val)
    158: (bf) r0 = r1
    159: R0_w=invP(id=1) R1=invP(id=1)
    ; return val - 122;
    159: (04) w0 += -122
    160: R0_w=invP(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff))
    ; return val - 122;
    160: (95) exit
    Func#5 is safe for any args that match its prototype
    Validating get_skb_ifindex() func#6...
    161: R1=invP(id=0) R2=ctx(id=0,off=0,imm=0) R3=invP(id=0) R10=fp0
    ; int get_skb_ifindex(int val, struct __sk_buff *skb, int var)
    161: (bc) w0 = w3
    162: R0_w=invP(id=0,umax_value=4294967295,var_off=(0x0; 0xffffffff)) R3=invP(id=0)
    Signed-off-by: default avatarChristy Lee <christylee@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20211216213358.3374427-2-christylee@fb.com
    0f55f9ed
verifier.c 409 KB