Index | Thread | Search

From:
Vitaliy Makkoveev <otto@bsdbox.dev>
Subject:
Re: more tcp sysctl variables atomic
To:
Alexander Bluhm <bluhm@openbsd.org>
Cc:
OpenBSD tech <tech@openbsd.org>
Date:
Sat, 28 Dec 2024 20:06:59 +0300

Download raw body.

Thread
> On 28 Dec 2024, at 17:25, Alexander Bluhm <bluhm@openbsd.org> wrote:
> 
> Hi,
> 
> These tcp sysctl variables are accessed independently.  So it is
> easy to make read access atomic.
> 
> ok?
> 

ok mvs

> bluhm
> 
> Index: netinet/tcp_input.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_input.c,v
> diff -u -p -r1.413 tcp_input.c
> --- netinet/tcp_input.c	26 Dec 2024 12:16:17 -0000	1.413
> +++ netinet/tcp_input.c	28 Dec 2024 12:37:40 -0000
> @@ -170,7 +170,7 @@ do { \
> 	if (m && (m->m_flags & M_PKTHDR)) \
> 		ifp = if_get(m->m_pkthdr.ph_ifidx); \
> 	if (TCP_TIMER_ISARMED(tp, TCPT_DELACK) || \
> -	    (tcp_ack_on_push && (tiflags) & TH_PUSH) || \
> +	    (atomic_load_int(&tcp_ack_on_push) && (tiflags) & TH_PUSH) || \
> 	    (ifp && (ifp->if_flags & IFF_LOOPBACK))) \
> 		tp->t_flags |= TF_ACKNOW; \
> 	else \
> @@ -2091,7 +2091,7 @@ dropwithreset_ratelim:
> 	 * a port for which we have no socket.
> 	 */
> 	if (ppsratecheck(&tcp_rst_ppslim_last, &tcp_rst_ppslim_count,
> -	    tcp_rst_ppslim) == 0) {
> +	    atomic_load_int(&tcp_rst_ppslim)) == 0) {
> 		/* XXX stat */
> 		goto drop;
> 	}
> @@ -3809,7 +3809,8 @@ syn_cache_add(struct sockaddr *src, stru
> 	    ) {
> 		tb.pf = tp->pf;
> 		tb.sack_enable = tp->sack_enable;
> -		tb.t_flags = tcp_do_rfc1323 ? (TF_REQ_SCALE|TF_REQ_TSTMP) : 0;
> +		tb.t_flags = atomic_load_int(&tcp_do_rfc1323) ?
> +		    (TF_REQ_SCALE|TF_REQ_TSTMP) : 0;
> #ifdef TCP_SIGNATURE
> 		if (tp->t_flags & TF_SIGNATURE)
> 			tb.t_flags |= TF_SIGNATURE;
> Index: netinet/tcp_output.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_output.c,v
> diff -u -p -r1.147 tcp_output.c
> --- netinet/tcp_output.c	26 Dec 2024 12:16:17 -0000	1.147
> +++ netinet/tcp_output.c	28 Dec 2024 12:43:47 -0000
> @@ -348,7 +348,7 @@ again:
> 	txmaxseg = ulmin(so->so_snd.sb_hiwat / 2, tp->t_maxseg);
> 
> 	if (len > txmaxseg) {
> -		if (tcp_do_tso &&
> +		if (atomic_load_int(&tcp_do_tso) &&
> 		    tp->t_inpcb->inp_options == NULL &&
> 		    tp->t_inpcb->inp_outputopts6 == NULL &&
> #ifdef TCP_SIGNATURE
> Index: netinet/tcp_subr.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_subr.c,v
> diff -u -p -r1.202 tcp_subr.c
> --- netinet/tcp_subr.c	26 Dec 2024 10:15:27 -0000	1.202
> +++ netinet/tcp_subr.c	28 Dec 2024 12:32:02 -0000
> @@ -443,8 +443,9 @@ tcp_newtcpcb(struct inpcb *inp, int wait
> 	for (i = 0; i < TCPT_NTIMERS; i++)
> 		TCP_TIMER_INIT(tp, i);
> 
> -	tp->sack_enable = tcp_do_sack;
> -	tp->t_flags = tcp_do_rfc1323 ? (TF_REQ_SCALE|TF_REQ_TSTMP) : 0;
> +	tp->sack_enable = atomic_load_int(&tcp_do_sack);
> +	tp->t_flags = atomic_load_int(&tcp_do_rfc1323) ?
> +	    (TF_REQ_SCALE|TF_REQ_TSTMP) : 0;
> 	tp->t_inpcb = inp;
> 	/*
> 	 * Init srtt to TCPTV_SRTTBASE (0), so we can tell that we have no
> Index: netinet/tcp_timer.c
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_timer.c,v
> diff -u -p -r1.77 tcp_timer.c
> --- netinet/tcp_timer.c	20 Dec 2024 21:30:17 -0000	1.77
> +++ netinet/tcp_timer.c	28 Dec 2024 12:41:46 -0000
> @@ -465,7 +465,7 @@ tcp_timer_keep(void *arg)
> 	tcpstat_inc(tcps_keeptimeo);
> 	if (TCPS_HAVEESTABLISHED(tp->t_state) == 0)
> 		goto dropit;
> -	if ((tcp_always_keepalive ||
> +	if ((atomic_load_int(&tcp_always_keepalive) ||
> 	    tp->t_inpcb->inp_socket->so_options & SO_KEEPALIVE) &&
> 	    tp->t_state <= TCPS_CLOSING) {
> 		int maxidle;
> Index: netinet/tcp_timer.h
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_timer.h,v
> diff -u -p -r1.22 tcp_timer.h
> --- netinet/tcp_timer.h	20 Dec 2024 21:30:17 -0000	1.22
> +++ netinet/tcp_timer.h	28 Dec 2024 12:42:07 -0000
> @@ -155,7 +155,7 @@ extern const tcp_timer_func_t tcp_timer_
> 
> extern int tcp_delack_msecs;		/* delayed ACK timeout in millisecs */
> extern int tcptv_keep_init;
> -extern int tcp_always_keepalive;	/* assume SO_KEEPALIVE is always set */
> +extern int tcp_always_keepalive;	/* [a] assume SO_KEEPALIVE always set */
> extern int tcp_keepidle;		/* time before keepalive probes begin */
> extern int tcp_keepintvl;		/* time between keepalive probes */
> extern int tcp_maxidle;			/* time to drop after starting probes */
> Index: netinet/tcp_var.h
> ===================================================================
> RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_var.h,v
> diff -u -p -r1.180 tcp_var.h
> --- netinet/tcp_var.h	26 Dec 2024 12:16:17 -0000	1.180
> +++ netinet/tcp_var.h	28 Dec 2024 12:45:26 -0000
> @@ -677,18 +677,18 @@ extern	const struct pr_usrreqs tcp6_usrr
> 
> extern	struct pool tcpcb_pool;
> extern	struct inpcbtable tcbtable, tcb6table;	/* queue of active tcpcb's */
> -extern	int tcp_do_rfc1323;	/* enabled/disabled? */
> +extern	int tcp_do_rfc1323;	/* [a] enabled/disabled? */
> extern	const int tcprexmtthresh;
> extern	int tcptv_keep_init;	/* [N] time to keep alive initial SYN packet */
> extern	int tcp_mssdflt;	/* [a] default maximum segment size */
> -extern	int tcp_rst_ppslim;	/* maximum outgoing RST packet per second */
> -extern	int tcp_ack_on_push;	/* ACK immediately on PUSH */
> -extern	int tcp_do_sack;	/* SACK enabled/disabled */
> +extern	int tcp_rst_ppslim;	/* [a] maximum outgoing RST packet per second */
> +extern	int tcp_ack_on_push;	/* [a] ACK immediately on PUSH */
> +extern	int tcp_do_sack;	/* [a] SACK enabled/disabled */
> extern	struct pool sackhl_pool;
> extern	int tcp_sackhole_limit;	/* max entries for tcp sack queues */
> extern	int tcp_do_ecn;		/* RFC3168 ECN enabled/disabled? */
> -extern	int tcp_do_rfc3390;	/* RFC3390 Increasing TCP's Initial Window */
> -extern	int tcp_do_tso;		/* enable TSO for TCP output packets */
> +extern	int tcp_do_rfc3390;	/* [a] RFC3390 Increasing TCP Initial Window */
> +extern	int tcp_do_tso;		/* [a] enable TSO for TCP output packets */
> 
> extern	struct pool tcpqe_pool;
> extern	int tcp_reass_limit;	/* max entries for tcp reass queues */
>