summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>1999-07-21 18:02:27 +0000
committeralc <alc@FreeBSD.org>1999-07-21 18:02:27 +0000
commit279eafd09f2514d288cf449bcb7edca19ea31d50 (patch)
tree2b71e9fdd68c718169f98753b2d8da9e09b69bf8 /sys/vm
parentcd7ecc6fc022e270d89e62000744e4a6d41d0465 (diff)
downloadFreeBSD-src-279eafd09f2514d288cf449bcb7edca19ea31d50.zip
FreeBSD-src-279eafd09f2514d288cf449bcb7edca19ea31d50.tar.gz
Fix the following problem:
When creating new processes (or performing exec), the new page directory is initialized too early. The kernel might grow before p_vmspace is initialized for the new process. Since pmap_growkernel doesn't yet know about the new page directory, it isn't updated, and subsequent use causes a failure. The fix is (1) to clear p_vmspace early, to stop pmap_growkernel from stomping on memory, and (2) to defer part of the initialization of new page directories until p_vmspace is initialized. PR: kern/12378 Submitted by: tegge Reviewed by: dfr
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/pmap.h3
-rw-r--r--sys/vm/vm_glue.c4
-rw-r--r--sys/vm/vm_map.c4
3 files changed, 8 insertions, 3 deletions
diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h
index 0e7d1ae..32d1846 100644
--- a/sys/vm/pmap.h
+++ b/sys/vm/pmap.h
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: pmap.h,v 1.29 1999/04/05 19:38:29 julian Exp $
+ * $Id: pmap.h,v 1.30 1999/04/23 20:29:57 dt Exp $
*/
/*
@@ -121,6 +121,7 @@ void pmap_pageable __P((pmap_t, vm_offset_t, vm_offset_t,
vm_offset_t pmap_phys_address __P((int));
void pmap_pinit __P((pmap_t));
void pmap_pinit0 __P((pmap_t));
+void pmap_pinit2 __P((pmap_t));
void pmap_protect __P((pmap_t, vm_offset_t, vm_offset_t,
vm_prot_t));
void pmap_qenter __P((vm_offset_t, vm_page_t *, int));
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c
index 5221e18..2577686 100644
--- a/sys/vm/vm_glue.c
+++ b/sys/vm/vm_glue.c
@@ -59,7 +59,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_glue.c,v 1.85 1999/04/06 03:11:34 peter Exp $
+ * $Id: vm_glue.c,v 1.86 1999/06/19 18:42:49 alc Exp $
*/
#include "opt_rlimit.h"
@@ -226,6 +226,8 @@ vm_fork(p1, p2, flags)
if ((flags & RFMEM) == 0) {
p2->p_vmspace = vmspace_fork(p1->p_vmspace);
+ pmap_pinit2(vmspace_pmap(p2->p_vmspace));
+
if (p1->p_vmspace->vm_shm)
shmfork(p1, p2);
}
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index cbe2a2d..bfebc9c 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -61,7 +61,7 @@
* any improvements or extensions that they make and grant Carnegie the
* rights to redistribute these changes.
*
- * $Id: vm_map.c,v 1.171 1999/07/01 19:53:41 peter Exp $
+ * $Id: vm_map.c,v 1.172 1999/07/11 18:30:31 alc Exp $
*/
/*
@@ -2351,6 +2351,7 @@ vmspace_exec(struct proc *p) {
*/
vmspace_free(oldvmspace);
p->p_vmspace = newvmspace;
+ pmap_pinit2(vmspace_pmap(newvmspace));
if (p == curproc)
pmap_activate(p);
}
@@ -2370,6 +2371,7 @@ vmspace_unshare(struct proc *p) {
newvmspace = vmspace_fork(oldvmspace);
vmspace_free(oldvmspace);
p->p_vmspace = newvmspace;
+ pmap_pinit2(vmspace_pmap(newvmspace));
if (p == curproc)
pmap_activate(p);
}
OpenPOWER on IntegriCloud