From: Martin KaFai Lau Date: Fri, 2 Sep 2022 00:28:09 +0000 (-0700) Subject: bpf: net: Avoid sk_getsockopt() taking sk lock when called from bpf X-Git-Tag: v6.1-rc1~170^2~251^2~1^2~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2c5b6bf5cda048af896bb0e12a956783f7d6c835;p=thirdparty%2Fkernel%2Flinux.git bpf: net: Avoid sk_getsockopt() taking sk lock when called from bpf Similar to the earlier commit that changed sk_setsockopt() to use sockopt_{lock,release}_sock() such that it can avoid taking lock when called from bpf. This patch also changes sk_getsockopt() to use sockopt_{lock,release}_sock() such that a latter patch can make bpf_getsockopt(SOL_SOCKET) to reuse sk_getsockopt(). Only sk_get_filter() requires this change and it is used by the optname SO_GET_FILTER. The '.getname' implementations in sock->ops->getname() is not changed also since bpf does not always have the sk->sk_socket pointer and cannot support SO_PEERNAME. Signed-off-by: Martin KaFai Lau Link: https://lore.kernel.org/r/20220902002809.2888981-1-kafai@fb.com Signed-off-by: Alexei Starovoitov --- diff --git a/net/core/filter.c b/net/core/filter.c index 962014f7f64be..f57f78feb380b 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -10722,7 +10722,7 @@ int sk_get_filter(struct sock *sk, sockptr_t optval, unsigned int len) struct sk_filter *filter; int ret = 0; - lock_sock(sk); + sockopt_lock_sock(sk); filter = rcu_dereference_protected(sk->sk_filter, lockdep_sock_is_held(sk)); if (!filter) @@ -10755,7 +10755,7 @@ int sk_get_filter(struct sock *sk, sockptr_t optval, unsigned int len) */ ret = fprog->len; out: - release_sock(sk); + sockopt_release_sock(sk); return ret; }