• Andrii Nakryiko's avatar
    bpf: ensure state checkpointing at iter_next() call sites · 4b5ce570
    Andrii Nakryiko authored
    State equivalence check and checkpointing performed in is_state_visited()
    employs certain heuristics to try to save memory by avoiding state checkpoints
    if not enough jumps and instructions happened since last checkpoint. This leads
    to unpredictability of whether a particular instruction will be checkpointed
    and how regularly. While normally this is not causing much problems (except
    inconveniences for predictable verifier tests, which we overcome with
    BPF_F_TEST_STATE_FREQ flag), turns out it's not the case for open-coded
    iterators.
    
    Checking and saving state checkpoints at iter_next() call is crucial for fast
    convergence of open-coded iterator loop logic, so we need to force it. If we
    don't do that, is_state_visited() might skip saving a checkpoint, causing
    unnecessarily long sequence of not checkpointed instructions and jumps, leading
    to exhaustion of jump history buffer, and potentially other undesired outcomes.
    It is expected that with correct open-coded iterators convergence will happen
    quickly, so we don't run a risk of exhausting memory.
    
    This patch adds, in addition to prune and jump instruction marks, also a
    "forced checkpoint" mark, and makes sure that any iter_next() call instruction
    is marked as such.
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/r/20230310060149.625887-1-andrii@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    4b5ce570
verifier.c 549 KB