• S
    bpf: remove __rcu annotations from bpf_prog_array · 54e9c9d4
    Stanislav Fomichev 提交于
    Drop __rcu annotations and rcu read sections from bpf_prog_array
    helper functions. They are not needed since all existing callers
    call those helpers from the rcu update side while holding a mutex.
    This guarantees that use-after-free could not happen.
    
    In the next patches I'll fix the callers with missing
    rcu_dereference_protected to make sparse/lockdep happy, the proper
    way to use these helpers is:
    
    	struct bpf_prog_array __rcu *progs = ...;
    	struct bpf_prog_array *p;
    
    	mutex_lock(&mtx);
    	p = rcu_dereference_protected(progs, lockdep_is_held(&mtx));
    	bpf_prog_array_length(p);
    	bpf_prog_array_copy_to_user(p, ...);
    	bpf_prog_array_delete_safe(p, ...);
    	bpf_prog_array_copy_info(p, ...);
    	bpf_prog_array_copy(p, ...);
    	bpf_prog_array_free(p);
    	mutex_unlock(&mtx);
    
    No functional changes! rcu_dereference_protected with lockdep_is_held
    should catch any cases where we update prog array without a mutex
    (I've looked at existing call sites and I think we hold a mutex
    everywhere).
    
    Motivation is to fix sparse warnings:
    kernel/bpf/core.c:1803:9: warning: incorrect type in argument 1 (different address spaces)
    kernel/bpf/core.c:1803:9:    expected struct callback_head *head
    kernel/bpf/core.c:1803:9:    got struct callback_head [noderef] <asn:4> *
    kernel/bpf/core.c:1877:44: warning: incorrect type in initializer (different address spaces)
    kernel/bpf/core.c:1877:44:    expected struct bpf_prog_array_item *item
    kernel/bpf/core.c:1877:44:    got struct bpf_prog_array_item [noderef] <asn:4> *
    kernel/bpf/core.c:1901:26: warning: incorrect type in assignment (different address spaces)
    kernel/bpf/core.c:1901:26:    expected struct bpf_prog_array_item *existing
    kernel/bpf/core.c:1901:26:    got struct bpf_prog_array_item [noderef] <asn:4> *
    kernel/bpf/core.c:1935:26: warning: incorrect type in assignment (different address spaces)
    kernel/bpf/core.c:1935:26:    expected struct bpf_prog_array_item *[assigned] existing
    kernel/bpf/core.c:1935:26:    got struct bpf_prog_array_item [noderef] <asn:4> *
    
    v2:
    * remove comment about potential race; that can't happen
      because all callers are in rcu-update section
    
    Cc: Roman Gushchin <guro@fb.com>
    Acked-by: NRoman Gushchin <guro@fb.com>
    Signed-off-by: NStanislav Fomichev <sdf@google.com>
    Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
    54e9c9d4
bpf.h 33.2 KB