Module Name:    src
Committed By:   mrg
Date:           Thu Jan 27 06:24:59 UTC 2011

Modified Files:
        src/sys/arch/sparc/sparc: cpu.c cpuvar.h genassym.cf intr.c locore.s
            timer_sun4m.c

Log Message:
consolidate the interrupt evcnt(9) into a full set of per-IPL per-CPU
soft/hard counters.  beyond the extra info, it seems to help avoid some
of these counters getting corrupted due to unlocked multiple accesses.

adjust the xcallintr() from xcall() hack so that we don't count these
events as interrupts.  align the existing evcnt name to count this.


To generate a diff of this commit:
cvs rdiff -u -r1.226 -r1.227 src/sys/arch/sparc/sparc/cpu.c
cvs rdiff -u -r1.85 -r1.86 src/sys/arch/sparc/sparc/cpuvar.h
cvs rdiff -u -r1.63 -r1.64 src/sys/arch/sparc/sparc/genassym.cf
cvs rdiff -u -r1.110 -r1.111 src/sys/arch/sparc/sparc/intr.c
cvs rdiff -u -r1.259 -r1.260 src/sys/arch/sparc/sparc/locore.s
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/sparc/sparc/timer_sun4m.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/arch/sparc/sparc/cpu.c
diff -u src/sys/arch/sparc/sparc/cpu.c:1.226 src/sys/arch/sparc/sparc/cpu.c:1.227
--- src/sys/arch/sparc/sparc/cpu.c:1.226	Thu Jan 27 05:31:13 2011
+++ src/sys/arch/sparc/sparc/cpu.c	Thu Jan 27 06:24:59 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.226 2011/01/27 05:31:13 mrg Exp $ */
+/*	$NetBSD: cpu.c,v 1.227 2011/01/27 06:24:59 mrg Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.226 2011/01/27 05:31:13 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.227 2011/01/27 06:24:59 mrg Exp $");
 
 #include "opt_multiprocessor.h"
 #include "opt_lockdebug.h"
@@ -296,9 +296,48 @@
 }
 #endif /* SUN4D */
 
+static const char * const hard_intr_names[] = {
+	"spur hard",
+	"lev1 hard",
+	"lev2 hard",
+	"lev3 hard",
+	"lev4 hard",
+	"lev5 hard",
+	"lev6 hard",
+	"lev7 hard",
+	"lev8 hard",
+	"lev9 hard",
+	"clock hard",
+	"lev11 hard",
+	"lev12 hard",
+	"lev13 hard",
+	"prof hard",
+	"nmi hard",
+};
+
+static const char * const soft_intr_names[] = {
+	"spur soft",
+	"lev1 soft",
+	"lev2 soft",
+	"lev3 soft",
+	"lev4 soft",
+	"lev5 soft",
+	"lev6 soft",
+	"lev7 soft",
+	"lev8 soft",
+	"lev9 soft",
+	"lev10 soft",
+	"lev11 soft",
+	"lev12 soft",
+	"xcall std",
+	"xcall fast",
+	"nmi soft",
+};
+
 static void
 cpu_init_evcnt(struct cpu_info *cpi)
 {
+	int i;
 
 	/*
 	 * Setup the per-cpu counters.
@@ -313,7 +352,17 @@
 	evcnt_attach_dynamic(&cpi->ci_xpmsg_mutex_fail, EVCNT_TYPE_MISC,
 			     NULL, cpu_name(cpi), "IPI mutex_trylock fail");
 	evcnt_attach_dynamic(&cpi->ci_xpmsg_mutex_fail_call, EVCNT_TYPE_MISC,
-			     NULL, cpu_name(cpi), "IPI mutex_trylock fail with call");
+			     NULL, cpu_name(cpi), "IPI mutex_trylock fail/call");
+
+	/*
+	 * These are the per-cpu per-IPL hard & soft interrupt counters.
+	 */
+	for (i = 0; i < 16; i++) {
+		evcnt_attach_dynamic(&cpi->ci_intrcnt[i], EVCNT_TYPE_INTR,
+				     NULL, cpu_name(cpi), hard_intr_names[i]);
+		evcnt_attach_dynamic(&cpi->ci_sintrcnt[i], EVCNT_TYPE_INTR,
+				     NULL, cpu_name(cpi), soft_intr_names[i]);
+	}
 }
 
 /*
@@ -621,7 +670,7 @@
 			cpuinfo.ci_xpmsg_mutex_fail.ev_count++;
 			if (cpuinfo.msg.tag) {
 				cpuinfo.ci_xpmsg_mutex_fail_call.ev_count++;
-				xcallintr(NULL);
+				xcallintr(xcallintr);
 			}
 		}
 	}

Index: src/sys/arch/sparc/sparc/cpuvar.h
diff -u src/sys/arch/sparc/sparc/cpuvar.h:1.85 src/sys/arch/sparc/sparc/cpuvar.h:1.86
--- src/sys/arch/sparc/sparc/cpuvar.h:1.85	Thu Jan 27 05:31:14 2011
+++ src/sys/arch/sparc/sparc/cpuvar.h	Thu Jan 27 06:24:59 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpuvar.h,v 1.85 2011/01/27 05:31:14 mrg Exp $ */
+/*	$NetBSD: cpuvar.h,v 1.86 2011/01/27 06:24:59 mrg Exp $ */
 
 /*
  *  Copyright (c) 1996 The NetBSD Foundation, Inc.
@@ -336,12 +336,12 @@
 	 */
 	vaddr_t	ci_free_sva1, ci_free_eva1, ci_free_sva2, ci_free_eva2;
 
-	struct evcnt ci_lev10;
-	struct evcnt ci_lev14;
 	struct evcnt ci_savefpstate;
 	struct evcnt ci_savefpstate_null;
 	struct evcnt ci_xpmsg_mutex_fail;
 	struct evcnt ci_xpmsg_mutex_fail_call;
+	struct evcnt ci_intrcnt[16];
+	struct evcnt ci_sintrcnt[16];
 };
 
 /*

Index: src/sys/arch/sparc/sparc/genassym.cf
diff -u src/sys/arch/sparc/sparc/genassym.cf:1.63 src/sys/arch/sparc/sparc/genassym.cf:1.64
--- src/sys/arch/sparc/sparc/genassym.cf:1.63	Fri Jan 14 02:06:31 2011
+++ src/sys/arch/sparc/sparc/genassym.cf	Thu Jan 27 06:24:59 2011
@@ -1,4 +1,4 @@
-#	$NetBSD: genassym.cf,v 1.63 2011/01/14 02:06:31 rmind Exp $
+#	$NetBSD: genassym.cf,v 1.64 2011/01/27 06:24:59 mrg Exp $
 
 #
 # Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -128,6 +128,9 @@
 define	CPUINFO_NINTR	offsetof(struct cpu_info, ci_data.cpu_nintr)
 define	CPUINFO_NSOFT	offsetof(struct cpu_info, ci_data.cpu_nsoft)
 define	CPUINFO_NFAULT	offsetof(struct cpu_info, ci_data.cpu_nfault)
+define	CPUINFO_LEV14	offsetof(struct cpu_info, ci_sintrcnt[14])
+define	CPUINFO_INTRCNT	offsetof(struct cpu_info, ci_intrcnt)
+define	CPUINFO_SINTRCNT	offsetof(struct cpu_info, ci_sintrcnt)
 define	EV_COUNT	offsetof(struct evcnt, ev_count)
 define	EV_STRUCTSIZE	sizeof(struct evcnt)
 

Index: src/sys/arch/sparc/sparc/intr.c
diff -u src/sys/arch/sparc/sparc/intr.c:1.110 src/sys/arch/sparc/sparc/intr.c:1.111
--- src/sys/arch/sparc/sparc/intr.c:1.110	Thu Jan 27 05:31:14 2011
+++ src/sys/arch/sparc/sparc/intr.c	Thu Jan 27 06:24:59 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: intr.c,v 1.110 2011/01/27 05:31:14 mrg Exp $ */
+/*	$NetBSD: intr.c,v 1.111 2011/01/27 06:24:59 mrg Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.110 2011/01/27 05:31:14 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.111 2011/01/27 06:24:59 mrg Exp $");
 
 #include "opt_multiprocessor.h"
 #include "opt_sparc_arch.h"
@@ -74,47 +74,7 @@
 static int intr_biglock_wrapper(void *);
 
 void *xcall_cookie;
-
-/* Stats */
-struct evcnt lev13_evcnt = EVCNT_INITIALIZER(EVCNT_TYPE_INTR,0,"xcall","std");
-struct evcnt lev14_evcnt = EVCNT_INITIALIZER(EVCNT_TYPE_INTR,0,"xcall","fast");
-EVCNT_ATTACH_STATIC(lev13_evcnt);
-EVCNT_ATTACH_STATIC(lev14_evcnt);
-#endif
-
-struct evcnt intrcnt[15] = {
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "spur", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev1", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev2", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev3", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev4", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev5", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev6", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev7", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev8", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev9", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "clock", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev11", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev12", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "lev13", "hard"),
-   EVCNT_INITIALIZER(EVCNT_TYPE_INTR, 0, "prof", "hard"),
-};
-
-EVCNT_ATTACH_STATIC2(intrcnt, 0);
-EVCNT_ATTACH_STATIC2(intrcnt, 1);
-EVCNT_ATTACH_STATIC2(intrcnt, 2);
-EVCNT_ATTACH_STATIC2(intrcnt, 3);
-EVCNT_ATTACH_STATIC2(intrcnt, 4);
-EVCNT_ATTACH_STATIC2(intrcnt, 5);
-EVCNT_ATTACH_STATIC2(intrcnt, 6);
-EVCNT_ATTACH_STATIC2(intrcnt, 7);
-EVCNT_ATTACH_STATIC2(intrcnt, 8);
-EVCNT_ATTACH_STATIC2(intrcnt, 9);
-EVCNT_ATTACH_STATIC2(intrcnt, 10);
-EVCNT_ATTACH_STATIC2(intrcnt, 11);
-EVCNT_ATTACH_STATIC2(intrcnt, 12);
-EVCNT_ATTACH_STATIC2(intrcnt, 13);
-EVCNT_ATTACH_STATIC2(intrcnt, 14);
+#endif
 
 void	strayintr(struct clockframe *);
 #ifdef DIAGNOSTIC
@@ -243,6 +203,9 @@
 	char bits[64];
 	u_int afsr, afva;
 
+	/* Tally */
+	cpuinfo.ci_intrcnt[15].ev_count++;
+
 	afsr = afva = 0;
 	if ((*cpuinfo.get_asyncflt)(&afsr, &afva) == 0) {
 		snprintb(bits, sizeof(bits), AFSR_BITS, afsr);
@@ -330,6 +293,10 @@
 void
 nmi_soft(struct trapframe *tf)
 {
+
+	/* Tally */
+	cpuinfo.ci_sintrcnt[15].ev_count++;
+
 	if (cpuinfo.mailbox) {
 		/* Check PROM messages */
 		uint8_t msg = *(uint8_t *)cpuinfo.mailbox;
@@ -380,13 +347,16 @@
  *
  * This is also called directly from xcall() if we notice an
  * incoming message while we're waiting to grab the xpmsg_lock.
+ * We pass the address of xcallintr() itself to indicate that
+ * this is not a real interrupt.
  */
 void
 xcallintr(void *v)
 {
 
 	/* Tally */
-	lev13_evcnt.ev_count++;
+	if (v != xcallintr)
+		cpuinfo.ci_sintrcnt[13].ev_count++;
 
 	/* notyet - cpuinfo.msg.received = 1; */
 	switch (cpuinfo.msg.tag) {

Index: src/sys/arch/sparc/sparc/locore.s
diff -u src/sys/arch/sparc/sparc/locore.s:1.259 src/sys/arch/sparc/sparc/locore.s:1.260
--- src/sys/arch/sparc/sparc/locore.s:1.259	Thu Jan 13 05:20:27 2011
+++ src/sys/arch/sparc/sparc/locore.s	Thu Jan 27 06:24:59 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.s,v 1.259 2011/01/13 05:20:27 mrg Exp $	*/
+/*	$NetBSD: locore.s,v 1.260 2011/01/27 06:24:59 mrg Exp $	*/
 
 /*
  * Copyright (c) 1996 Paul Kranenburg
@@ -2505,13 +2505,15 @@
 	wr	%l4, PSR_ET, %psr	! song and dance is necessary
 	std	%l0, [%sp + CCFSZ + 0]	! set up intrframe/clockframe
 	sll	%l3, 2, %l5
-	set	intrcnt, %l4		! intrcnt[intlev].ev_count++;
+
+	set	CPUINFO_VA + CPUINFO_SINTRCNT, %l4	! sintrcnt[intlev].ev_count++;
 	sll	%l3, EV_STRUCTSHIFT, %o2
 	ldd	[%l4 + %o2], %o0
-	std	%l2, [%sp + CCFSZ + 8]
+	std	%l2, [%sp + CCFSZ + 8]	! set up intrframe/clockframe
 	inccc   %o1
 	addx    %o0, 0, %o0
 	std	%o0, [%l4 + %o2]
+
 	set	_C_LABEL(sintrhand), %l4! %l4 = sintrhand[intlev];
 	ld	[%l4 + %l5], %l4
 
@@ -2639,7 +2641,8 @@
 	wr	%l4, PSR_ET, %psr	! song and dance is necessary
 	std	%l0, [%sp + CCFSZ + 0]	! set up intrframe/clockframe
 	sll	%l3, 2, %l5
-	set	intrcnt, %l4		! intrcnt[intlev].ev_count++;
+
+	set	CPUINFO_VA + CPUINFO_INTRCNT, %l4	! intrcnt[intlev].ev_count++;
 	sll	%l3, EV_STRUCTSHIFT, %o2
 	ldd	[%l4 + %o2], %o0
 	std	%l2, [%sp + CCFSZ + 8]	! set up intrframe/clockframe
@@ -2687,13 +2690,15 @@
 	wr	%l4, PSR_ET, %psr	! song and dance is necessary
 	std	%l0, [%sp + CCFSZ + 0]	! set up intrframe/clockframe
 	sll	%l3, 2, %l5
-	set	intrcnt, %l4		! intrcnt[intlev].ev_count++;
+
+	set	CPUINFO_VA + CPUINFO_INTRCNT, %l4	! intrcnt[intlev].ev_count++;
 	sll	%l3, EV_STRUCTSHIFT, %o2
 	ldd	[%l4 + %o2], %o0
 	std	%l2, [%sp + CCFSZ + 8]	! set up intrframe/clockframe
 	inccc   %o1
 	addx    %o0, 0, %o0
 	std	%o0, [%l4 + %o2]
+
 	set	_C_LABEL(intrhand), %l4	! %l4 = intrhand[intlev];
 	ld	[%l4 + %l5], %l4
 
@@ -2756,11 +2761,11 @@
  * %l6 = &cpuinfo
  */
 lev14_softint:
-	set	_C_LABEL(lev14_evcnt), %l7	! lev14_evcnt.ev_count++;
-	ldd	[%l7 + EV_COUNT], %l4
+	sethi	%hi(CPUINFO_VA), %l7
+	ldd	[%l7 + CPUINFO_LEV14], %l4
 	inccc	%l5
 	addx	%l4, %g0, %l4
-	std	%l4, [%l7 + EV_COUNT]
+	std	%l4, [%l7 + CPUINFO_LEV14]
 
 	ld	[%l6 + CPUINFO_XMSG_TRAP], %l7
 #ifdef DIAGNOSTIC

Index: src/sys/arch/sparc/sparc/timer_sun4m.c
diff -u src/sys/arch/sparc/sparc/timer_sun4m.c:1.22 src/sys/arch/sparc/sparc/timer_sun4m.c:1.23
--- src/sys/arch/sparc/sparc/timer_sun4m.c:1.22	Wed Jan 13 02:17:12 2010
+++ src/sys/arch/sparc/sparc/timer_sun4m.c	Thu Jan 27 06:24:59 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: timer_sun4m.c,v 1.22 2010/01/13 02:17:12 mrg Exp $	*/
+/*	$NetBSD: timer_sun4m.c,v 1.23 2011/01/27 06:24:59 mrg Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: timer_sun4m.c,v 1.22 2010/01/13 02:17:12 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: timer_sun4m.c,v 1.23 2011/01/27 06:24:59 mrg Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -136,7 +136,6 @@
 	 * For MP, we defer calling hardclock() to the schedintr so
 	 * that we call it on all cpus.
 	 */
-	cpuinfo.ci_lev10.ev_count++;
 	if (cold)
 		return 0;
 	/* read the limit register to clear the interrupt */
@@ -157,8 +156,6 @@
 	struct clockframe *frame = cap;
 	u_long newint;
 
-	cpuinfo.ci_lev14.ev_count++;
-
 	/* read the limit register to clear the interrupt */
 	*((volatile int *)&counterreg4m->t_limit);
 
@@ -256,12 +253,6 @@
 		cpi->counterreg_4m = (struct counter_4m *)bh;
 	}
 
-	/* Install timer/statclock event counters, per cpu */
-	for (CPU_INFO_FOREACH(n, cpi)) {
-		evcnt_attach_dynamic(&cpi->ci_lev10, EVCNT_TYPE_INTR, NULL, cpu_name(cpi), "lev10");
-		evcnt_attach_dynamic(&cpi->ci_lev14, EVCNT_TYPE_INTR, NULL, cpu_name(cpi), "lev14");
-	}
-
 	/* Put processor counter in "timer" mode */
 	timerreg4m->t_cfg = 0;
 

Reply via email to