Index | Thread | Search

From:
Alexander Bluhm <bluhm@openbsd.org>
Subject:
more tcp sysctl variables atomic
To:
tech@openbsd.org
Date:
Sat, 28 Dec 2024 15:25:14 +0100

Download raw body.

Thread
Hi,

These tcp sysctl variables are accessed independently.  So it is
easy to make read access atomic.

ok?

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 */