Skip to content

Commit

Permalink
dccp: annotate lockless accesses to sk->sk_err_soft
Browse files Browse the repository at this point in the history
This field can be read/written without lock synchronization.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Mar 17, 2023
1 parent cee1af8 commit 9a25f0c
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 11 deletions.
12 changes: 7 additions & 5 deletions net/dccp/ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ static inline void dccp_do_pmtu_discovery(struct sock *sk,
* for the case, if this connection will not able to recover.
*/
if (mtu < dst_mtu(dst) && ip_dont_fragment(sk, dst))
sk->sk_err_soft = EMSGSIZE;
WRITE_ONCE(sk->sk_err_soft, EMSGSIZE);

mtu = dst_mtu(dst);

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

dccp_done(sk);
} else
sk->sk_err_soft = err;
} else {
WRITE_ONCE(sk->sk_err_soft, err);
}
goto out;
}

Expand All @@ -364,8 +365,9 @@ static int dccp_v4_err(struct sk_buff *skb, u32 info)
if (!sock_owned_by_user(sk) && inet->recverr) {
sk->sk_err = err;
sk_error_report(sk);
} else /* Only an error on timeout */
sk->sk_err_soft = err;
} else { /* Only an error on timeout */
WRITE_ONCE(sk->sk_err_soft, err);
}
out:
bh_unlock_sock(sk);
sock_put(sk);
Expand Down
11 changes: 6 additions & 5 deletions net/dccp/ipv6.c
Original file line number Diff line number Diff line change
Expand Up @@ -174,17 +174,18 @@ static int dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
*/
sk_error_report(sk);
dccp_done(sk);
} else
sk->sk_err_soft = err;
} else {
WRITE_ONCE(sk->sk_err_soft, err);
}
goto out;
}

if (!sock_owned_by_user(sk) && np->recverr) {
sk->sk_err = err;
sk_error_report(sk);
} else
sk->sk_err_soft = err;

} else {
WRITE_ONCE(sk->sk_err_soft, err);
}
out:
bh_unlock_sock(sk);
sock_put(sk);
Expand Down
2 changes: 1 addition & 1 deletion net/dccp/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ int sysctl_dccp_retries2 __read_mostly = TCP_RETR2;

static void dccp_write_err(struct sock *sk)
{
sk->sk_err = sk->sk_err_soft ? : ETIMEDOUT;
sk->sk_err = READ_ONCE(sk->sk_err_soft) ? : ETIMEDOUT;
sk_error_report(sk);

dccp_send_reset(sk, DCCP_RESET_CODE_ABORTED);
Expand Down

0 comments on commit 9a25f0c

Please sign in to comment.