summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2014-05-23 09:29:04 +0000
committerkib <kib@FreeBSD.org>2014-05-23 09:29:04 +0000
commit476a11c228e79a119aff97294782b703f76bcf2e (patch)
tree7fd536847a84c148b0530ee1606494b190ffc36b /sys/vm
parent2975fdd0c2fa901cd9b77b65ffcb9c17c65df223 (diff)
downloadFreeBSD-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.c4
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);
}
OpenPOWER on IntegriCloud