Download raw body.
tcp output MP fixes
On Wed, Nov 06, 2024 at 11:50:03AM +0100, Alexander Bluhm wrote:
> Next goal is running TCP socket layer with shared netlock. I went
> through tcp_output() and looked for MP races. Mostly documentation
> and small fixes.
tcp_update_sndspace() and tcp_update_rcvspace() only read global
variables that don't change. Mark them as such.
And can we get braces consistently around the multi-line if blocks?
ok?
bluhm
Index: netinet/tcp_usrreq.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_usrreq.c,v
diff -u -p -r1.231 tcp_usrreq.c
--- netinet/tcp_usrreq.c 12 Apr 2024 16:07:09 -0000 1.231
+++ netinet/tcp_usrreq.c 8 Nov 2024 15:15:57 -0000
@@ -102,15 +102,20 @@
#include <netinet6/in6_var.h>
#endif
+/*
+ * Locks used to protect global variables in this file:
+ * I immutable after creation
+ */
+
#ifndef TCP_SENDSPACE
#define TCP_SENDSPACE 1024*16
#endif
-u_int tcp_sendspace = TCP_SENDSPACE;
+u_int tcp_sendspace = TCP_SENDSPACE; /* [I] */
#ifndef TCP_RECVSPACE
#define TCP_RECVSPACE 1024*16
#endif
-u_int tcp_recvspace = TCP_RECVSPACE;
-u_int tcp_autorcvbuf_inc = 16 * 1024;
+u_int tcp_recvspace = TCP_RECVSPACE; /* [I] */
+u_int tcp_autorcvbuf_inc = 16 * 1024; /* [I] */
const struct pr_usrreqs tcp_usrreqs = {
.pru_attach = tcp_attach,
@@ -1516,13 +1521,14 @@ tcp_update_sndspace(struct tcpcb *tp)
/* low on memory try to get rid of some */
if (tcp_sendspace < nmax)
nmax = tcp_sendspace;
- } else if (so->so_snd.sb_wat != tcp_sendspace)
+ } else if (so->so_snd.sb_wat != tcp_sendspace) {
/* user requested buffer size, auto-scaling disabled */
nmax = so->so_snd.sb_wat;
- else
+ } else {
/* automatic buffer scaling */
nmax = MIN(sb_max, so->so_snd.sb_wat + tp->snd_max -
tp->snd_una);
+ }
/* a writable socket must be preserved because of poll(2) semantics */
if (sbspace(so, &so->so_snd) >= so->so_snd.sb_lowat) {
@@ -1556,10 +1562,10 @@ tcp_update_rcvspace(struct tcpcb *tp)
/* low on memory try to get rid of some */
if (tcp_recvspace < nmax)
nmax = tcp_recvspace;
- } else if (so->so_rcv.sb_wat != tcp_recvspace)
+ } else if (so->so_rcv.sb_wat != tcp_recvspace) {
/* user requested buffer size, auto-scaling disabled */
nmax = so->so_rcv.sb_wat;
- else {
+ } else {
/* automatic buffer scaling */
if (tp->rfbuf_cnt > so->so_rcv.sb_hiwat / 8 * 7)
nmax = MIN(sb_max, so->so_rcv.sb_hiwat +
tcp output MP fixes