diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index e9e67ebe58b..b8c6a9dcbd7 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 b767c3f4b17..69fdae9926c 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); } }