Index | Thread | Search

From:
Vitaliy Makkoveev <mvs@openbsd.org>
Subject:
sysctl(2): unlock KERN_MAXPROC
To:
tech@openbsd.org
Date:
Sun, 18 Aug 2024 23:51:34 +0300

Download raw body.

Thread
I want to unlock atomically accessed integers from `kern_vars' and
remove corresponding cases from the 'switch' block.

`maxprocess' is atomically accessed integer. procinit() called during
bootstrap, so no atomic_load_int(9) required.

Index: sys/conf/param.c
===================================================================
RCS file: /cvs/src/sys/conf/param.c,v
diff -u -p -r1.50 param.c
--- sys/conf/param.c	5 May 2024 06:14:37 -0000	1.50
+++ sys/conf/param.c	18 Aug 2024 20:44:20 -0000
@@ -50,6 +50,11 @@
 #endif
 
 /*
+ * Locks used to protect data:
+ *	a	atomic
+ */
+
+/*
  * System parameter formulae.
  *
  * This file is copied into each directory where we compile
@@ -67,7 +72,7 @@ int	utc_offset = 0;
 #define	NTEXT (80 + NPROCESS / 8)		/* actually the object cache */
 #define	NVNODE (NPROCESS * 2 + NTEXT + 100)
 int	initialvnodes = NVNODE;
-int	maxprocess = NPROCESS;
+int	maxprocess = NPROCESS;				/* [a] */
 int	maxthread = 2 * NPROCESS;
 int	maxfiles = 5 * (NPROCESS + MAXUSERS) + 80;
 long	nmbclust = NMBCLUSTERS;
Index: sys/kern/kern_fork.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_fork.c,v
diff -u -p -r1.263 kern_fork.c
--- sys/kern/kern_fork.c	16 Aug 2024 16:19:03 -0000	1.263
+++ sys/kern/kern_fork.c	18 Aug 2024 20:44:21 -0000
@@ -353,7 +353,7 @@ fork1(struct proc *curp, int flags, void
 	struct proc *p;
 	uid_t uid = curp->p_ucred->cr_ruid;
 	struct vmspace *vm;
-	int count;
+	int count, maxprocess_local;
 	vaddr_t uaddr;
 	int error;
 	struct  ptrace_state *newptstat = NULL;
@@ -366,8 +366,9 @@ fork1(struct proc *curp, int flags, void
 	if ((error = fork_check_maxthread(uid)))
 		return error;
 
-	if ((nprocesses >= maxprocess - 5 && uid != 0) ||
-	    nprocesses >= maxprocess) {
+	maxprocess_local = atomic_load_int(&maxprocess);
+	if ((nprocesses >= maxprocess_local - 5 && uid != 0) ||
+	    nprocesses >= maxprocess_local) {
 		static struct timeval lasttfm;
 
 		if (ratecheck(&lasttfm, &fork_tfmrate))
Index: sys/kern/kern_resource.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_resource.c,v
diff -u -p -r1.86 kern_resource.c
--- sys/kern/kern_resource.c	9 Jul 2024 15:20:15 -0000	1.86
+++ sys/kern/kern_resource.c	18 Aug 2024 20:44:21 -0000
@@ -278,7 +278,7 @@ dosetrlimit(struct proc *p, u_int which,
 		maxlim = maxfiles;
 		break;
 	case RLIMIT_NPROC:
-		maxlim = maxprocess;
+		maxlim = atomic_load_int(&maxprocess);
 		break;
 	default:
 		maxlim = RLIM_INFINITY;
Index: sys/kern/kern_sysctl.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
diff -u -p -r1.439 kern_sysctl.c
--- sys/kern/kern_sysctl.c	14 Aug 2024 17:52:47 -0000	1.439
+++ sys/kern/kern_sysctl.c	18 Aug 2024 20:44:21 -0000
@@ -549,6 +549,7 @@ kern_sysctl(int *name, u_int namelen, vo
 		return (sysctl_rdint(oldp, oldlenp, newp, mp->msg_bufs));
 	}
 	case KERN_OSREV:
+	case KERN_MAXPROC:
 	case KERN_NFILES:
 	case KERN_TTYCOUNT:
 	case KERN_ARGMAX: