Make the previous change `atomic'.

This commit is contained in:
thorpej 1998-03-19 06:37:26 +00:00
parent daade671ae
commit dbc7bbee68
2 changed files with 19 additions and 2 deletions

@ -1,4 +1,4 @@
/* $NetBSD: uvm_map.c,v 1.12 1998/03/19 04:19:21 thorpej Exp $ */
/* $NetBSD: uvm_map.c,v 1.13 1998/03/19 06:37:26 thorpej Exp $ */
/*
* XXXCDC: "ROUGH DRAFT" QUALITY UVM PRE-RELEASE FILE!
@ -2384,6 +2384,7 @@ uvmspace_unshare(p)
struct proc *p;
{
struct vmspace *nvm, *ovm = p->p_vmspace;
int s;
if (ovm->vm_refcnt == 1)
/* nothing to do: vmspace isn't shared in the first place */
@ -2392,9 +2393,12 @@ uvmspace_unshare(p)
/* make a new vmspace, still holding old one */
nvm = uvmspace_fork(ovm);
s = splhigh(); /* make this `atomic' */
pmap_deactivate(p); /* unbind old vmspace */
p->p_vmspace = nvm;
pmap_activate(p); /* switch to new vmspace */
splx(s); /* end of critical section */
uvmspace_free(ovm); /* drop reference to old vmspace */
}
@ -2410,6 +2414,7 @@ uvmspace_exec(p)
{
struct vmspace *nvm, *ovm = p->p_vmspace;
vm_map_t map = &ovm->vm_map;
int s;
#ifdef sparc
/* XXX cgd 960926: the sparc #ifdef should be a MD hook */
@ -2473,9 +2478,12 @@ uvmspace_exec(p)
* install new vmspace and drop our ref to the old one.
*/
s = splhigh();
pmap_deactivate(p);
p->p_vmspace = nvm;
pmap_activate(p);
splx(s);
uvmspace_free(ovm);
}
}

@ -1,4 +1,4 @@
/* $NetBSD: vm_map.c,v 1.35 1998/03/19 04:19:21 thorpej Exp $ */
/* $NetBSD: vm_map.c,v 1.36 1998/03/19 06:37:26 thorpej Exp $ */
/*
* Copyright (c) 1991, 1993
@ -235,14 +235,19 @@ vmspace_unshare(p)
struct proc *p;
{
struct vmspace *nvm, *ovm = p->p_vmspace;
int s;
if (ovm->vm_refcnt == 1)
return;
nvm = vmspace_fork(ovm);
s = splhigh();
pmap_deactivate(p);
p->p_vmspace = nvm;
pmap_activate(p);
splx(s);
vmspace_free(ovm);
}
@ -255,6 +260,7 @@ vmspace_exec(p)
{
struct vmspace *nvm, *ovm = p->p_vmspace;
vm_map_t map = &ovm->vm_map;
int s;
#ifdef sparc
/* XXX cgd 960926: the sparc #ifdef should be a MD hook */
@ -292,9 +298,12 @@ vmspace_exec(p)
VM_INHERIT_NONE);
}
#endif
s = splhigh();
pmap_deactivate(p);
p->p_vmspace = nvm;
pmap_activate(p);
splx(s);
vmspace_free(ovm);
}
}