dccp: annotate lockless accesses to sk->sk_err_soft
authorEric Dumazet <edumazet@google.com>
Wed, 15 Mar 2023 20:57:42 +0000 (20:57 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 17 Mar 2023 08:25:05 +0000 (08:25 +0000)
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>
net/dccp/ipv4.c
net/dccp/ipv6.c
net/dccp/timer.c

index b780827..3ab6841 100644 (file)
@@ -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);
 
@@ -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;
        }
 
@@ -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);
index b9d7c3d..47fb108 100644 (file)
@@ -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);
index 27a3b37..b3255e8 100644 (file)
@@ -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);