Skip to content

Commit 9a25f0c

Browse files
edumazetdavem330
authored andcommitted
dccp: annotate lockless accesses to sk->sk_err_soft
This field can be read/written without lock synchronization. Signed-off-by: Eric Dumazet <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent cee1af8 commit 9a25f0c

File tree

3 files changed

+14
-11
lines changed

3 files changed

+14
-11
lines changed

net/dccp/ipv4.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk,
177177
* for the case, if this connection will not able to recover.
178178
*/
179179
if (mtu < dst_mtu(dst) && ip_dont_fragment(sk, dst))
180-
sk->sk_err_soft = EMSGSIZE;
180+
WRITE_ONCE(sk->sk_err_soft, EMSGSIZE);
181181

182182
mtu = dst_mtu(dst);
183183

@@ -339,8 +339,9 @@ static int dccp_v4_err(struct sk_buff *skb, u32 info)
339339
sk_error_report(sk);
340340

341341
dccp_done(sk);
342-
} else
343-
sk->sk_err_soft = err;
342+
} else {
343+
WRITE_ONCE(sk->sk_err_soft, err);
344+
}
344345
goto out;
345346
}
346347

@@ -364,8 +365,9 @@ static int dccp_v4_err(struct sk_buff *skb, u32 info)
364365
if (!sock_owned_by_user(sk) && inet->recverr) {
365366
sk->sk_err = err;
366367
sk_error_report(sk);
367-
} else /* Only an error on timeout */
368-
sk->sk_err_soft = err;
368+
} else { /* Only an error on timeout */
369+
WRITE_ONCE(sk->sk_err_soft, err);
370+
}
369371
out:
370372
bh_unlock_sock(sk);
371373
sock_put(sk);

net/dccp/ipv6.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -174,17 +174,18 @@ static int dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
174174
*/
175175
sk_error_report(sk);
176176
dccp_done(sk);
177-
} else
178-
sk->sk_err_soft = err;
177+
} else {
178+
WRITE_ONCE(sk->sk_err_soft, err);
179+
}
179180
goto out;
180181
}
181182

182183
if (!sock_owned_by_user(sk) && np->recverr) {
183184
sk->sk_err = err;
184185
sk_error_report(sk);
185-
} else
186-
sk->sk_err_soft = err;
187-
186+
} else {
187+
WRITE_ONCE(sk->sk_err_soft, err);
188+
}
188189
out:
189190
bh_unlock_sock(sk);
190191
sock_put(sk);

net/dccp/timer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ int sysctl_dccp_retries2 __read_mostly = TCP_RETR2;
1919

2020
static void dccp_write_err(struct sock *sk)
2121
{
22-
sk->sk_err = sk->sk_err_soft ? : ETIMEDOUT;
22+
sk->sk_err = READ_ONCE(sk->sk_err_soft) ? : ETIMEDOUT;
2323
sk_error_report(sk);
2424

2525
dccp_send_reset(sk, DCCP_RESET_CODE_ABORTED);

0 commit comments

Comments
 (0)