svn commit: r206943 - user/kmacy/head_page_lock_2/sys/amd64/amd64
Kip Macy
kmacy at FreeBSD.org
Tue Apr 20 22:24:36 UTC 2010
Author: kmacy
Date: Tue Apr 20 22:24:35 2010
New Revision: 206943
URL: http://svn.freebsd.org/changeset/base/206943
Log:
acquire page lock in pmap_remove_pde if we need to change the page's flags
Modified:
user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c
Modified: user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c Tue Apr 20 22:20:31 2010 (r206942)
+++ user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c Tue Apr 20 22:24:35 2010 (r206943)
@@ -2689,6 +2689,7 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t
pd_entry_t oldpde;
vm_offset_t eva, va;
vm_page_t m, mpte;
+ vm_paddr_t paddr, pa = 0;
PMAP_LOCK_ASSERT(pmap, MA_OWNED);
KASSERT((sva & PDRMASK) == 0,
@@ -2708,9 +2709,13 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t
pvh = pa_to_pvh(oldpde & PG_PS_FRAME);
pmap_pvh_free(pvh, pmap, sva);
eva = sva + NBPDR;
- panic("XXX - not properly locked");
- for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
- va < eva; va += PAGE_SIZE, m++) {
+ paddr = oldpde & PG_PS_FRAME;
+ for (va = sva, m = PHYS_TO_VM_PAGE(paddr);
+ va < eva; va += PAGE_SIZE, paddr += PAGE_SIZE, m++) {
+ if ((oldpde & PG_A) ||
+ (TAILQ_EMPTY(&m->md.pv_list) &&
+ TAILQ_EMPTY(&pvh->pv_list)))
+ pa_tryrelock(pmap, paddr, &pa);
if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
vm_page_dirty(m);
@@ -2720,6 +2725,8 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t
TAILQ_EMPTY(&pvh->pv_list))
vm_page_flag_clear(m, PG_WRITEABLE);
}
+ if (pa)
+ PA_UNLOCK(pa);
}
if (pmap == kernel_pmap) {
if (!pmap_demote_pde(pmap, pdq, sva, pv_list))
More information about the svn-src-user
mailing list