• Andrii Nakryiko's avatar
    bpf: fix propagate_precision() logic for inner frames · f655badf
    Andrii Nakryiko authored
    Fix propagate_precision() logic to perform propagation of all necessary
    registers and stack slots across all active frames *in one batch step*.
    
    Doing this for each register/slot in each individual frame is wasteful,
    but the main problem is that backtracking of instruction in any frame
    except the deepest one just doesn't work. This is due to backtracking
    logic relying on jump history, and available jump history always starts
    (or ends, depending how you view it) in current frame. So, if
    prog A (frame #0) called subprog B (frame #1) and we need to propagate
    precision of, say, register R6 (callee-saved) within frame #0, we
    actually don't even know where jump history that corresponds to prog
    A even starts. We'd need to skip subprog part of jump history first to
    be able to do this.
    
    Luckily, with struct backtrack_state and __mark_chain_precision()
    handling bitmasks tracking/propagation across all active frames at the
    same time (added in previous patch), propagate_precision() can be both
    fixed and sped up by setting all the necessary bits across all frames
    and then performing one __mark_chain_precision() pass. This makes it
    unnecessary to skip subprog parts of jump history.
    
    We also improve logging along the way, to clearly specify which
    registers' and slots' precision markings are propagated within which
    frame. Each frame will have dedicated line and all registers and stack
    slots from that frame will be reported in format similar to precision
    backtrack regs/stack logging. E.g.:
    
    frame 1: propagating r1,r2,r3,fp-8,fp-16
    frame 0: propagating r3,r9,fp-120
    
    Fixes: 529409ea
    
     ("bpf: propagate precision across all frames, not just the last one")
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/r/20230505043317.3629845-7-andrii@kernel.org
    
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    f655badf
verifier.c 562 KB