@@ -3291,7 +3291,7 @@ int tcp_sock_set_syncnt(struct sock *sk, int val)
3291
3291
return - EINVAL ;
3292
3292
3293
3293
lock_sock (sk );
3294
- inet_csk (sk )-> icsk_syn_retries = val ;
3294
+ WRITE_ONCE ( inet_csk (sk )-> icsk_syn_retries , val ) ;
3295
3295
release_sock (sk );
3296
3296
return 0 ;
3297
3297
}
@@ -3300,7 +3300,7 @@ EXPORT_SYMBOL(tcp_sock_set_syncnt);
3300
3300
void tcp_sock_set_user_timeout (struct sock * sk , u32 val )
3301
3301
{
3302
3302
lock_sock (sk );
3303
- inet_csk (sk )-> icsk_user_timeout = val ;
3303
+ WRITE_ONCE ( inet_csk (sk )-> icsk_user_timeout , val ) ;
3304
3304
release_sock (sk );
3305
3305
}
3306
3306
EXPORT_SYMBOL (tcp_sock_set_user_timeout );
@@ -3312,7 +3312,8 @@ int tcp_sock_set_keepidle_locked(struct sock *sk, int val)
3312
3312
if (val < 1 || val > MAX_TCP_KEEPIDLE )
3313
3313
return - EINVAL ;
3314
3314
3315
- tp -> keepalive_time = val * HZ ;
3315
+ /* Paired with WRITE_ONCE() in keepalive_time_when() */
3316
+ WRITE_ONCE (tp -> keepalive_time , val * HZ );
3316
3317
if (sock_flag (sk , SOCK_KEEPOPEN ) &&
3317
3318
!((1 << sk -> sk_state ) & (TCPF_CLOSE | TCPF_LISTEN ))) {
3318
3319
u32 elapsed = keepalive_time_elapsed (tp );
@@ -3344,7 +3345,7 @@ int tcp_sock_set_keepintvl(struct sock *sk, int val)
3344
3345
return - EINVAL ;
3345
3346
3346
3347
lock_sock (sk );
3347
- tcp_sk (sk )-> keepalive_intvl = val * HZ ;
3348
+ WRITE_ONCE ( tcp_sk (sk )-> keepalive_intvl , val * HZ ) ;
3348
3349
release_sock (sk );
3349
3350
return 0 ;
3350
3351
}
@@ -3356,7 +3357,8 @@ int tcp_sock_set_keepcnt(struct sock *sk, int val)
3356
3357
return - EINVAL ;
3357
3358
3358
3359
lock_sock (sk );
3359
- tcp_sk (sk )-> keepalive_probes = val ;
3360
+ /* Paired with READ_ONCE() in keepalive_probes() */
3361
+ WRITE_ONCE (tcp_sk (sk )-> keepalive_probes , val );
3360
3362
release_sock (sk );
3361
3363
return 0 ;
3362
3364
}
@@ -3558,19 +3560,19 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
3558
3560
if (val < 1 || val > MAX_TCP_KEEPINTVL )
3559
3561
err = - EINVAL ;
3560
3562
else
3561
- tp -> keepalive_intvl = val * HZ ;
3563
+ WRITE_ONCE ( tp -> keepalive_intvl , val * HZ ) ;
3562
3564
break ;
3563
3565
case TCP_KEEPCNT :
3564
3566
if (val < 1 || val > MAX_TCP_KEEPCNT )
3565
3567
err = - EINVAL ;
3566
3568
else
3567
- tp -> keepalive_probes = val ;
3569
+ WRITE_ONCE ( tp -> keepalive_probes , val ) ;
3568
3570
break ;
3569
3571
case TCP_SYNCNT :
3570
3572
if (val < 1 || val > MAX_TCP_SYNCNT )
3571
3573
err = - EINVAL ;
3572
3574
else
3573
- icsk -> icsk_syn_retries = val ;
3575
+ WRITE_ONCE ( icsk -> icsk_syn_retries , val ) ;
3574
3576
break ;
3575
3577
3576
3578
case TCP_SAVE_SYN :
@@ -3583,18 +3585,18 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
3583
3585
3584
3586
case TCP_LINGER2 :
3585
3587
if (val < 0 )
3586
- tp -> linger2 = -1 ;
3588
+ WRITE_ONCE ( tp -> linger2 , -1 ) ;
3587
3589
else if (val > TCP_FIN_TIMEOUT_MAX / HZ )
3588
- tp -> linger2 = TCP_FIN_TIMEOUT_MAX ;
3590
+ WRITE_ONCE ( tp -> linger2 , TCP_FIN_TIMEOUT_MAX ) ;
3589
3591
else
3590
- tp -> linger2 = val * HZ ;
3592
+ WRITE_ONCE ( tp -> linger2 , val * HZ ) ;
3591
3593
break ;
3592
3594
3593
3595
case TCP_DEFER_ACCEPT :
3594
3596
/* Translate value in seconds to number of retransmits */
3595
- icsk -> icsk_accept_queue .rskq_defer_accept =
3596
- secs_to_retrans (val , TCP_TIMEOUT_INIT / HZ ,
3597
- TCP_RTO_MAX / HZ );
3597
+ WRITE_ONCE ( icsk -> icsk_accept_queue .rskq_defer_accept ,
3598
+ secs_to_retrans (val , TCP_TIMEOUT_INIT / HZ ,
3599
+ TCP_RTO_MAX / HZ ) );
3598
3600
break ;
3599
3601
3600
3602
case TCP_WINDOW_CLAMP :
@@ -3618,7 +3620,7 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
3618
3620
if (val < 0 )
3619
3621
err = - EINVAL ;
3620
3622
else
3621
- icsk -> icsk_user_timeout = val ;
3623
+ WRITE_ONCE ( icsk -> icsk_user_timeout , val ) ;
3622
3624
break ;
3623
3625
3624
3626
case TCP_FASTOPEN :
@@ -3656,13 +3658,13 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
3656
3658
if (!tp -> repair )
3657
3659
err = - EPERM ;
3658
3660
else
3659
- tp -> tsoffset = val - tcp_time_stamp_raw ();
3661
+ WRITE_ONCE ( tp -> tsoffset , val - tcp_time_stamp_raw () );
3660
3662
break ;
3661
3663
case TCP_REPAIR_WINDOW :
3662
3664
err = tcp_repair_set_window (tp , optval , optlen );
3663
3665
break ;
3664
3666
case TCP_NOTSENT_LOWAT :
3665
- tp -> notsent_lowat = val ;
3667
+ WRITE_ONCE ( tp -> notsent_lowat , val ) ;
3666
3668
sk -> sk_write_space (sk );
3667
3669
break ;
3668
3670
case TCP_INQ :
@@ -3674,7 +3676,7 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
3674
3676
case TCP_TX_DELAY :
3675
3677
if (val )
3676
3678
tcp_enable_tx_delay ();
3677
- tp -> tcp_tx_delay = val ;
3679
+ WRITE_ONCE ( tp -> tcp_tx_delay , val ) ;
3678
3680
break ;
3679
3681
default :
3680
3682
err = - ENOPROTOOPT ;
@@ -3991,17 +3993,18 @@ int do_tcp_getsockopt(struct sock *sk, int level,
3991
3993
val = keepalive_probes (tp );
3992
3994
break ;
3993
3995
case TCP_SYNCNT :
3994
- val = icsk -> icsk_syn_retries ? :
3996
+ val = READ_ONCE ( icsk -> icsk_syn_retries ) ? :
3995
3997
READ_ONCE (net -> ipv4 .sysctl_tcp_syn_retries );
3996
3998
break ;
3997
3999
case TCP_LINGER2 :
3998
- val = tp -> linger2 ;
4000
+ val = READ_ONCE ( tp -> linger2 ) ;
3999
4001
if (val >= 0 )
4000
4002
val = (val ? : READ_ONCE (net -> ipv4 .sysctl_tcp_fin_timeout )) / HZ ;
4001
4003
break ;
4002
4004
case TCP_DEFER_ACCEPT :
4003
- val = retrans_to_secs (icsk -> icsk_accept_queue .rskq_defer_accept ,
4004
- TCP_TIMEOUT_INIT / HZ , TCP_RTO_MAX / HZ );
4005
+ val = READ_ONCE (icsk -> icsk_accept_queue .rskq_defer_accept );
4006
+ val = retrans_to_secs (val , TCP_TIMEOUT_INIT / HZ ,
4007
+ TCP_RTO_MAX / HZ );
4005
4008
break ;
4006
4009
case TCP_WINDOW_CLAMP :
4007
4010
val = tp -> window_clamp ;
@@ -4138,11 +4141,11 @@ int do_tcp_getsockopt(struct sock *sk, int level,
4138
4141
break ;
4139
4142
4140
4143
case TCP_USER_TIMEOUT :
4141
- val = icsk -> icsk_user_timeout ;
4144
+ val = READ_ONCE ( icsk -> icsk_user_timeout ) ;
4142
4145
break ;
4143
4146
4144
4147
case TCP_FASTOPEN :
4145
- val = icsk -> icsk_accept_queue .fastopenq .max_qlen ;
4148
+ val = READ_ONCE ( icsk -> icsk_accept_queue .fastopenq .max_qlen ) ;
4146
4149
break ;
4147
4150
4148
4151
case TCP_FASTOPEN_CONNECT :
@@ -4154,14 +4157,14 @@ int do_tcp_getsockopt(struct sock *sk, int level,
4154
4157
break ;
4155
4158
4156
4159
case TCP_TX_DELAY :
4157
- val = tp -> tcp_tx_delay ;
4160
+ val = READ_ONCE ( tp -> tcp_tx_delay ) ;
4158
4161
break ;
4159
4162
4160
4163
case TCP_TIMESTAMP :
4161
- val = tcp_time_stamp_raw () + tp -> tsoffset ;
4164
+ val = tcp_time_stamp_raw () + READ_ONCE ( tp -> tsoffset ) ;
4162
4165
break ;
4163
4166
case TCP_NOTSENT_LOWAT :
4164
- val = tp -> notsent_lowat ;
4167
+ val = READ_ONCE ( tp -> notsent_lowat ) ;
4165
4168
break ;
4166
4169
case TCP_INQ :
4167
4170
val = tp -> recvmsg_inq ;
0 commit comments