From owner-freebsd-ppc@FreeBSD.ORG Mon Aug 6 11:07:18 2012 Return-Path: Delivered-To: freebsd-ppc@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 648DC1065674 for ; Mon, 6 Aug 2012 11:07:18 +0000 (UTC) (envelope-from owner-bugmaster@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 4F5768FC26 for ; Mon, 6 Aug 2012 11:07:18 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.5/8.14.5) with ESMTP id q76B7IuA021875 for ; Mon, 6 Aug 2012 11:07:18 GMT (envelope-from owner-bugmaster@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.5/8.14.5/Submit) id q76B7H66021873 for freebsd-ppc@FreeBSD.org; Mon, 6 Aug 2012 11:07:17 GMT (envelope-from owner-bugmaster@FreeBSD.org) Date: Mon, 6 Aug 2012 11:07:17 GMT Message-Id: <201208061107.q76B7H66021873@freefall.freebsd.org> X-Authentication-Warning: freefall.freebsd.org: gnats set sender to owner-bugmaster@FreeBSD.org using -f From: FreeBSD bugmaster To: freebsd-ppc@FreeBSD.org Cc: Subject: Current problem reports assigned to freebsd-ppc@FreeBSD.org X-BeenThere: freebsd-ppc@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting FreeBSD to the PowerPC List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Aug 2012 11:07:18 -0000 Note: to view an individual PR, use: http://www.freebsd.org/cgi/query-pr.cgi?pr=(number). The following is a listing of current problems submitted by FreeBSD users. These represent problem reports covering all versions including experimental development code and obsolete releases. S Tracker Resp. Description -------------------------------------------------------------------------------- o power/170340 ppc Enabling geom-mirror on 9.1-powerpc64 prevents the sys o power/169021 ppc FreeBSD-9.0-powerpc-all.iso crashes host when mounted o power/167764 ppc Burning iso for ppc o power/164225 ppc Boot fails on IBM 7028-6E1 (heap memory claim failed) o power/161947 ppc multimedia/libdvdnav builds broken binaries on big end o power/161045 ppc X doesn't detect ADB mouse up event until another even o power/149009 ppc sysinstall(8) on powerpc fails to install manpages, so o power/140241 ppc [kernel] [patch] Linker set problems on PowerPC EABI o power/135576 ppc gdb cannot debug threaded programs on ppc o power/133503 ppc [sound] Sound stutter after switching ttys o power/133382 ppc [install] Installer gets signal 11 o power/131548 ppc ofw_syscons no longer supports 32-bit framebuffer 12 problems total. From owner-freebsd-ppc@FreeBSD.ORG Mon Aug 6 19:22:25 2012 Return-Path: Delivered-To: ppc@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 28065106564A for ; Mon, 6 Aug 2012 19:22:25 +0000 (UTC) (envelope-from alc@rice.edu) Received: from mh11.mail.rice.edu (mh11.mail.rice.edu [128.42.199.30]) by mx1.freebsd.org (Postfix) with ESMTP id EC7A08FC16 for ; Mon, 6 Aug 2012 19:22:24 +0000 (UTC) Received: from mh11.mail.rice.edu (localhost.localdomain [127.0.0.1]) by mh11.mail.rice.edu (Postfix) with ESMTP id EA76E4C01AB for ; Mon, 6 Aug 2012 14:22:23 -0500 (CDT) Received: from mh11.mail.rice.edu (localhost.localdomain [127.0.0.1]) by mh11.mail.rice.edu (Postfix) with ESMTP id E8FD64C016A; Mon, 6 Aug 2012 14:22:23 -0500 (CDT) X-Virus-Scanned: by amavis-2.7.0 at mh11.mail.rice.edu, auth channel Received: from mh11.mail.rice.edu ([127.0.0.1]) by mh11.mail.rice.edu (mh11.mail.rice.edu [127.0.0.1]) (amavis, port 10026) with ESMTP id LVP6xSQ23kdW; Mon, 6 Aug 2012 14:22:23 -0500 (CDT) Received: from adsl-216-63-78-18.dsl.hstntx.swbell.net (adsl-216-63-78-18.dsl.hstntx.swbell.net [216.63.78.18]) (using TLSv1 with cipher RC4-MD5 (128/128 bits)) (No client certificate requested) (Authenticated sender: alc) by mh11.mail.rice.edu (Postfix) with ESMTPSA id 6A8414C0157; Mon, 6 Aug 2012 14:22:23 -0500 (CDT) Message-ID: <5020196E.7020809@rice.edu> Date: Mon, 06 Aug 2012 14:22:22 -0500 From: Alan Cox User-Agent: Mozilla/5.0 (X11; FreeBSD i386; rv:8.0) Gecko/20111113 Thunderbird/8.0 MIME-Version: 1.0 To: ppc@freebsd.org Content-Type: multipart/mixed; boundary="------------030103020804000102090505" Cc: Alan Cox Subject: Book E pmap patch X-BeenThere: freebsd-ppc@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting FreeBSD to the PowerPC List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 06 Aug 2012 19:22:25 -0000 This is a multi-part message in MIME format. --------------030103020804000102090505 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Could someone here please test the attached patch to the Book E pmap? The patch replaces all uses of the global page queue lock with a lock that is private to the Book E pmap. Similar changes have already been made to several other architectures. Thanks, Alan --------------030103020804000102090505 Content-Type: text/plain; name="booke_pmap.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="booke_pmap.patch" Index: powerpc/booke/pmap.c =================================================================== --- powerpc/booke/pmap.c (revision 239097) +++ powerpc/booke/pmap.c (working copy) @@ -51,7 +51,6 @@ #include __FBSDID("$FreeBSD$"); -#include #include #include #include @@ -64,6 +63,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -85,7 +85,6 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include #include #include @@ -213,6 +212,17 @@ static inline unsigned int tlb0_tableidx(vm_offset /* Page table management */ /**************************************************************************/ +/* + * Isolate the global pv list lock from data and other locks to prevent false + * sharing within the cache. + */ +static struct { + struct rwlock lock; + char padding[CACHE_LINE_SIZE - sizeof(struct rwlock)]; +} pvh_global __aligned(CACHE_LINE_SIZE); + +#define pvh_global_lock pvh_global.lock + /* Data for the pv entry allocation mechanism */ static uma_zone_t pvzone; static struct vm_object pvzone_obj; @@ -550,9 +560,9 @@ ptbl_alloc(mmu_t mmu, pmap_t pmap, unsigned int pd VM_ALLOC_NOOBJ | VM_ALLOC_WIRED)) == NULL) { PMAP_UNLOCK(pmap); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); VM_WAIT; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); } mtbl[i] = m; @@ -742,7 +752,7 @@ pv_insert(pmap_t pmap, vm_offset_t va, vm_page_t m /* add to pv_list */ PMAP_LOCK_ASSERT(pmap, MA_OWNED); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); TAILQ_INSERT_TAIL(&m->md.pv_list, pve, pv_link); @@ -759,7 +769,7 @@ pv_remove(pmap_t pmap, vm_offset_t va, vm_page_t m //debugf("pv_remove: s (su = %d pmap = 0x%08x va = 0x%08x)\n", su, (u_int32_t)pmap, va); PMAP_LOCK_ASSERT(pmap, MA_OWNED); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); + rw_assert(&pvh_global_lock, RA_WLOCKED); /* find pv entry */ TAILQ_FOREACH(pve, &m->md.pv_list, pv_link) { @@ -1242,6 +1252,11 @@ mmu_booke_bootstrap(mmu_t mmu, vm_offset_t start, /* Mark kernel_pmap active on all CPUs */ CPU_FILL(&kernel_pmap->pm_active); + /* + * Initialize the global pv list lock. + */ + rw_init(&pvh_global_lock, "pmap pv global"); + /*******************************************************/ /* Final setup */ /*******************************************************/ @@ -1525,10 +1540,10 @@ mmu_booke_enter(mmu_t mmu, pmap_t pmap, vm_offset_ vm_prot_t prot, boolean_t wired) { - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); mmu_booke_enter_locked(mmu, pmap, va, m, prot, wired); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -1714,14 +1729,14 @@ mmu_booke_enter_object(mmu_t mmu, pmap_t pmap, vm_ psize = atop(end - start); m = m_start; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); while (m != NULL && (diff = m->pindex - m_start->pindex) < psize) { mmu_booke_enter_locked(mmu, pmap, start + ptoa(diff), m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), FALSE); m = TAILQ_NEXT(m, listq); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -1730,11 +1745,11 @@ mmu_booke_enter_quick(mmu_t mmu, pmap_t pmap, vm_o vm_prot_t prot) { - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); mmu_booke_enter_locked(mmu, pmap, va, m, prot & (VM_PROT_READ | VM_PROT_EXECUTE), FALSE); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); PMAP_UNLOCK(pmap); } @@ -1771,7 +1786,7 @@ mmu_booke_remove(mmu_t mmu, pmap_t pmap, vm_offset hold_flag = PTBL_HOLD_FLAG(pmap); //debugf("mmu_booke_remove: hold_flag = %d\n", hold_flag); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); PMAP_LOCK(pmap); for (; va < endva; va += PAGE_SIZE) { pte = pte_find(mmu, pmap, va); @@ -1779,7 +1794,7 @@ mmu_booke_remove(mmu_t mmu, pmap_t pmap, vm_offset pte_remove(mmu, pmap, va, hold_flag); } PMAP_UNLOCK(pmap); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); //debugf("mmu_booke_remove: e\n"); } @@ -1793,7 +1808,7 @@ mmu_booke_remove_all(mmu_t mmu, vm_page_t m) pv_entry_t pv, pvn; uint8_t hold_flag; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); for (pv = TAILQ_FIRST(&m->md.pv_list); pv != NULL; pv = pvn) { pvn = TAILQ_NEXT(pv, pv_link); @@ -1803,7 +1818,7 @@ mmu_booke_remove_all(mmu_t mmu, vm_page_t m) PMAP_UNLOCK(pv->pv_pmap); } vm_page_aflag_clear(m, PGA_WRITEABLE); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -1961,7 +1976,7 @@ mmu_booke_remove_write(mmu_t mmu, vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { PMAP_LOCK(pv->pv_pmap); if ((pte = pte_find(mmu, pv->pv_pmap, pv->pv_va)) != NULL) { @@ -1985,7 +2000,7 @@ mmu_booke_remove_write(mmu_t mmu, vm_page_t m) PMAP_UNLOCK(pv->pv_pmap); } vm_page_aflag_clear(m, PGA_WRITEABLE); - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } static void @@ -2001,7 +2016,7 @@ mmu_booke_sync_icache(mmu_t mmu, pmap_t pm, vm_off va = trunc_page(va); sz = round_page(sz); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); pmap = PCPU_GET(curpmap); active = (pm == kernel_pmap || pm == pmap) ? 1 : 0; while (sz > 0) { @@ -2028,7 +2043,7 @@ mmu_booke_sync_icache(mmu_t mmu, pmap_t pm, vm_off va += PAGE_SIZE; sz -= PAGE_SIZE; } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -2176,7 +2191,7 @@ mmu_booke_is_modified(mmu_t mmu, vm_page_t m) if ((m->oflags & VPO_BUSY) == 0 && (m->aflags & PGA_WRITEABLE) == 0) return (rv); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { PMAP_LOCK(pv->pv_pmap); if ((pte = pte_find(mmu, pv->pv_pmap, pv->pv_va)) != NULL && @@ -2188,7 +2203,7 @@ mmu_booke_is_modified(mmu_t mmu, vm_page_t m) if (rv) break; } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -2217,7 +2232,7 @@ mmu_booke_is_referenced(mmu_t mmu, vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_is_referenced: page %p is not managed", m)); rv = FALSE; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { PMAP_LOCK(pv->pv_pmap); if ((pte = pte_find(mmu, pv->pv_pmap, pv->pv_va)) != NULL && @@ -2229,7 +2244,7 @@ mmu_booke_is_referenced(mmu_t mmu, vm_page_t m) if (rv) break; } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -2255,7 +2270,7 @@ mmu_booke_clear_modify(mmu_t mmu, vm_page_t m) */ if ((m->aflags & PGA_WRITEABLE) == 0) return; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { PMAP_LOCK(pv->pv_pmap); if ((pte = pte_find(mmu, pv->pv_pmap, pv->pv_va)) != NULL && @@ -2274,7 +2289,7 @@ mmu_booke_clear_modify(mmu_t mmu, vm_page_t m) } PMAP_UNLOCK(pv->pv_pmap); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -2297,7 +2312,7 @@ mmu_booke_ts_referenced(mmu_t mmu, vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_ts_referenced: page %p is not managed", m)); count = 0; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { PMAP_LOCK(pv->pv_pmap); if ((pte = pte_find(mmu, pv->pv_pmap, pv->pv_va)) != NULL && @@ -2320,7 +2335,7 @@ mmu_booke_ts_referenced(mmu_t mmu, vm_page_t m) } PMAP_UNLOCK(pv->pv_pmap); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (count); } @@ -2335,7 +2350,7 @@ mmu_booke_clear_reference(mmu_t mmu, vm_page_t m) KASSERT((m->oflags & VPO_UNMANAGED) == 0, ("mmu_booke_clear_reference: page %p is not managed", m)); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { PMAP_LOCK(pv->pv_pmap); if ((pte = pte_find(mmu, pv->pv_pmap, pv->pv_va)) != NULL && @@ -2353,7 +2368,7 @@ mmu_booke_clear_reference(mmu_t mmu, vm_page_t m) } PMAP_UNLOCK(pv->pv_pmap); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); } /* @@ -2398,7 +2413,7 @@ mmu_booke_page_exists_quick(mmu_t mmu, pmap_t pmap ("mmu_booke_page_exists_quick: page %p is not managed", m)); loops = 0; rv = FALSE; - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { if (pv->pv_pmap == pmap) { rv = TRUE; @@ -2407,7 +2422,7 @@ mmu_booke_page_exists_quick(mmu_t mmu, pmap_t pmap if (++loops >= 16) break; } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (rv); } @@ -2424,7 +2439,7 @@ mmu_booke_page_wired_mappings(mmu_t mmu, vm_page_t if ((m->oflags & VPO_UNMANAGED) != 0) return (count); - vm_page_lock_queues(); + rw_wlock(&pvh_global_lock); TAILQ_FOREACH(pv, &m->md.pv_list, pv_link) { PMAP_LOCK(pv->pv_pmap); if ((pte = pte_find(mmu, pv->pv_pmap, pv->pv_va)) != NULL) @@ -2432,7 +2447,7 @@ mmu_booke_page_wired_mappings(mmu_t mmu, vm_page_t count++; PMAP_UNLOCK(pv->pv_pmap); } - vm_page_unlock_queues(); + rw_wunlock(&pvh_global_lock); return (count); } --------------030103020804000102090505--