summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_fork.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2004-09-03 05:11:32 +0000
committeralc <alc@FreeBSD.org>2004-09-03 05:11:32 +0000
commit82e55fdf7687982550eb5f4127031095fdf8d75a (patch)
tree354bad52910b678ed5b43b366707bc35dc3371aa /sys/kern/kern_fork.c
parent5aa2eb98b7e705cdbac165895e81d5e4bd6b5453 (diff)
downloadFreeBSD-src-82e55fdf7687982550eb5f4127031095fdf8d75a.zip
FreeBSD-src-82e55fdf7687982550eb5f4127031095fdf8d75a.tar.gz
Push Giant deep into vm_forkproc(), acquiring it only if the process has
mapped System V shared memory segments (see shmfork_myhook()) or requires the allocation of an ldt (see vm_fault_wire()).
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r--sys/kern/kern_fork.c28
1 files changed, 12 insertions, 16 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 43a5595..b5459d8 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -219,9 +219,7 @@ fork1(td, flags, pages, procp)
* certain parts of a process from itself.
*/
if ((flags & RFPROC) == 0) {
- mtx_lock(&Giant);
vm_forkproc(td, NULL, NULL, flags);
- mtx_unlock(&Giant);
/*
* Close all file descriptors.
@@ -668,27 +666,25 @@ again:
* Finish creating the child process. It will return via a different
* execution path later. (ie: directly into user mode)
*/
- mtx_lock(&Giant);
vm_forkproc(td, p2, td2, flags);
if (flags == (RFFDG | RFPROC)) {
- cnt.v_forks++;
- cnt.v_forkpages += p2->p_vmspace->vm_dsize +
- p2->p_vmspace->vm_ssize;
+ atomic_add_int(&cnt.v_forks, 1);
+ atomic_add_int(&cnt.v_forkpages, p2->p_vmspace->vm_dsize +
+ p2->p_vmspace->vm_ssize);
} else if (flags == (RFFDG | RFPROC | RFPPWAIT | RFMEM)) {
- cnt.v_vforks++;
- cnt.v_vforkpages += p2->p_vmspace->vm_dsize +
- p2->p_vmspace->vm_ssize;
+ atomic_add_int(&cnt.v_vforks, 1);
+ atomic_add_int(&cnt.v_vforkpages, p2->p_vmspace->vm_dsize +
+ p2->p_vmspace->vm_ssize);
} else if (p1 == &proc0) {
- cnt.v_kthreads++;
- cnt.v_kthreadpages += p2->p_vmspace->vm_dsize +
- p2->p_vmspace->vm_ssize;
+ atomic_add_int(&cnt.v_kthreads, 1);
+ atomic_add_int(&cnt.v_kthreadpages, p2->p_vmspace->vm_dsize +
+ p2->p_vmspace->vm_ssize);
} else {
- cnt.v_rforks++;
- cnt.v_rforkpages += p2->p_vmspace->vm_dsize +
- p2->p_vmspace->vm_ssize;
+ atomic_add_int(&cnt.v_rforks, 1);
+ atomic_add_int(&cnt.v_rforkpages, p2->p_vmspace->vm_dsize +
+ p2->p_vmspace->vm_ssize);
}
- mtx_unlock(&Giant);
/*
* Both processes are set up, now check if any loadable modules want
OpenPOWER on IntegriCloud