Module Name:    src
Committed By:   thorpej
Date:           Sun Apr 19 20:32:00 UTC 2020

Modified Files:
        src/sys/compat/linux/common: linux_misc.c linux_sched.c
        src/sys/compat/linux32/common: linux32_sysinfo.c
        src/sys/compat/netbsd32: netbsd32_execve.c
        src/sys/kern: kern_exec.c kern_exit.c kern_proc.c
        src/sys/miscfs/procfs: procfs_linux.c procfs_vfsops.c
        src/sys/rump/librump/rumpkern: lwproc.c

Log Message:
- Only increment nprocs when we're creating a new process, not just
  when allocating a PID.
- Per above, proc_free_pid() no longer decrements nprocs.  It's now done
  in proc_free() right after proc_free_pid().
- Ensure nprocs is accessed using atomics everywhere.


To generate a diff of this commit:
cvs rdiff -u -r1.247 -r1.248 src/sys/compat/linux/common/linux_misc.c
cvs rdiff -u -r1.73 -r1.74 src/sys/compat/linux/common/linux_sched.c
cvs rdiff -u -r1.10 -r1.11 src/sys/compat/linux32/common/linux32_sysinfo.c
cvs rdiff -u -r1.41 -r1.42 src/sys/compat/netbsd32/netbsd32_execve.c
cvs rdiff -u -r1.496 -r1.497 src/sys/kern/kern_exec.c
cvs rdiff -u -r1.287 -r1.288 src/sys/kern/kern_exit.c
cvs rdiff -u -r1.243 -r1.244 src/sys/kern/kern_proc.c
cvs rdiff -u -r1.80 -r1.81 src/sys/miscfs/procfs/procfs_linux.c
cvs rdiff -u -r1.104 -r1.105 src/sys/miscfs/procfs/procfs_vfsops.c
cvs rdiff -u -r1.44 -r1.45 src/sys/rump/librump/rumpkern/lwproc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/compat/linux/common/linux_misc.c
diff -u src/sys/compat/linux/common/linux_misc.c:1.247 src/sys/compat/linux/common/linux_misc.c:1.248
--- src/sys/compat/linux/common/linux_misc.c:1.247	Tue Dec 31 13:07:13 2019
+++ src/sys/compat/linux/common/linux_misc.c	Sun Apr 19 20:31:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_misc.c,v 1.247 2019/12/31 13:07:13 ad Exp $	*/
+/*	$NetBSD: linux_misc.c,v 1.248 2020/04/19 20:31:59 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 1995, 1998, 1999, 2008 The NetBSD Foundation, Inc.
@@ -57,7 +57,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.247 2019/12/31 13:07:13 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_misc.c,v 1.248 2020/04/19 20:31:59 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1360,7 +1360,7 @@ linux_sys_sysinfo(struct lwp *l, const s
 	si.totalswap = (u_long)uvmexp.swpages * uvmexp.pagesize;
 	si.freeswap = 
 	    (u_long)(uvmexp.swpages - uvmexp.swpginuse) * uvmexp.pagesize;
-	si.procs = nprocs;
+	si.procs = atomic_load_relaxed(&nprocs);
 
 	/* The following are only present in newer Linux kernels. */
 	si.totalbig = 0;

Index: src/sys/compat/linux/common/linux_sched.c
diff -u src/sys/compat/linux/common/linux_sched.c:1.73 src/sys/compat/linux/common/linux_sched.c:1.74
--- src/sys/compat/linux/common/linux_sched.c:1.73	Sat Nov 23 19:42:52 2019
+++ src/sys/compat/linux/common/linux_sched.c	Sun Apr 19 20:31:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_sched.c,v 1.73 2019/11/23 19:42:52 ad Exp $	*/
+/*	$NetBSD: linux_sched.c,v 1.74 2020/04/19 20:31:59 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2019 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_sched.c,v 1.73 2019/11/23 19:42:52 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_sched.c,v 1.74 2020/04/19 20:31:59 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/mount.h>
@@ -182,7 +182,7 @@ linux_clone_nptl(struct lwp *l, const st
 	void *parent_tidptr, *tls, *child_tidptr;
 	vaddr_t uaddr;
 	lwpid_t lid;
-	int flags, tnprocs, error;
+	int flags, error;
 
 	p = l->l_proc;
 	flags = SCARG(uap, flags);
@@ -190,17 +190,8 @@ linux_clone_nptl(struct lwp *l, const st
 	tls = SCARG(uap, tls);
 	child_tidptr = SCARG(uap, child_tidptr);
 
-	tnprocs = atomic_inc_uint_nv(&nprocs);
-	if (__predict_false(tnprocs >= maxproc) ||
-	    kauth_authorize_process(l->l_cred, KAUTH_PROCESS_FORK, p,
-	    KAUTH_ARG(tnprocs), NULL, NULL) != 0) {
-		atomic_dec_uint(&nprocs);
-		return EAGAIN;
-	}
-
 	uaddr = uvm_uarea_alloc();
 	if (__predict_false(uaddr == 0)) {
-		atomic_dec_uint(&nprocs);
 		return ENOMEM;
 	}
 
@@ -209,7 +200,6 @@ linux_clone_nptl(struct lwp *l, const st
 	    &l->l_sigmask, &l->l_sigstk);
 	if (__predict_false(error)) {
 		DPRINTF(("%s: lwp_create error=%d\n", __func__, error));
-		atomic_dec_uint(&nprocs);
 		uvm_uarea_free(uaddr);
 		return error;
 	}

Index: src/sys/compat/linux32/common/linux32_sysinfo.c
diff -u src/sys/compat/linux32/common/linux32_sysinfo.c:1.10 src/sys/compat/linux32/common/linux32_sysinfo.c:1.11
--- src/sys/compat/linux32/common/linux32_sysinfo.c:1.10	Tue Dec 31 13:07:13 2019
+++ src/sys/compat/linux32/common/linux32_sysinfo.c	Sun Apr 19 20:31:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux32_sysinfo.c,v 1.10 2019/12/31 13:07:13 ad Exp $ */
+/*	$NetBSD: linux32_sysinfo.c,v 1.11 2020/04/19 20:31:59 thorpej Exp $ */
 
 /*-
  * Copyright (c) 2006 Emmanuel Dreyfus, all rights reserved.
@@ -33,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: linux32_sysinfo.c,v 1.10 2019/12/31 13:07:13 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux32_sysinfo.c,v 1.11 2020/04/19 20:31:59 thorpej Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -83,7 +83,7 @@ linux32_sys_sysinfo(struct lwp *l, const
 	si.totalswap = (u_long)uvmexp.swpages * uvmexp.pagesize;
 	si.freeswap = 
 	    (u_long)(uvmexp.swpages - uvmexp.swpginuse) * uvmexp.pagesize;
-	si.procs = nprocs;
+	si.procs = atomic_load_relaxed(&nprocs);
 
 	/* The following are only present in newer Linux kernels. */
 	si.totalbig = 0;

Index: src/sys/compat/netbsd32/netbsd32_execve.c
diff -u src/sys/compat/netbsd32/netbsd32_execve.c:1.41 src/sys/compat/netbsd32/netbsd32_execve.c:1.42
--- src/sys/compat/netbsd32/netbsd32_execve.c:1.41	Tue Sep 17 15:19:27 2019
+++ src/sys/compat/netbsd32/netbsd32_execve.c	Sun Apr 19 20:31:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_execve.c,v 1.41 2019/09/17 15:19:27 christos Exp $	*/
+/*	$NetBSD: netbsd32_execve.c,v 1.42 2020/04/19 20:31:59 thorpej Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Matthew R. Green
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_execve.c,v 1.41 2019/09/17 15:19:27 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_execve.c,v 1.42 2020/04/19 20:31:59 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -182,6 +182,7 @@ netbsd32_posix_spawn(struct lwp *l,
 	rlim_t max_fileactions;
 	proc_t *p = l->l_proc;
 
+	/* check_posix_spawn() increments nprocs for us. */
 	error = check_posix_spawn(l);
 	if (error) {
 		*retval = error;

Index: src/sys/kern/kern_exec.c
diff -u src/sys/kern/kern_exec.c:1.496 src/sys/kern/kern_exec.c:1.497
--- src/sys/kern/kern_exec.c:1.496	Tue Apr 14 22:42:18 2020
+++ src/sys/kern/kern_exec.c	Sun Apr 19 20:31:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exec.c,v 1.496 2020/04/14 22:42:18 kamil Exp $	*/
+/*	$NetBSD: kern_exec.c,v 1.497 2020/04/19 20:31:59 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2019, 2020 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.496 2020/04/14 22:42:18 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exec.c,v 1.497 2020/04/19 20:31:59 thorpej Exp $");
 
 #include "opt_exec.h"
 #include "opt_execfmt.h"
@@ -2397,6 +2397,10 @@ out:
 	return error;
 }
 
+/*
+ * N.B. increments nprocs upon success.  Callers need to drop nprocs if
+ * they fail for some other reason.
+ */
 int
 check_posix_spawn(struct lwp *l1)
 {
@@ -2751,6 +2755,7 @@ sys_posix_spawn(struct lwp *l1, const st
 	rlim_t max_fileactions;
 	proc_t *p = l1->l_proc;
 
+	/* check_posix_spawn() increments nprocs for us. */
 	error = check_posix_spawn(l1);
 	if (error) {
 		*retval = error;

Index: src/sys/kern/kern_exit.c
diff -u src/sys/kern/kern_exit.c:1.287 src/sys/kern/kern_exit.c:1.288
--- src/sys/kern/kern_exit.c:1.287	Sat Apr  4 20:20:12 2020
+++ src/sys/kern/kern_exit.c	Sun Apr 19 20:31:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_exit.c,v 1.287 2020/04/04 20:20:12 thorpej Exp $	*/
+/*	$NetBSD: kern_exit.c,v 1.288 2020/04/19 20:31:59 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 1998, 1999, 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.287 2020/04/04 20:20:12 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_exit.c,v 1.288 2020/04/19 20:31:59 thorpej Exp $");
 
 #include "opt_ktrace.h"
 #include "opt_dtrace.h"
@@ -1216,6 +1216,7 @@ proc_free(struct proc *p, struct wrusage
 	 * Let pid be reallocated.
 	 */
 	proc_free_pid(p->p_pid);
+	atomic_dec_uint(&nprocs);
 
 	/*
 	 * Unlink process from its process group.

Index: src/sys/kern/kern_proc.c
diff -u src/sys/kern/kern_proc.c:1.243 src/sys/kern/kern_proc.c:1.244
--- src/sys/kern/kern_proc.c:1.243	Mon Apr  6 08:20:05 2020
+++ src/sys/kern/kern_proc.c	Sun Apr 19 20:31:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_proc.c,v 1.243 2020/04/06 08:20:05 kamil Exp $	*/
+/*	$NetBSD: kern_proc.c,v 1.244 2020/04/19 20:31:59 thorpej Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.243 2020/04/06 08:20:05 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_proc.c,v 1.244 2020/04/19 20:31:59 thorpej Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_kstack.h"
@@ -866,8 +866,6 @@ proc_free_pid(pid_t pid)
 		last_free_pt = pid;
 		pid_alloc_cnt--;
 	}
-
-	atomic_dec_uint(&nprocs);
 }
 
 void

Index: src/sys/miscfs/procfs/procfs_linux.c
diff -u src/sys/miscfs/procfs/procfs_linux.c:1.80 src/sys/miscfs/procfs/procfs_linux.c:1.81
--- src/sys/miscfs/procfs/procfs_linux.c:1.80	Thu Jan  2 15:42:27 2020
+++ src/sys/miscfs/procfs/procfs_linux.c	Sun Apr 19 20:31:59 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: procfs_linux.c,v 1.80 2020/01/02 15:42:27 thorpej Exp $      */
+/*      $NetBSD: procfs_linux.c,v 1.81 2020/04/19 20:31:59 thorpej Exp $      */
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.80 2020/01/02 15:42:27 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.81 2020/04/19 20:31:59 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -346,7 +346,7 @@ procfs_doloadavg(struct lwp *curl, struc
 		(int)(averunnable.ldavg[2] / averunnable.fscale),
 		(int)(averunnable.ldavg[2] * 100 / averunnable.fscale % 100),
 		1,		/* number of ONPROC processes */
-		nprocs,
+		atomic_load_relaxed(&nprocs),
 		30000);		/* last pid */
 	if (len == 0)
 		goto out;

Index: src/sys/miscfs/procfs/procfs_vfsops.c
diff -u src/sys/miscfs/procfs/procfs_vfsops.c:1.104 src/sys/miscfs/procfs/procfs_vfsops.c:1.105
--- src/sys/miscfs/procfs/procfs_vfsops.c:1.104	Sat Apr  4 20:49:30 2020
+++ src/sys/miscfs/procfs/procfs_vfsops.c	Sun Apr 19 20:31:59 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: procfs_vfsops.c,v 1.104 2020/04/04 20:49:30 ad Exp $	*/
+/*	$NetBSD: procfs_vfsops.c,v 1.105 2020/04/19 20:31:59 thorpej Exp $	*/
 
 /*
  * Copyright (c) 1993
@@ -76,7 +76,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.104 2020/04/04 20:49:30 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_vfsops.c,v 1.105 2020/04/19 20:31:59 thorpej Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -236,9 +236,9 @@ procfs_statvfs(struct mount *mp, struct 
 	sbp->f_frsize = PAGE_SIZE;
 	sbp->f_iosize = PAGE_SIZE;
 	sbp->f_blocks = 1;
-	sbp->f_files = maxproc;			/* approx */
-	sbp->f_ffree = maxproc - nprocs;	/* approx */
-	sbp->f_favail = maxproc - nprocs;	/* approx */
+	sbp->f_files = maxproc;					/* approx */
+	sbp->f_ffree = maxproc - atomic_load_relaxed(&nprocs);	/* approx */
+	sbp->f_favail = maxproc - atomic_load_relaxed(&nprocs);	/* approx */
 
 	return (0);
 }

Index: src/sys/rump/librump/rumpkern/lwproc.c
diff -u src/sys/rump/librump/rumpkern/lwproc.c:1.44 src/sys/rump/librump/rumpkern/lwproc.c:1.45
--- src/sys/rump/librump/rumpkern/lwproc.c:1.44	Sat Feb 15 18:12:15 2020
+++ src/sys/rump/librump/rumpkern/lwproc.c	Sun Apr 19 20:32:00 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: lwproc.c,v 1.44 2020/02/15 18:12:15 ad Exp $	*/
+/*      $NetBSD: lwproc.c,v 1.45 2020/04/19 20:32:00 thorpej Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -28,7 +28,7 @@
 #define RUMP__CURLWP_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.44 2020/02/15 18:12:15 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lwproc.c,v 1.45 2020/04/19 20:32:00 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -178,7 +178,8 @@ lwproc_proc_free(struct proc *p)
 
 	LIST_REMOVE(p, p_list);
 	LIST_REMOVE(p, p_sibling);
-	proc_free_pid(p->p_pid); /* decrements nprocs */
+	proc_free_pid(p->p_pid);
+	atomic_dec_uint(&nprocs);
 	proc_leavepgrp(p); /* releases proc_lock */
 
 	cred = p->p_cred;

Reply via email to