Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 8 Mar 2010 04:56:40 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r204854 - user/kmacy/head_page_lock/sys/amd64/amd64
Message-ID:  <201003080456.o284ueXK082841@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;
 		}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003080456.o284ueXK082841>