svn commit: r206946 - user/kmacy/head_page_lock_2/sys/amd64/amd64
Kip Macy
kmacy at FreeBSD.org
Tue Apr 20 22:45:13 UTC 2010
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;
}
}
More information about the svn-src-user
mailing list