diff options
author | alc <alc@FreeBSD.org> | 2004-09-03 05:11:32 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2004-09-03 05:11:32 +0000 |
commit | 82e55fdf7687982550eb5f4127031095fdf8d75a (patch) | |
tree | 354bad52910b678ed5b43b366707bc35dc3371aa /sys/kern/kern_fork.c | |
parent | 5aa2eb98b7e705cdbac165895e81d5e4bd6b5453 (diff) | |
download | FreeBSD-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.c | 28 |
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 |