lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CACSApvZjQrgZhYj+2=r7YRABCCAi41oxtvLw+KAUS-zu6LV5Yg@mail.gmail.com>
Date: Fri, 4 Aug 2023 11:53:23 -0400
From: Soheil Hassas Yeganeh <soheil@...gle.com>
To: Eric Dumazet <edumazet@...gle.com>
Cc: "David S . Miller" <davem@...emloft.net>, Jakub Kicinski <kuba@...nel.org>, 
	Paolo Abeni <pabeni@...hat.com>, netdev@...r.kernel.org, eric.dumazet@...il.com
Subject: Re: [PATCH net-next 5/6] tcp: set TCP_LINGER2 locklessly

On Fri, Aug 4, 2023 at 10:46 AM Eric Dumazet <edumazet@...gle.com> wrote:
>
> tp->linger2 can be set locklessly as long as readers
> use READ_ONCE().
>
> Signed-off-by: Eric Dumazet <edumazet@...gle.com>

Acked-by: Soheil Hassas Yeganeh <soheil@...gle.com>

> ---
>  net/ipv4/tcp.c       | 19 +++++++++----------
>  net/ipv4/tcp_input.c |  2 +-
>  net/ipv4/tcp_timer.c |  2 +-
>  3 files changed, 11 insertions(+), 12 deletions(-)
>
> diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
> index e74a9593283c91aa23fe23fdd125d4ba680a542c..5c71b4fe11d1c34456976d60eb8742641111dd62 100644
> --- a/net/ipv4/tcp.c
> +++ b/net/ipv4/tcp.c
> @@ -2865,7 +2865,7 @@ void __tcp_close(struct sock *sk, long timeout)
>
>         if (sk->sk_state == TCP_FIN_WAIT2) {
>                 struct tcp_sock *tp = tcp_sk(sk);
> -               if (tp->linger2 < 0) {
> +               if (READ_ONCE(tp->linger2) < 0) {
>                         tcp_set_state(sk, TCP_CLOSE);
>                         tcp_send_active_reset(sk, GFP_ATOMIC);
>                         __NET_INC_STATS(sock_net(sk),
> @@ -3471,6 +3471,14 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
>                 return tcp_sock_set_keepintvl(sk, val);
>         case TCP_KEEPCNT:
>                 return tcp_sock_set_keepcnt(sk, val);
> +       case TCP_LINGER2:
> +               if (val < 0)
> +                       WRITE_ONCE(tp->linger2, -1);
> +               else if (val > TCP_FIN_TIMEOUT_MAX / HZ)
> +                       WRITE_ONCE(tp->linger2, TCP_FIN_TIMEOUT_MAX);
> +               else
> +                       WRITE_ONCE(tp->linger2, val * HZ);
> +               return 0;
>         }
>
>         sockopt_lock_sock(sk);
> @@ -3576,15 +3584,6 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
>                         tp->save_syn = val;
>                 break;
>
> -       case TCP_LINGER2:
> -               if (val < 0)
> -                       WRITE_ONCE(tp->linger2, -1);
> -               else if (val > TCP_FIN_TIMEOUT_MAX / HZ)
> -                       WRITE_ONCE(tp->linger2, TCP_FIN_TIMEOUT_MAX);
> -               else
> -                       WRITE_ONCE(tp->linger2, val * HZ);
> -               break;
> -
>         case TCP_DEFER_ACCEPT:
>                 /* Translate value in seconds to number of retransmits */
>                 WRITE_ONCE(icsk->icsk_accept_queue.rskq_defer_accept,
> diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
> index 670c3dab24f2b4d3ab4af84a2715a134cd22b443..f445f5a7c0ebf5f7ab2b2402357f3749d954c0e8 100644
> --- a/net/ipv4/tcp_input.c
> +++ b/net/ipv4/tcp_input.c
> @@ -6625,7 +6625,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
>                         break;
>                 }
>
> -               if (tp->linger2 < 0) {
> +               if (READ_ONCE(tp->linger2) < 0) {
>                         tcp_done(sk);
>                         NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONDATA);
>                         return 1;
> diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
> index f99e2d06ae7cae72efcafe2bd664545fac8f3fee..d45c96c7f5a4473628bd76366c1b5694a2904aec 100644
> --- a/net/ipv4/tcp_timer.c
> +++ b/net/ipv4/tcp_timer.c
> @@ -714,7 +714,7 @@ static void tcp_keepalive_timer (struct timer_list *t)
>
>         tcp_mstamp_refresh(tp);
>         if (sk->sk_state == TCP_FIN_WAIT2 && sock_flag(sk, SOCK_DEAD)) {
> -               if (tp->linger2 >= 0) {
> +               if (READ_ONCE(tp->linger2) >= 0) {
>                         const int tmo = tcp_fin_time(sk) - TCP_TIMEWAIT_LEN;
>
>                         if (tmo > 0) {
> --
> 2.41.0.640.ga95def55d0-goog
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ