• Dave Marchevsky's avatar
    bpf: Support refcounted local kptrs in existing semantics · 1512217c
    Dave Marchevsky authored
    A local kptr is considered 'refcounted' when it is of a type that has a
    bpf_refcount field. When such a kptr is created, its refcount should be
    initialized to 1; when destroyed, the object should be free'd only if a
    refcount decr results in 0 refcount.
    
    Existing logic always frees the underlying memory when destroying a
    local kptr, and 0-initializes all btf_record fields. This patch adds
    checks for "is local kptr refcounted?" and new logic for that case in
    the appropriate places.
    
    This patch focuses on changing existing semantics and thus conspicuously
    does _not_ provide a way for BPF programs in increment refcount. That
    follows later in the series.
    
    __bpf_obj_drop_impl is modified to do the right thing when it sees a
    refcounted type. Container types for graph nodes (list, tree, stashed in
    map) are migrated to use __bpf_obj_drop_impl as a destructor for their
    nodes instead of each having custom destruction code in their _free
    paths. Now that "drop" isn't a synonym for "free" when the type is
    refcounted it makes sense to centralize this logic.
    Signed-off-by: default avatarDave Marchevsky <davemarchevsky@fb.com>
    Link: https://lore.kernel.org/r/20230415201811.343116-4-davemarchevsky@fb.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    1512217c
helpers.c 61.4 KB