Download raw body.
sysctl(2): unlock KERN_MAXPROC
On Mon, Aug 19, 2024 at 11:56:40AM +0200, Martin Pieuchot wrote:
> On 18/08/24(Sun) 23:51, Vitaliy Makkoveev wrote:
> > 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.
>
> Could you keep maxthread in sync?
>
Sure.
> What about the hashinit() calls in kern/kern_proc.c ?
>
procinit() called during kernel bootstrap, you can't have concurrent
sysctl(2) threads this time. This is also true for pmap_bootstrap().
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 19 Aug 2024 10:23:58 -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,8 +72,8 @@ 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 maxthread = 2 * NPROCESS;
+int maxprocess = NPROCESS; /* [a] */
+int maxthread = 2 * NPROCESS; /* [a] */
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 19 Aug 2024 10:23:59 -0000
@@ -307,7 +307,7 @@ struct timeval fork_tfmrate = { 10, 0 };
int
fork_check_maxthread(uid_t uid)
{
- int val;
+ int maxthread_local, val;
/*
* Although process entries are dynamically created, we still keep
@@ -318,8 +318,10 @@ fork_check_maxthread(uid_t uid)
* the variable nthreads is the current number of procs, maxthread is
* the limit.
*/
+ maxthread_local = atomic_load_int(&maxthread);
val = atomic_inc_int_nv(&nthreads);
- if ((val > maxthread - 5 && uid != 0) || val > maxthread) {
+ if ((val > maxthread_local - 5 && uid != 0) ||
+ val > maxthread_local) {
static struct timeval lasttfm;
if (ratecheck(&lasttfm, &fork_tfmrate))
@@ -353,7 +355,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 +368,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 19 Aug 2024 10:23:59 -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 19 Aug 2024 10:23:59 -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:
@@ -558,6 +559,7 @@ kern_sysctl(int *name, u_int namelen, vo
case KERN_SAVED_IDS:
case KERN_MAXPARTITIONS:
case KERN_RAWPARTITION:
+ case KERN_MAXTHREAD:
case KERN_NTHREADS:
case KERN_SOMAXCONN:
case KERN_SOMINCONN:
sysctl(2): unlock KERN_MAXPROC