Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/sparc/sparc consolidate the interrupt evcnt(9) into...



details:   https://anonhg.NetBSD.org/src/rev/3a7fab9aa747
branches:  trunk
changeset: 761428:3a7fab9aa747
user:      mrg <mrg%NetBSD.org@localhost>
date:      Thu Jan 27 06:24:59 2011 +0000

description:
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.

diffstat:

 sys/arch/sparc/sparc/cpu.c         |  57 +++++++++++++++++++++++++++++++++++--
 sys/arch/sparc/sparc/cpuvar.h      |   6 ++--
 sys/arch/sparc/sparc/genassym.cf   |   5 ++-
 sys/arch/sparc/sparc/intr.c        |  56 ++++++++----------------------------
 sys/arch/sparc/sparc/locore.s      |  21 ++++++++-----
 sys/arch/sparc/sparc/timer_sun4m.c |  13 +-------
 6 files changed, 88 insertions(+), 70 deletions(-)

diffs (truncated from 361 to 300 lines):

diff -r 4a59911ee29c -r 3a7fab9aa747 sys/arch/sparc/sparc/cpu.c
--- a/sys/arch/sparc/sparc/cpu.c        Thu Jan 27 05:31:13 2011 +0000
+++ b/sys/arch/sparc/sparc/cpu.c        Thu Jan 27 06:24:59 2011 +0000
@@ -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);
                        }
                }
        }
diff -r 4a59911ee29c -r 3a7fab9aa747 sys/arch/sparc/sparc/cpuvar.h
--- a/sys/arch/sparc/sparc/cpuvar.h     Thu Jan 27 05:31:13 2011 +0000
+++ b/sys/arch/sparc/sparc/cpuvar.h     Thu Jan 27 06:24:59 2011 +0000
@@ -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];
 };
 
 /*
diff -r 4a59911ee29c -r 3a7fab9aa747 sys/arch/sparc/sparc/genassym.cf
--- a/sys/arch/sparc/sparc/genassym.cf  Thu Jan 27 05:31:13 2011 +0000
+++ b/sys/arch/sparc/sparc/genassym.cf  Thu Jan 27 06:24:59 2011 +0000
@@ -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)
 
diff -r 4a59911ee29c -r 3a7fab9aa747 sys/arch/sparc/sparc/intr.c
--- a/sys/arch/sparc/sparc/intr.c       Thu Jan 27 05:31:13 2011 +0000
+++ b/sys/arch/sparc/sparc/intr.c       Thu Jan 27 06:24:59 2011 +0000
@@ -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,48 +74,8 @@
 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);
-
 void   strayintr(struct clockframe *);
 #ifdef DIAGNOSTIC
 void   bogusintr(struct clockframe *);
@@ -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) {
diff -r 4a59911ee29c -r 3a7fab9aa747 sys/arch/sparc/sparc/locore.s
--- a/sys/arch/sparc/sparc/locore.s     Thu Jan 27 05:31:13 2011 +0000
+++ b/sys/arch/sparc/sparc/locore.s     Thu Jan 27 06:24:59 2011 +0000
@@ -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



Home | Main Index | Thread Index | Old Index