From owner-svn-src-projects@FreeBSD.ORG Tue Mar 16 16:55:12 2010 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6B75B106566C; Tue, 16 Mar 2010 16:55:12 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5AC418FC0C; Tue, 16 Mar 2010 16:55:12 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o2GGtCBO040637; Tue, 16 Mar 2010 16:55:12 GMT (envelope-from nwhitehorn@svn.freebsd.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o2GGtCC4040635; Tue, 16 Mar 2010 16:55:12 GMT (envelope-from nwhitehorn@svn.freebsd.org) Message-Id: <201003161655.o2GGtCC4040635@svn.freebsd.org> From: Nathan Whitehorn Date: Tue, 16 Mar 2010 16:55:12 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r205220 - projects/ppc64/sys/powerpc/aim X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 16 Mar 2010 16:55:12 -0000 Author: nwhitehorn Date: Tue Mar 16 16:55:12 2010 New Revision: 205220 URL: http://svn.freebsd.org/changeset/base/205220 Log: Revise the locking. The per-page PVO lists are protected by the VM page queue lock, so protecting them with the table lock is unnecessary. Replace the table locking paranoia with mtx_assert() paranoia. This eliminates the last LOR is the 64-bit MMU code. Modified: projects/ppc64/sys/powerpc/aim/mmu_oea64.c Modified: projects/ppc64/sys/powerpc/aim/mmu_oea64.c ============================================================================== --- projects/ppc64/sys/powerpc/aim/mmu_oea64.c Tue Mar 16 16:52:15 2010 (r205219) +++ projects/ppc64/sys/powerpc/aim/mmu_oea64.c Tue Mar 16 16:55:12 2010 (r205220) @@ -1443,6 +1443,8 @@ moea64_enter_locked(pmap_t pmap, vm_offs zone = moea64_upvo_zone; pvo_flags = 0; } else { + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + pvo_head = vm_page_to_pvoh(m); pg = m; zone = moea64_mpvo_zone; @@ -1729,10 +1731,10 @@ moea64_remove_write(mmu_t mmu, vm_page_t return; lo = moea64_attr_fetch(m); SYNC(); - LOCK_TABLE(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { pmap = pvo->pvo_pmap; PMAP_LOCK(pmap); + LOCK_TABLE(); if ((pvo->pvo_pte.lpte.pte_lo & LPTE_PP) != LPTE_BR) { pt = moea64_pvo_to_pte(pvo, -1); pvo->pvo_pte.lpte.pte_lo &= ~LPTE_PP; @@ -1745,9 +1747,9 @@ moea64_remove_write(mmu_t mmu, vm_page_t pvo->pvo_pmap, PVO_VADDR(pvo)); } } + UNLOCK_TABLE(); PMAP_UNLOCK(pmap); } - UNLOCK_TABLE(); if ((lo & LPTE_CHG) != 0) { moea64_attr_clear(m, LPTE_CHG); vm_page_dirty(m); @@ -1891,17 +1893,15 @@ moea64_page_exists_quick(mmu_t mmu, pmap if (!moea64_initialized || (m->flags & PG_FICTITIOUS)) return FALSE; + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + loops = 0; - LOCK_TABLE(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { - if (pvo->pvo_pmap == pmap) { - UNLOCK_TABLE(); + if (pvo->pvo_pmap == pmap) return (TRUE); - } if (++loops >= 16) break; } - UNLOCK_TABLE(); return (FALSE); } @@ -1920,11 +1920,9 @@ moea64_page_wired_mappings(mmu_t mmu, vm if (!moea64_initialized || (m->flags & PG_FICTITIOUS) != 0) return (count); mtx_assert(&vm_page_queue_mtx, MA_OWNED); - LOCK_TABLE(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) if ((pvo->pvo_vaddr & PVO_WIRED) != 0) count++; - UNLOCK_TABLE(); return (count); } @@ -2185,7 +2183,6 @@ moea64_remove_all(mmu_t mmu, vm_page_t m mtx_assert(&vm_page_queue_mtx, MA_OWNED); pvo_head = vm_page_to_pvoh(m); - LOCK_TABLE(); for (pvo = LIST_FIRST(pvo_head); pvo != NULL; pvo = next_pvo) { next_pvo = LIST_NEXT(pvo, pvo_vlink); @@ -2195,7 +2192,6 @@ moea64_remove_all(mmu_t mmu, vm_page_t m moea64_pvo_remove(pvo, -1); PMAP_UNLOCK(pmap); } - UNLOCK_TABLE(); if ((m->flags & PG_WRITEABLE) && moea64_is_modified(mmu, m)) { moea64_attr_clear(m, LPTE_CHG); vm_page_dirty(m); @@ -2643,7 +2639,8 @@ moea64_query_bit(vm_page_t m, u_int64_t if (moea64_attr_fetch(m) & ptebit) return (TRUE); - LOCK_TABLE(); + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { MOEA_PVO_CHECK(pvo); /* sanity check */ @@ -2653,7 +2650,6 @@ moea64_query_bit(vm_page_t m, u_int64_t */ if (pvo->pvo_pte.lpte.pte_lo & ptebit) { moea64_attr_save(m, ptebit); - UNLOCK_TABLE(); MOEA_PVO_CHECK(pvo); /* sanity check */ return (TRUE); } @@ -2673,6 +2669,7 @@ moea64_query_bit(vm_page_t m, u_int64_t * REF/CHG bits from the valid PTE. If the appropriate * ptebit is set, cache it and return success. */ + LOCK_TABLE(); pt = moea64_pvo_to_pte(pvo, -1); if (pt != NULL) { moea64_pte_synch(pt, &pvo->pvo_pte.lpte); @@ -2684,8 +2681,8 @@ moea64_query_bit(vm_page_t m, u_int64_t return (TRUE); } } + UNLOCK_TABLE(); } - UNLOCK_TABLE(); return (FALSE); } @@ -2698,6 +2695,8 @@ moea64_clear_bit(vm_page_t m, u_int64_t struct lpte *pt; uint64_t rv; + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + /* * Clear the cached value. */ @@ -2718,10 +2717,10 @@ moea64_clear_bit(vm_page_t m, u_int64_t * valid pte clear the ptebit from the valid pte. */ count = 0; - LOCK_TABLE(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { MOEA_PVO_CHECK(pvo); /* sanity check */ + LOCK_TABLE(); pt = moea64_pvo_to_pte(pvo, -1); if (pt != NULL) { moea64_pte_synch(pt, &pvo->pvo_pte.lpte); @@ -2733,8 +2732,8 @@ moea64_clear_bit(vm_page_t m, u_int64_t rv |= pvo->pvo_pte.lpte.pte_lo; pvo->pvo_pte.lpte.pte_lo &= ~ptebit; MOEA_PVO_CHECK(pvo); /* sanity check */ + UNLOCK_TABLE(); } - UNLOCK_TABLE(); if (origbit != NULL) { *origbit = rv;