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;