Skip to content

Commit 0f95f7d

Browse files
Martin KaFai LauAlexei Starovoitov
authored andcommitted
bpf: net: Avoid do_ipv6_getsockopt() taking sk lock when called from bpf
Similar to the earlier patch that changes sk_getsockopt() to use sockopt_{lock,release}_sock() such that it can avoid taking the lock when called from bpf. This patch also changes do_ipv6_getsockopt() to use sockopt_{lock,release}_sock() such that bpf_getsockopt(SOL_IPV6) can reuse do_ipv6_getsockopt(). Although bpf_getsockopt(SOL_IPV6) currently does not support optname that requires lock_sock(), using sockopt_{lock,release}_sock() consistently across *_getsockopt() will make future optname addition harder to miss the sockopt_{lock,release}_sock() usage. eg. when adding new optname that requires a lock and the new optname is needed in bpf_getsockopt() also. Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org> Link: https://lore.kernel.org/r/20220902002859.2893064-1-kafai@fb.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
1 parent 6dadbe4 commit 0f95f7d

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

net/ipv6/ipv6_sockglue.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,7 +1078,7 @@ static int ipv6_get_msfilter(struct sock *sk, sockptr_t optval,
10781078
if (gsf.gf_group.ss_family != AF_INET6)
10791079
return -EADDRNOTAVAIL;
10801080
num = gsf.gf_numsrc;
1081-
lock_sock(sk);
1081+
sockopt_lock_sock(sk);
10821082
err = ip6_mc_msfget(sk, &gsf, optval, size0);
10831083
if (!err) {
10841084
if (num > gsf.gf_numsrc)
@@ -1088,7 +1088,7 @@ static int ipv6_get_msfilter(struct sock *sk, sockptr_t optval,
10881088
copy_to_sockptr(optval, &gsf, size0))
10891089
err = -EFAULT;
10901090
}
1091-
release_sock(sk);
1091+
sockopt_release_sock(sk);
10921092
return err;
10931093
}
10941094

@@ -1114,9 +1114,9 @@ static int compat_ipv6_get_msfilter(struct sock *sk, sockptr_t optval,
11141114
if (gf.gf_group.ss_family != AF_INET6)
11151115
return -EADDRNOTAVAIL;
11161116

1117-
lock_sock(sk);
1117+
sockopt_lock_sock(sk);
11181118
err = ip6_mc_msfget(sk, &gf, optval, size0);
1119-
release_sock(sk);
1119+
sockopt_release_sock(sk);
11201120
if (err)
11211121
return err;
11221122
if (num > gf.gf_numsrc)
@@ -1175,11 +1175,11 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
11751175
msg.msg_controllen = len;
11761176
msg.msg_flags = 0;
11771177

1178-
lock_sock(sk);
1178+
sockopt_lock_sock(sk);
11791179
skb = np->pktoptions;
11801180
if (skb)
11811181
ip6_datagram_recv_ctl(sk, &msg, skb);
1182-
release_sock(sk);
1182+
sockopt_release_sock(sk);
11831183
if (!skb) {
11841184
if (np->rxopt.bits.rxinfo) {
11851185
struct in6_pktinfo src_info;
@@ -1268,11 +1268,11 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
12681268
{
12691269
struct ipv6_txoptions *opt;
12701270

1271-
lock_sock(sk);
1271+
sockopt_lock_sock(sk);
12721272
opt = rcu_dereference_protected(np->opt,
12731273
lockdep_sock_is_held(sk));
12741274
len = ipv6_getsockopt_sticky(sk, opt, optname, optval, len);
1275-
release_sock(sk);
1275+
sockopt_release_sock(sk);
12761276
/* check if ipv6_getsockopt_sticky() returns err code */
12771277
if (len < 0)
12781278
return len;

0 commit comments

Comments
 (0)