• Alexei Starovoitov's avatar
    bpf: Introduce kptr_rcu. · 20c09d92
    Alexei Starovoitov authored
    The life time of certain kernel structures like 'struct cgroup' is protected by RCU.
    Hence it's safe to dereference them directly from __kptr tagged pointers in bpf maps.
    The resulting pointer is MEM_RCU and can be passed to kfuncs that expect KF_RCU.
    Derefrence of other kptr-s returns PTR_UNTRUSTED.
    
    For example:
    struct map_value {
       struct cgroup __kptr *cgrp;
    };
    
    SEC("tp_btf/cgroup_mkdir")
    int BPF_PROG(test_cgrp_get_ancestors, struct cgroup *cgrp_arg, const char *path)
    {
      struct cgroup *cg, *cg2;
    
      cg = bpf_cgroup_acquire(cgrp_arg); // cg is PTR_TRUSTED and ref_obj_id > 0
      bpf_kptr_xchg(&v->cgrp, cg);
    
      cg2 = v->cgrp; // This is new feature introduced by this patch.
      // cg2 is PTR_MAYBE_NULL | MEM_RCU.
      // When cg2 != NULL, it's a valid cgroup, but its percpu_ref could be zero
    
      if (cg2)
        bpf_cgroup_ancestor(cg2, level); // safe to do.
    }
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarDavid Vernet <void@manifault.com>
    Link: https://lore.kernel.org/bpf/20230303041446.3630-4-alexei.starovoitov@gmail.com
    20c09d92
cgrp_kfunc_failure.c 6.42 KB