svn commit: r206860 - user/kmacy/head_page_lock_2/sys/amd64/amd64
Kip Macy
kmacy at FreeBSD.org
Mon Apr 19 20:08:19 UTC 2010
Author: kmacy
Date: Mon Apr 19 20:08:18 2010
New Revision: 206860
URL: http://svn.freebsd.org/changeset/base/206860
Log:
ensure that the page lock is held in pmap_remove_pde when setting/clearing 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 Mon Apr 19 20:07:35 2010 (r206859)
+++ user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c Mon Apr 19 20:08:18 2010 (r206860)
@@ -2762,17 +2762,21 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t
eva = sva + NBPDR;
for (va = sva, m = PHYS_TO_VM_PAGE(oldpde & PG_PS_FRAME);
va < eva; va += PAGE_SIZE, m++) {
- /*
- * XXX do we need to individually lock each page?
- *
- */
- if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
- vm_page_dirty(m);
- if (oldpde & PG_A)
- vm_page_flag_set(m, PG_REFERENCED);
- if (TAILQ_EMPTY(&m->md.pv_list) &&
- TAILQ_EMPTY(&pvh->pv_list))
- vm_page_flag_clear(m, PG_WRITEABLE);
+
+ if ((oldpde & (PG_M | PG_RW | PG_A)) ||
+ (TAILQ_EMPTY(&m->md.pv_list) &&
+ TAILQ_EMPTY(&pvh->pv_list))) {
+ vm_page_lock(m);
+
+ if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
+ vm_page_dirty(m);
+ if (oldpde & PG_A)
+ vm_page_flag_set(m, PG_REFERENCED);
+ if (TAILQ_EMPTY(&m->md.pv_list) &&
+ TAILQ_EMPTY(&pvh->pv_list))
+ vm_page_flag_clear(m, PG_WRITEABLE);
+ vm_page_unlock(m);
+ }
}
}
if (pmap == kernel_pmap) {
More information about the svn-src-user
mailing list