Skip to content

Commit 8448508

Browse files
Eric Dumazetdavem330
Eric Dumazet
authored andcommitted
tcp: set TCP_KEEPCNT locklessly
tp->keepalive_probes can be set locklessly, readers are already taking care of this field being potentially set by other threads. Signed-off-by: Eric Dumazet <[email protected]> Acked-by: Soheil Hassas Yeganeh <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 6fd70a6 commit 8448508

File tree

1 file changed

+2
-8
lines changed

1 file changed

+2
-8
lines changed

net/ipv4/tcp.c

+2-8
Original file line numberDiff line numberDiff line change
@@ -3358,10 +3358,8 @@ int tcp_sock_set_keepcnt(struct sock *sk, int val)
33583358
if (val < 1 || val > MAX_TCP_KEEPCNT)
33593359
return -EINVAL;
33603360

3361-
lock_sock(sk);
33623361
/* Paired with READ_ONCE() in keepalive_probes() */
33633362
WRITE_ONCE(tcp_sk(sk)->keepalive_probes, val);
3364-
release_sock(sk);
33653363
return 0;
33663364
}
33673365
EXPORT_SYMBOL(tcp_sock_set_keepcnt);
@@ -3471,6 +3469,8 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
34713469
return tcp_sock_set_user_timeout(sk, val);
34723470
case TCP_KEEPINTVL:
34733471
return tcp_sock_set_keepintvl(sk, val);
3472+
case TCP_KEEPCNT:
3473+
return tcp_sock_set_keepcnt(sk, val);
34743474
}
34753475

34763476
sockopt_lock_sock(sk);
@@ -3568,12 +3568,6 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
35683568
case TCP_KEEPIDLE:
35693569
err = tcp_sock_set_keepidle_locked(sk, val);
35703570
break;
3571-
case TCP_KEEPCNT:
3572-
if (val < 1 || val > MAX_TCP_KEEPCNT)
3573-
err = -EINVAL;
3574-
else
3575-
WRITE_ONCE(tp->keepalive_probes, val);
3576-
break;
35773571
case TCP_SAVE_SYN:
35783572
/* 0: disable, 1: enable, 2: start from ether_header */
35793573
if (val < 0 || val > 2)

0 commit comments

Comments
 (0)