Index | Thread | Search

From:
Martin Pieuchot <mpi@openbsd.org>
Subject:
Re: sysctl(2): unlock KERN_MAXPROC
To:
Vitaliy Makkoveev <mvs@openbsd.org>
Cc:
tech@openbsd.org
Date:
Mon, 19 Aug 2024 11:56:40 +0200

Download raw body.

Thread
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?

What about the hashinit() calls in kern/kern_proc.c ?

> 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:
>