Module Name:    src
Committed By:   mrg
Date:           Mon Aug 17 08:56:27 UTC 2020

Modified Files:
        src/sys/uvm/pmap: pmap_segtab.c

Log Message:
add pmaphist calls around seg_tab[] manipulation.  hopefully will
help find what causes this:

panic: pmap_segtab_alloc: pm_segtab.seg_tab[1010] != 0 (0x980000004eeb6068): 
from free list


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/uvm/pmap/pmap_segtab.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/pmap/pmap_segtab.c
diff -u src/sys/uvm/pmap/pmap_segtab.c:1.15 src/sys/uvm/pmap/pmap_segtab.c:1.16
--- src/sys/uvm/pmap/pmap_segtab.c:1.15	Fri Aug  7 07:19:45 2020
+++ src/sys/uvm/pmap/pmap_segtab.c	Mon Aug 17 08:56:27 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: pmap_segtab.c,v 1.15 2020/08/07 07:19:45 skrll Exp $	*/
+/*	$NetBSD: pmap_segtab.c,v 1.16 2020/08/17 08:56:27 mrg Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pmap_segtab.c,v 1.15 2020/08/07 07:19:45 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap_segtab.c,v 1.16 2020/08/17 08:56:27 mrg Exp $");
 
 /*
  *	Manages physical address maps.
@@ -210,12 +210,18 @@ pmap_segtab_release(pmap_t pmap, pmap_se
 {
 	pmap_segtab_t *stp = *stp_p;
 
+	UVMHIST_FUNC(__func__);
+	UVMHIST_CALLARGS(pmaphist, "pm=%#jx stpp=%#jx free=%jd",
+	    (uintptr_t)pmap, (uintptr_t)stp_p, free_stp, 0);
+	UVMHIST_LOG(pmaphist, " callback=%jx flags=%jx va=%jx vinc=%jx",
+	    (uintptr_t)callback, flags, (uintptr_t)va, (uintptr_t)vinc);
 	for (size_t i = (va / vinc) & (PMAP_SEGTABSIZE - 1);
 	     i < PMAP_SEGTABSIZE;
 	     i++, va += vinc) {
 #ifdef _LP64
 		if (vinc > NBSEG) {
 			if (stp->seg_seg[i] != NULL) {
+				UVMHIST_LOG(pmaphist, " recursing", 0, 0, 0, 0);
 				pmap_segtab_release(pmap, &stp->seg_seg[i],
 				    true, callback, flags, va, vinc / NSEGPG);
 				KASSERT(stp->seg_seg[i] == NULL);
@@ -255,6 +261,7 @@ pmap_segtab_release(pmap_t pmap, pmap_se
 #endif
 
 		stp->seg_tab[i] = NULL;
+		UVMHIST_LOG(pmaphist, " zeroing tab[%jd]", i, 0, 0, 0);
 	}
 
 	if (free_stp) {
@@ -448,6 +455,10 @@ pmap_pte_reserve(pmap_t pmap, vaddr_t va
 	pmap_segtab_t *stp = pmap->pm_segtab;
 	pt_entry_t *pte;
 
+	UVMHIST_FUNC(__func__);
+	UVMHIST_CALLARGS(pmaphist, "pm=%#jx va=%#jx flags=%jx",
+	    (uintptr_t)pmap, (uintptr_t)va, flags, 0);
+
 	pte = pmap_pte_lookup(pmap, va);
 	if (__predict_false(pte == NULL)) {
 #ifdef _LP64
@@ -513,6 +524,8 @@ pmap_pte_reserve(pmap_t pmap, vaddr_t va
 		*pte_p = pte;
 #endif
 		KASSERT(pte == stp->seg_tab[(va >> SEGSHIFT) & (PMAP_SEGTABSIZE - 1)]);
+		UVMHIST_LOG(pmaphist, " set tab[%jd]=%jx",
+		    (va >> SEGSHIFT) & (PMAP_SEGTABSIZE - 1), pte, 0, 0);
 
 #ifdef DEBUG
 		for (size_t i = 0; i < NPTEPG; i++) {

Reply via email to