From owner-svn-src-all@FreeBSD.ORG Fri Jun 22 05:01:37 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1B9B41065672; Fri, 22 Jun 2012 05:01:37 +0000 (UTC) (envelope-from alc@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id E187A8FC0C; Fri, 22 Jun 2012 05:01:36 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q5M51aJl056506; Fri, 22 Jun 2012 05:01:36 GMT (envelope-from alc@svn.freebsd.org) Received: (from alc@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q5M51aPw056504; Fri, 22 Jun 2012 05:01:36 GMT (envelope-from alc@svn.freebsd.org) Message-Id: <201206220501.q5M51aPw056504@svn.freebsd.org> From: Alan Cox Date: Fri, 22 Jun 2012 05:01:36 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r237414 - head/sys/amd64/amd64 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 22 Jun 2012 05:01:37 -0000 Author: alc Date: Fri Jun 22 05:01:36 2012 New Revision: 237414 URL: http://svn.freebsd.org/changeset/base/237414 Log: Introduce CHANGE_PV_LIST_LOCK_TO_{PHYS,VM_PAGE}() to avoid duplication of code. Modified: head/sys/amd64/amd64/pmap.c Modified: head/sys/amd64/amd64/pmap.c ============================================================================== --- head/sys/amd64/amd64/pmap.c Fri Jun 22 00:41:37 2012 (r237413) +++ head/sys/amd64/amd64/pmap.c Fri Jun 22 05:01:36 2012 (r237414) @@ -173,6 +173,22 @@ __FBSDID("$FreeBSD$"); #define PHYS_TO_PV_LIST_LOCK(pa) \ (&pv_list_locks[pa_index(pa) % NPV_LIST_LOCKS]) +#define CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa) do { \ + struct rwlock **_lockp = (lockp); \ + struct rwlock *_new_lock; \ + \ + _new_lock = PHYS_TO_PV_LIST_LOCK(pa); \ + if (_new_lock != *_lockp) { \ + if (*_lockp != NULL) \ + rw_wunlock(*_lockp); \ + *_lockp = _new_lock; \ + rw_wlock(*_lockp); \ + } \ +} while (0) + +#define CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m) \ + CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, VM_PAGE_TO_PHYS(m)) + #define VM_PAGE_TO_PV_LIST_LOCK(m) \ PHYS_TO_PV_LIST_LOCK(VM_PAGE_TO_PHYS(m)) @@ -2436,20 +2452,13 @@ static boolean_t pmap_try_insert_pv_entry(pmap_t pmap, vm_offset_t va, vm_page_t m, struct rwlock **lockp) { - struct rwlock *new_lock; pv_entry_t pv; rw_assert(&pvh_global_lock, RA_LOCKED); PMAP_LOCK_ASSERT(pmap, MA_OWNED); if ((pv = get_pv_entry(pmap, TRUE)) != NULL) { pv->pv_va = va; - new_lock = VM_PAGE_TO_PV_LIST_LOCK(m); - if (new_lock != *lockp) { - if (*lockp != NULL) - rw_wunlock(*lockp); - *lockp = new_lock; - rw_wlock(*lockp); - } + CHANGE_PV_LIST_LOCK_TO_VM_PAGE(lockp, m); TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); return (TRUE); } else @@ -2464,19 +2473,12 @@ pmap_pv_insert_pde(pmap_t pmap, vm_offse struct rwlock **lockp) { struct md_page *pvh; - struct rwlock *new_lock; pv_entry_t pv; rw_assert(&pvh_global_lock, RA_LOCKED); if ((pv = get_pv_entry(pmap, TRUE)) != NULL) { pv->pv_va = va; - new_lock = PHYS_TO_PV_LIST_LOCK(pa); - if (new_lock != *lockp) { - if (*lockp != NULL) - rw_wunlock(*lockp); - *lockp = new_lock; - rw_wlock(*lockp); - } + CHANGE_PV_LIST_LOCK_TO_PHYS(lockp, pa); pvh = pa_to_pvh(pa); TAILQ_INSERT_TAIL(&pvh->pv_list, pv, pv_list); return (TRUE); @@ -4159,7 +4161,7 @@ pmap_remove_pages(pmap_t pmap) pv_entry_t pv; struct md_page *pvh; struct pv_chunk *pc, *npc; - struct rwlock *lock, *new_lock; + struct rwlock *lock; int64_t bit; uint64_t inuse, bitmask; int allfree, field, freed, idx; @@ -4229,13 +4231,7 @@ pmap_remove_pages(pmap_t pmap) vm_page_dirty(m); } - new_lock = VM_PAGE_TO_PV_LIST_LOCK(m); - if (new_lock != lock) { - if (lock != NULL) - rw_wunlock(lock); - lock = new_lock; - rw_wlock(lock); - } + CHANGE_PV_LIST_LOCK_TO_VM_PAGE(&lock, m); /* Mark free */ pc->pc_map[field] |= bitmask;