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;