summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_fork.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index c7cbf28..d791302 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -93,6 +93,8 @@ struct fork_args {
};
#endif
+int forksleep; /* Place for fork1() to sleep on. */
+
static void
init_fork_list(void *data __unused)
{
@@ -297,8 +299,8 @@ fork1(td, flags, procp)
* processes, maxproc is the limit.
*/
uid = p1->p_ucred->cr_ruid;
- if ((nprocs >= maxproc - 1 && uid != 0) || nprocs >= maxproc) {
- tablefull("proc");
+ if ((nprocs >= maxproc - 10 && uid != 0) || nprocs >= maxproc) {
+ tsleep(&forksleep, PUSER, "fork", hz / 2);
return (EAGAIN);
}
/*
@@ -318,6 +320,7 @@ fork1(td, flags, procp)
* Back out the process count
*/
nprocs--;
+ tsleep(&forksleep, PUSER, "fork", hz / 2);
return (EAGAIN);
}
OpenPOWER on IntegriCloud