• David Vernet's avatar
    bpf: Free struct bpf_cpumask in call_rcu handler · 77473d1a
    David Vernet authored
    The struct bpf_cpumask type uses the bpf_mem_cache_{alloc,free}() APIs
    to allocate and free its cpumasks. The bpf_mem allocator may currently
    immediately reuse some memory when its freed, without waiting for an RCU
    read cycle to elapse. We want to be able to treat struct bpf_cpumask
    objects as completely RCU safe.
    
    This is necessary for two reasons:
    
    1. bpf_cpumask_kptr_get() currently does an RCU-protected
       refcnt_inc_not_zero(). This of course assumes that the underlying
       memory is not reused, and is therefore unsafe in its current form.
    
    2. We want to be able to get rid of bpf_cpumask_kptr_get() entirely, and
       intead use the superior kptr RCU semantics now afforded by the
       verifier.
    
    This patch fixes (1), and enables (2), by making struct bpf_cpumask RCU
    safe. A subsequent patch will update the verifier to allow struct
    bpf_cpumask * pointers to be passed to KF_RCU kfuncs, and then a latter
    patch will remove bpf_cpumask_kptr_get().
    
    Fixes: 516f4d33 ("bpf: Enable cpumasks to be queried and used as kptrs")
    Signed-off-by: default avatarDavid Vernet <void@manifault.com>
    Link: https://lore.kernel.org/r/20230316054028.88924-2-void@manifault.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    77473d1a
cpumask.c 14.7 KB