On 30.07.14 21:54, Alan Cox wrote:
On 07/30/2014 14:46, Alan Cox wrote:
On 07/30/2014 13:58, Andreas Tobler wrote:
Hi Alan,

On 26.07.14 20:10, Alan Cox wrote:
Author: alc
Date: Sat Jul 26 18:10:18 2014
New Revision: 269134
URL: http://svnweb.freebsd.org/changeset/base/269134

Log:
    When unwiring a region of an address space, do not assume that the
    underlying physical pages are mapped by the pmap.  If, for
example, the
    application has performed an mprotect(..., PROT_NONE) on any part
of the
    wired region, then those pages will no longer be mapped by the pmap.
    So, using the pmap to lookup the wired pages in order to unwire them
    doesn't always work, and when it doesn't work wired pages are leaked.

    To avoid the leak, introduce and use a new function
vm_object_unwire()
    that locates the wired pages by traversing the object and its backing
    objects.

    At the same time, switch from using pmap_change_wiring() to the
recently
    introduced function pmap_unwire() for unwiring the region's mappings.
    pmap_unwire() is faster, because it operates a range of virtual
addresses
    rather than a single virtual page at a time.  Moreover, by
operating on
    a range, it is superpage friendly.  It doesn't waste time performing
    unnecessary demotions.

    Reported by:    markj
    Reviewed by:    kib
    Tested by:    pho, jmg (arm)
    Sponsored by:    EMC / Isilon Storage Division
This commit brings my 32- and 64-bit PowerMac's into panic.
Unfortunately I'm not able to give you a backtrace in the form of a
textdump nor of a core dump.

The only thing I have is this picture:

http://people.freebsd.org/~andreast/r269134_panic.jpg

Exactly this revision gives a panic and breaks the textdump/coredump
facility.

How can I help debugging?

It appears to me that moea64_pvo_enter() had a pre-existing bug that got
tickled by this change.  Specifically, moea64_pvo_enter() doesn't set
the PVO_WIRED flag when an unwired mapping already exists.  It just
returns with the mapping still in an unwired state.  Consequently, when
pmap_unwire() finally runs, it doesn't find a wired mapping.

Try this:

Index: powerpc/aim/mmu_oea64.c
===================================================================
--- powerpc/aim/mmu_oea64.c     (revision 269127)
+++ powerpc/aim/mmu_oea64.c     (working copy)
@@ -2274,7 +2274,8 @@ moea64_pvo_enter(mmu_t mmu, pmap_t pm, uma_zone_t
                 if (pvo->pvo_pmap == pm && PVO_VADDR(pvo) == va) {
                         if ((pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN) == pa &&
                             (pvo->pvo_pte.lpte.pte_lo & (LPTE_NOEXEC |
LPTE_PP))
-                           == (pte_lo & (LPTE_NOEXEC | LPTE_PP))) {
+                           == (pte_lo & (LPTE_NOEXEC | LPTE_PP)) &&
+                           ((pvo->pvo_vaddr ^ flags) & PVO_WIRED)) {
                                 if (!(pvo->pvo_pte.lpte.pte_hi &
LPTE_VALID)) {
                                         /* Re-insert if spilled */
                                         i = MOEA64_PTE_INSERT(mmu, ptegidx,


The new conditional test needs to be inverted.  Try this instead:

Index: powerpc/aim/mmu_oea64.c
===================================================================
--- powerpc/aim/mmu_oea64.c     (revision 269127)
+++ powerpc/aim/mmu_oea64.c     (working copy)
@@ -2274,7 +2274,8 @@ moea64_pvo_enter(mmu_t mmu, pmap_t pm, uma_zone_t
                 if (pvo->pvo_pmap == pm && PVO_VADDR(pvo) == va) {
                         if ((pvo->pvo_pte.lpte.pte_lo & LPTE_RPGN) == pa &&
                             (pvo->pvo_pte.lpte.pte_lo & (LPTE_NOEXEC |
LPTE_PP))
-                           == (pte_lo & (LPTE_NOEXEC | LPTE_PP))) {
+                           == (pte_lo & (LPTE_NOEXEC | LPTE_PP)) &&
+                           ((pvo->pvo_vaddr ^ flags) & PVO_WIRED) == 0) {
                                 if (!(pvo->pvo_pte.lpte.pte_hi &
LPTE_VALID)) {
                                         /* Re-insert if spilled */
                                         i = MOEA64_PTE_INSERT(mmu, ptegidx,



The panic stays, but the message is different:

panic: moea64_pvo_to_pte: pvo 0x10147ea0 has invalid pte 0xb341180 in moea64_pteg_table but valid in pvo.

Andreas

_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to