Instability likely related to new pmap on Cubieboard A10
Svatopluk Kraus
onwahe at gmail.com
Wed Aug 19 14:42:57 UTC 2015
On Wed, Aug 19, 2015 at 3:47 PM, Dmitry Marakasov <amdmi3 at amdmi3.ru> wrote:
> * Svatopluk Kraus (onwahe at 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
-------------- next part --------------
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);
More information about the freebsd-arm
mailing list