svn commit: r204854 - user/kmacy/head_page_lock/sys/amd64/amd64
Kip Macy
kmacy at FreeBSD.org
Mon Mar 8 04:56:40 UTC 2010
Author: kmacy
Date: Mon Mar 8 04:56:39 2010
New Revision: 204854
URL: http://svn.freebsd.org/changeset/base/204854
Log:
switch to pa_retrylock to avoid deadlock with a previously acquired superpage
Modified:
user/kmacy/head_page_lock/sys/amd64/amd64/pmap.c
Modified: user/kmacy/head_page_lock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/head_page_lock/sys/amd64/amd64/pmap.c Mon Mar 8 03:20:26 2010 (r204853)
+++ user/kmacy/head_page_lock/sys/amd64/amd64/pmap.c Mon Mar 8 04:56:39 2010 (r204854)
@@ -2943,23 +2943,14 @@ restart:
for (pte = pmap_pde_to_pte(pde, sva); sva != va_next; pte++,
sva += PAGE_SIZE) {
int ret;
- vm_page_t m = NULL;
if (*pte == 0)
continue;
- if (*pte & PG_MANAGED) {
- m = PHYS_TO_VM_PAGE(*pte & PG_FRAME);
- if (vm_page_trylock(m) == 0) {
- PMAP_UNLOCK(pmap);
- vm_page_lock(m);
- PMAP_LOCK(pmap);
- }
- if (*pte != *pmap_pde_to_pte(pde, sva)) {
- vm_page_unlock(m);
- goto restart;
- }
- }
+ if ((*pte & PG_MANAGED) &&
+ pa_tryrelock(pmap, *pte & PG_FRAME, &pa))
+ goto restart;
+
/*
* The TLB entry for a PG_G mapping is invalidated
* by pmap_remove_pte().
@@ -2968,8 +2959,10 @@ restart:
anyvalid = 1;
ret = pmap_remove_pte(pmap, pte, sva, ptpaddr, &free);
- if (m != NULL)
- vm_page_unlock(m);
+ if (pa) {
+ PA_UNLOCK(pa);
+ pa = 0;
+ }
if (ret)
break;
}
More information about the svn-src-user
mailing list