• Martin KaFai Lau's avatar
    net: Add ID (if needed) to sock_reuseport and expose reuseport_lock · 736b4602
    Martin KaFai Lau authored
    A later patch will introduce a BPF_MAP_TYPE_REUSEPORT_ARRAY which
    allows a SO_REUSEPORT sk to be added to a bpf map.  When a sk
    is removed from reuse->socks[], it also needs to be removed from
    the bpf map.  Also, when adding a sk to a bpf map, the bpf
    map needs to ensure it is indeed in a reuse->socks[].
    Hence, reuseport_lock is needed by the bpf map to ensure its
    map_update_elem() and map_delete_elem() operations are in-sync with
    the reuse->socks[].  The BPF_MAP_TYPE_REUSEPORT_ARRAY map will only
    acquire the reuseport_lock after ensuring the adding sk is already
    in a reuseport group (i.e. reuse->socks[]).  The map_lookup_elem()
    will be lockless.
    
    This patch also adds an ID to sock_reuseport.  A later patch
    will introduce BPF_PROG_TYPE_SK_REUSEPORT which allows
    a bpf prog to select a sk from a bpf map.  It is inflexible to
    statically enforce a bpf map can only contain the sk belonging to
    a particular reuse->socks[] (i.e. same IP:PORT) during the bpf
    verification time. For example, think about the the map-in-map situation
    where the inner map can be dynamically changed in runtime and the outer
    map may have inner maps belonging to different reuseport groups.
    Hence, when the bpf prog (in the new BPF_PROG_TYPE_SK_REUSEPORT
    type) selects a sk,  this selected sk has to be checked to ensure it
    belongs to the requesting reuseport group (i.e. the group serving
    that IP:PORT).
    
    The "sk->sk_reuseport_cb" pointer cannot be used for this checking
    purpose because the pointer value will change after reuseport_grow().
    Instead of saving all checking conditions like the ones
    preced calling "reuseport_add_sock()" and compare them everytime a
    bpf_prog is run, a 32bits ID is introduced to survive the
    reuseport_grow().  The ID is only acquired if any of the
    reuse->socks[] is added to the newly introduced
    "BPF_MAP_TYPE_REUSEPORT_ARRAY" map.
    
    If "BPF_MAP_TYPE_REUSEPORT_ARRAY" is not used,  the changes in this
    patch is a no-op.
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    736b4602
sock_reuseport.c 7.36 KB