• Andrii Nakryiko's avatar
    bpf: support 'arg:xxx' btf_decl_tag-based hints for global subprog args · 94e1c70a
    Andrii Nakryiko authored
    Add support for annotating global BPF subprog arguments to provide more
    information about expected semantics of the argument. Currently,
    verifier relies purely on argument's BTF type information, and supports
    three general use cases: scalar, pointer-to-context, and
    pointer-to-fixed-size-memory.
    
    Scalar and pointer-to-fixed-mem work well in practice and are quite
    natural to use. But pointer-to-context is a bit problematic, as typical
    BPF users don't realize that they need to use a special type name to
    signal to verifier that argument is not just some pointer, but actually
    a PTR_TO_CTX. Further, even if users do know which type to use, it is
    limiting in situations where the same BPF program logic is used across
    few different program types. Common case is kprobes, tracepoints, and
    perf_event programs having a helper to send some data over BPF perf
    buffer. bpf_perf_event_output() requires `ctx` argument, and so it's
    quite cumbersome to share such global subprog across few BPF programs of
    different types, necessitating extra static subprog that is context
    type-agnostic.
    
    Long story short, there is a need to go beyond types and allow users to
    add hints to global subprog arguments to define expectations.
    
    This patch adds such support for two initial special tags:
      - pointer to context;
      - non-null qualifier for generic pointer arguments.
    
    All of the above came up in practice already and seem generally useful
    additions. Non-null qualifier is an often requested feature, which
    currently has to be worked around by having unnecessary NULL checks
    inside subprogs even if we know that arguments are never NULL. Pointer
    to context was discussed earlier.
    
    As for implementation, we utilize btf_decl_tag attribute and set up an
    "arg:xxx" convention to specify argument hint. As such:
      - btf_decl_tag("arg:ctx") is a PTR_TO_CTX hint;
      - btf_decl_tag("arg:nonnull") marks pointer argument as not allowed to
        be NULL, making NULL check inside global subprog unnecessary.
    Acked-by: default avatarEduard Zingerman <eddyz87@gmail.com>
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/r/20231215011334.2307144-7-andrii@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    94e1c70a
verifier.c 623 KB