• Martin KaFai Lau's avatar
    bpf: net: Avoid sk_setsockopt() taking sk lock when called from bpf · 24426654
    Martin KaFai Lau authored
    Most of the code in bpf_setsockopt(SOL_SOCKET) are duplicated from
    the sk_setsockopt().  The number of supported optnames are
    increasing ever and so as the duplicated code.
    
    One issue in reusing sk_setsockopt() is that the bpf prog
    has already acquired the sk lock.  This patch adds a
    has_current_bpf_ctx() to tell if the sk_setsockopt() is called from
    a bpf prog.  The bpf prog calling bpf_setsockopt() is either running
    in_task() or in_serving_softirq().  Both cases have the current->bpf_ctx
    initialized.  Thus, the has_current_bpf_ctx() only needs to
    test !!current->bpf_ctx.
    
    This patch also adds sockopt_{lock,release}_sock() helpers
    for sk_setsockopt() to use.  These helpers will test
    has_current_bpf_ctx() before acquiring/releasing the lock.  They are
    in EXPORT_SYMBOL for the ipv6 module to use in a latter patch.
    
    Note on the change in sock_setbindtodevice().  sockopt_lock_sock()
    is done in sock_setbindtodevice() instead of doing the lock_sock
    in sock_bindtoindex(..., lock_sk = true).
    Reviewed-by: default avatarStanislav Fomichev <sdf@google.com>
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Link: https://lore.kernel.org/r/20220817061717.4175589-1-kafai@fb.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    24426654
sock.h 82 KB