Date: Wed, 19 Aug 2015 16:42:56 +0200 From: Svatopluk Kraus <onwahe@gmail.com> To: Dmitry Marakasov <amdmi3@amdmi3.ru> Cc: Adrian Chadd <adrian.chadd@gmail.com>, "freebsd-arm@FreeBSD.org" <freebsd-arm@freebsd.org>, Ian Lepore <ian@freebsd.org> Subject: Re: Instability likely related to new pmap on Cubieboard A10 Message-ID: <CAFHCsPVwZS_rCnvKztg7g2%2BvrOBwQpqpPYyA2=hCLGiiU5=mrQ@mail.gmail.com> In-Reply-To: <20150819134708.GJ79354@hades.panopticon> References: <20150819002103.GC79354@hades.panopticon> <1439944961.242.150.camel@freebsd.org> <20150819013834.GD79354@hades.panopticon> <CAJ-VmokJv=nvcEkBogWeNJT65MosxnFcaitWn8FXJu32eahSdw@mail.gmail.com> <20150819120753.GH79354@hades.panopticon> <CAFHCsPVSGuWWY97ac2QVGAE77Lz2gJ12wDLpzH_kNdZsLQxh%2BQ@mail.gmail.com> <20150819134708.GJ79354@hades.panopticon>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --] On Wed, Aug 19, 2015 at 3:47 PM, Dmitry Marakasov <amdmi3@amdmi3.ru> wrote: > * Svatopluk Kraus (onwahe@gmail.com) wrote: > >> Great! I'm hunting this kind of panic for long time, but it never was >> so stable. Can you send me "show pmap addr" output from kdb after >> panic - pmap address is in panic message. > > https://people.freebsd.org/~amdmi3/pmap.log > Can you apply debug patch I'm attaching, enable KTR in your config with KTR_PMAP mask at least, and send me output of the following commands after panic : show ktr show pmap Output from ktr should be scrolled until a line like "pmap_remove_page - pmap xxx" will be in there. Thanks, Svata [-- Attachment #2 --] Index: sys/arm/arm/pmap-v6-new.c =================================================================== --- sys/arm/arm/pmap-v6-new.c (revision 286865) +++ sys/arm/arm/pmap-v6-new.c (working copy) @@ -4179,8 +4179,11 @@ int field, idx; int32_t bit; uint32_t inuse, bitmask; - boolean_t allfree; + boolean_t allfree, dopanic; +dopanic = FALSE; +CTR2(KTR_PMAP, "%s - pmap %p", __func__, pmap); + if (pmap != vmspace_pmap(curthread->td_proc->p_vmspace)) { printf("warning: %s called with non-current pmap\n", __func__); return; @@ -4190,11 +4193,17 @@ PMAP_LOCK(pmap); sched_pin(); TAILQ_FOREACH_SAFE(pc, &pmap->pm_pvchunk, pc_list, npc) { + +CTR2(KTR_PMAP, "%s - pc_pmap %p", __func__, pc->pc_pmap); + KASSERT(pc->pc_pmap == pmap, ("%s: wrong pmap %p %p", __func__, pmap, pc->pc_pmap)); allfree = TRUE; for (field = 0; field < _NPCM; field++) { inuse = (~(pc->pc_map[field])) & pc_freemask[field]; + +CTR3(KTR_PMAP, "%s - field %d inused %p", __func__, field, inuse); + while (inuse != 0) { bit = ffs(inuse) - 1; bitmask = 1UL << bit; @@ -4202,6 +4211,8 @@ pv = &pc->pc_pventry[idx]; inuse &= ~bitmask; +CTR3(KTR_PMAP, "%s - idx %d va %x", __func__, idx, pv->pv_va); + /* * Note that we cannot remove wired pages * from a process' mapping at this time @@ -4225,7 +4236,8 @@ printf("%s: pmap %p va %#x " "pte2 %#x\n", __func__, pmap, pv->pv_va, pte2); - panic("bad pte2"); + /*panic("bad pte2");*/ + dopanic = TRUE; } if (pte2_is_wired(pte2)) { @@ -4238,7 +4250,8 @@ } else { printf("%s: pmap %p va %#x pte1 %#x\n", __func__, pmap, pv->pv_va, pte1); - panic("bad pte1"); + /*panic("bad pte1");*/ + dopanic = TRUE; } /* Mark free */ @@ -4253,6 +4266,10 @@ free_pv_chunk(pc); } } + +if (dopanic) + panic("bad pte1 and/or pte2"); + sched_unpin(); pmap_tlb_flush_ng(pmap); rw_wunlock(&pvh_global_lock);home | help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAFHCsPVwZS_rCnvKztg7g2%2BvrOBwQpqpPYyA2=hCLGiiU5=mrQ>
