aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2004-07-31 06:42:05 +0000
committerAlan Cox <alc@FreeBSD.org>2004-07-31 06:42:05 +0000
commitc6bf9f04555dde1e7bf0c3413ebf5cbb67fe88fc (patch)
tree904f6cc912edb97ed2cf9b26ef416384b6a389c7
parent70cd856a0c676a8eb2acd677a9627fd1abb92466 (diff)
downloadsrc-c6bf9f04555dde1e7bf0c3413ebf5cbb67fe88fc.tar.gz
src-c6bf9f04555dde1e7bf0c3413ebf5cbb67fe88fc.zip
Add pmap locking to pmap_object_init_pt().
Notes
Notes: svn path=/head/; revision=132919
-rw-r--r--sys/amd64/amd64/pmap.c7
-rw-r--r--sys/i386/i386/pmap.c7
2 files changed, 12 insertions, 2 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index e9e67ebe58b7..b8c6a9dcbd76 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -2158,9 +2158,11 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
int npdes;
pd_entry_t ptepa, *pde;
+ PMAP_LOCK(pmap);
pde = pmap_pde(pmap, addr);
if (pde != 0 && (*pde & PG_V) != 0)
- return;
+ goto out;
+ PMAP_UNLOCK(pmap);
retry:
p = vm_page_lookup(object, pindex);
if (p != NULL) {
@@ -2192,6 +2194,7 @@ retry:
p->valid = VM_PAGE_BITS_ALL;
+ PMAP_LOCK(pmap);
pmap->pm_stats.resident_count += size >> PAGE_SHIFT;
npdes = size >> PDRSHIFT;
for(i = 0; i < npdes; i++) {
@@ -2200,6 +2203,8 @@ retry:
pde++;
}
pmap_invalidate_all(pmap);
+out:
+ PMAP_UNLOCK(pmap);
}
}
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index b767c3f4b17b..69fdae9926c9 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -2210,8 +2210,10 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
int npdes;
pd_entry_t ptepa;
+ PMAP_LOCK(pmap);
if (pmap->pm_pdir[ptepindex = (addr >> PDRSHIFT)])
- return;
+ goto out;
+ PMAP_UNLOCK(pmap);
retry:
p = vm_page_lookup(object, pindex);
if (p != NULL) {
@@ -2243,6 +2245,7 @@ retry:
p->valid = VM_PAGE_BITS_ALL;
+ PMAP_LOCK(pmap);
pmap->pm_stats.resident_count += size >> PAGE_SHIFT;
npdes = size >> PDRSHIFT;
for(i = 0; i < npdes; i++) {
@@ -2252,6 +2255,8 @@ retry:
ptepindex += 1;
}
pmap_invalidate_all(pmap);
+out:
+ PMAP_UNLOCK(pmap);
}
}