Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Apr 2010 22:45:13 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r206946 - user/kmacy/head_page_lock_2/sys/amd64/amd64
Message-ID:  <201004202245.o3KMjDmP067273@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kmacy
Date: Tue Apr 20 22:45:12 2010
New Revision: 206946
URL: http://svn.freebsd.org/changeset/base/206946

Log:
  only bump generation count if we acquire the pmap lock in the middle of a retry
  otherwise we know that the pmap state has not changed

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:43:53 2010	(r206945)
+++ user/kmacy/head_page_lock_2/sys/amd64/amd64/pmap.c	Tue Apr 20 22:45:12 2010	(r206946)
@@ -562,11 +562,12 @@ pa_tryrelock(pmap_t pmap, vm_paddr_t pa,
 	}
 	if (PA_TRYLOCK(pa))
 		return (0);
+	pmap->pm_flags |= PMAP_IN_RETRY;
 	PMAP_UNLOCK(pmap);
 	atomic_add_int((volatile int *)&pmap_tryrelock_restart, 1);
 	PA_LOCK(pa);
-	PMAP_LOCK(pmap);
-	pmap->pm_gen_count++;
+	mtx_lock(&(pmap)->pm_mtx);
+	pmap->pm_flags &= ~PMAP_IN_RETRY;
 
 	return (EAGAIN);
 }
@@ -2677,7 +2678,6 @@ pmap_demote_pde(pmap_t pmap, pd_entry_t 
 	return (TRUE);
 }
 	
-
 /*
  * pmap_remove_pde: do the things to unmap a superpage in a process
  */
@@ -3453,12 +3453,14 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	ls_init(&ls);
 	ls_push(&ls, PA_LOCKPTR(lockedpa));
 	ls_push(&ls, PMAP_LOCKPTR(pmap));
+	PMAP_UPDATE_GEN_COUNT(pmap);
 	if ((m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
 		while ((pv = get_pv_entry(pmap)) == NULL) {
 			ls_popa(&ls);
 			VM_WAIT;
 			ls_push(&ls, PA_LOCKPTR(lockedpa));
 			ls_push(&ls, PMAP_LOCKPTR(pmap));
+			PMAP_UPDATE_GEN_COUNT(pmap);
 		}
 	}
 
@@ -3484,6 +3486,7 @@ restart:
 		ls_popa(&ls);
 		ls_push(&ls, PA_LOCKPTR(lockedpa));
 		ls_push(&ls, PMAP_LOCKPTR(pmap));
+		PMAP_UPDATE_GEN_COUNT(pmap);
 		opalocked = FALSE;
 		opa = 0;
 		goto restart;
@@ -3503,6 +3506,7 @@ restart:
 				ls_push(&ls, PA_LOCKPTR(lockedpa));
 			}
 			ls_push(&ls, PMAP_LOCKPTR(pmap));
+			PMAP_UPDATE_GEN_COUNT(pmap);
 			goto restart;
 		}
 	}



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