Skip to content

Commit 9ae8e5a

Browse files
Eric Dumazetdavem330
authored andcommitted
mptcp: annotate lockless accesses to sk->sk_err
mptcp_poll() reads sk->sk_err without socket lock held/owned. Add READ_ONCE() and WRITE_ONCE() to avoid load/store tearing. Signed-off-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e13ec3d commit 9ae8e5a

File tree

3 files changed

+7
-7
lines changed

3 files changed

+7
-7
lines changed

net/mptcp/pm_netlink.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2019,7 +2019,7 @@ static int mptcp_event_put_token_and_ssk(struct sk_buff *skb,
20192019
nla_put_s32(skb, MPTCP_ATTR_IF_IDX, ssk->sk_bound_dev_if))
20202020
return -EMSGSIZE;
20212021

2022-
sk_err = ssk->sk_err;
2022+
sk_err = READ_ONCE(ssk->sk_err);
20232023
if (sk_err && sk->sk_state == TCP_ESTABLISHED &&
20242024
nla_put_u8(skb, MPTCP_ATTR_ERROR, sk_err))
20252025
return -EMSGSIZE;

net/mptcp/protocol.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2463,15 +2463,15 @@ static void mptcp_check_fastclose(struct mptcp_sock *msk)
24632463
/* Mirror the tcp_reset() error propagation */
24642464
switch (sk->sk_state) {
24652465
case TCP_SYN_SENT:
2466-
sk->sk_err = ECONNREFUSED;
2466+
WRITE_ONCE(sk->sk_err, ECONNREFUSED);
24672467
break;
24682468
case TCP_CLOSE_WAIT:
2469-
sk->sk_err = EPIPE;
2469+
WRITE_ONCE(sk->sk_err, EPIPE);
24702470
break;
24712471
case TCP_CLOSE:
24722472
return;
24732473
default:
2474-
sk->sk_err = ECONNRESET;
2474+
WRITE_ONCE(sk->sk_err, ECONNRESET);
24752475
}
24762476

24772477
inet_sk_state_store(sk, TCP_CLOSE);
@@ -3791,7 +3791,7 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock,
37913791

37923792
/* This barrier is coupled with smp_wmb() in __mptcp_error_report() */
37933793
smp_rmb();
3794-
if (sk->sk_err)
3794+
if (READ_ONCE(sk->sk_err))
37953795
mask |= EPOLLERR;
37963796

37973797
return mask;

net/mptcp/subflow.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,7 +1335,7 @@ static bool subflow_check_data_avail(struct sock *ssk)
13351335
subflow->reset_reason = MPTCP_RST_EMPTCP;
13361336

13371337
reset:
1338-
ssk->sk_err = EBADMSG;
1338+
WRITE_ONCE(ssk->sk_err, EBADMSG);
13391339
tcp_set_state(ssk, TCP_CLOSE);
13401340
while ((skb = skb_peek(&ssk->sk_receive_queue)))
13411341
sk_eat_skb(ssk, skb);
@@ -1419,7 +1419,7 @@ void __mptcp_error_report(struct sock *sk)
14191419
ssk_state = inet_sk_state_load(ssk);
14201420
if (ssk_state == TCP_CLOSE && !sock_flag(sk, SOCK_DEAD))
14211421
inet_sk_state_store(sk, ssk_state);
1422-
sk->sk_err = -err;
1422+
WRITE_ONCE(sk->sk_err, -err);
14231423

14241424
/* This barrier is coupled with smp_rmb() in mptcp_poll() */
14251425
smp_wmb();

0 commit comments

Comments
 (0)