diff options
author | Alan Cox <alc@FreeBSD.org> | 2004-07-31 06:42:05 +0000 |
---|---|---|
committer | Alan Cox <alc@FreeBSD.org> | 2004-07-31 06:42:05 +0000 |
commit | c6bf9f04555dde1e7bf0c3413ebf5cbb67fe88fc (patch) | |
tree | 904f6cc912edb97ed2cf9b26ef416384b6a389c7 | |
parent | 70cd856a0c676a8eb2acd677a9627fd1abb92466 (diff) | |
download | src-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.c | 7 | ||||
-rw-r--r-- | sys/i386/i386/pmap.c | 7 |
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); } } |