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