diff options
author | kib <kib@FreeBSD.org> | 2014-05-23 09:29:04 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2014-05-23 09:29:04 +0000 |
commit | 476a11c228e79a119aff97294782b703f76bcf2e (patch) | |
tree | 7fd536847a84c148b0530ee1606494b190ffc36b /sys/vm | |
parent | 2975fdd0c2fa901cd9b77b65ffcb9c17c65df223 (diff) | |
download | FreeBSD-src-476a11c228e79a119aff97294782b703f76bcf2e.zip FreeBSD-src-476a11c228e79a119aff97294782b703f76bcf2e.tar.gz |
MFC r266464:
In execve(2), postpone the free of old vmspace until the threads are resumed
and exited.
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_map.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index cd070df..3c0aabc 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -3751,6 +3751,8 @@ vmspace_exec(struct proc *p, vm_offset_t minuser, vm_offset_t maxuser) struct vmspace *oldvmspace = p->p_vmspace; struct vmspace *newvmspace; + KASSERT((curthread->td_pflags & TDP_EXECVMSPC) == 0, + ("vmspace_exec recursed")); newvmspace = vmspace_alloc(minuser, maxuser, NULL); if (newvmspace == NULL) return (ENOMEM); @@ -3767,7 +3769,7 @@ vmspace_exec(struct proc *p, vm_offset_t minuser, vm_offset_t maxuser) PROC_VMSPACE_UNLOCK(p); if (p == curthread->td_proc) pmap_activate(curthread); - vmspace_free(oldvmspace); + curthread->td_pflags |= TDP_EXECVMSPC; return (0); } |