summaryrefslogtreecommitdiffstats
path: root/sys/amd64
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2012-06-26 16:45:18 +0000
committeralc <alc@FreeBSD.org>2012-06-26 16:45:18 +0000
commite1ae76f31c3af04e252662a12a6240c09deaea15 (patch)
treebcbf37ad3f7631545dd807ce181a82db90173037 /sys/amd64
parent877f7e22dc80676c9ece47bf58c4a6bdc79be4c7 (diff)
downloadFreeBSD-src-e1ae76f31c3af04e252662a12a6240c09deaea15.zip
FreeBSD-src-e1ae76f31c3af04e252662a12a6240c09deaea15.tar.gz
Introduce RELEASE_PV_LIST_LOCK().
Diffstat (limited to 'sys/amd64')
-rw-r--r--sys/amd64/amd64/pmap.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 36c5bc4..2da212c 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -189,6 +189,15 @@ __FBSDID("$FreeBSD$");
#define CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m) \
CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, VM_PAGE_TO_PHYS(m))
+#define RELEASE_PV_LIST_LOCK(lockp) do { \
+ struct rwlock **_lockp = (lockp); \
+ \
+ if (*_lockp != NULL) { \
+ rw_wunlock(*_lockp); \
+ *_lockp = NULL; \
+ } \
+} while (0)
+
#define VM_PAGE_TO_PV_LIST_LOCK(m) \
PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m))
@@ -1714,10 +1723,7 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t ptepindex, struct rwlock **lockp)
if ((m = vm_page_alloc(NULL, ptepindex, VM_ALLOC_NOOBJ |
VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
if (lockp != NULL) {
- if (*lockp != NULL) {
- rw_wunlock(*lockp);
- *lockp = NULL;
- }
+ RELEASE_PV_LIST_LOCK(lockp);
PMAP_UNLOCK(pmap);
rw_runlock(&pvh_global_lock);
VM_WAIT;
@@ -2133,10 +2139,7 @@ reclaim_pv_chunk(pmap_t locked_pmap, struct rwlock **lockp)
pmap = pc->pc_pmap;
/* Avoid deadlock and lock recursion. */
if (pmap > locked_pmap) {
- if (*lockp != NULL) {
- rw_wunlock(*lockp);
- *lockp = NULL;
- }
+ RELEASE_PV_LIST_LOCK(lockp);
PMAP_LOCK(pmap);
} else if (pmap != locked_pmap &&
!PMAP_TRYLOCK(pmap)) {
OpenPOWER on IntegriCloud