diff --git a/sys/kern/kern_clock.c b/sys/kern/kern_clock.c --- a/sys/kern/kern_clock.c +++ b/sys/kern/kern_clock.c @@ -834,22 +834,15 @@ static void watchdog_fire(void) { - int nintr; - uint64_t inttotal; - u_long *curintr; - char *curname; - - curintr = intrcnt; - curname = intrnames; - inttotal = 0; - nintr = sintrcnt / sizeof(u_long); + uint64_t inttotal = 0; + u_int i; printf("interrupt total\n"); - while (--nintr >= 0) { - if (*curintr) - printf("%-12s %20lu\n", curname, *curintr); - curname += strlen(curname) + 1; - inttotal += *curintr++; + for (i = 0; i < intrcnt_index; ++i) { + if (intrcnt[i] != 0) + printf("%-12s %20lu\n", intrnames + i * (MAXCOMLEN + 1), + intrcnt[i]); + inttotal += intrcnt[i]; } printf("Total %20ju\n", (uintmax_t)inttotal); diff --git a/sys/kern/kern_intr.c b/sys/kern/kern_intr.c --- a/sys/kern/kern_intr.c +++ b/sys/kern/kern_intr.c @@ -1644,7 +1644,8 @@ static int sysctl_intrnames(SYSCTL_HANDLER_ARGS) { - return (sysctl_handle_opaque(oidp, intrnames, sintrnames, req)); + return (sysctl_handle_opaque(oidp, intrnames, + intrcnt_index * (MAXCOMLEN + 1), req)); } SYSCTL_PROC(_hw, OID_AUTO, intrnames, @@ -1662,18 +1663,22 @@ if (req->flags & SCTL_MASK32) { if (!req->oldptr) - return (sysctl_handle_opaque(oidp, NULL, sintrcnt / 2, req)); - intrcnt32 = malloc(sintrcnt / 2, M_TEMP, M_NOWAIT); + return (sysctl_handle_opaque(oidp, NULL, + intrcnt_index * sizeof(uint32_t), req)); + intrcnt32 = malloc(intrcnt_index * sizeof(uint32_t), M_TEMP, + M_NOWAIT); if (intrcnt32 == NULL) return (ENOMEM); - for (i = 0; i < sintrcnt / sizeof (u_long); i++) + for (i = 0; i < intrcnt_index; i++) intrcnt32[i] = intrcnt[i]; - error = sysctl_handle_opaque(oidp, intrcnt32, sintrcnt / 2, req); + error = sysctl_handle_opaque(oidp, intrcnt32, + intrcnt_index * sizeof(uint32_t), req); free(intrcnt32, M_TEMP); return (error); } #endif - return (sysctl_handle_opaque(oidp, intrcnt, sintrcnt, req)); + return (sysctl_handle_opaque(oidp, intrcnt, + intrcnt_index * sizeof(u_long), req)); } SYSCTL_PROC(_hw, OID_AUTO, intrcnt, @@ -1687,19 +1692,11 @@ */ DB_SHOW_COMMAND_FLAGS(intrcnt, db_show_intrcnt, DB_CMD_MEMSAFE) { - u_long *i; - char *cp; - u_int j; - - cp = intrnames; - j = 0; - for (i = intrcnt; j < (sintrcnt / sizeof(u_long)) && !db_pager_quit; - i++, j++) { - if (*cp == '\0') - break; - if (*i != 0) - db_printf("%s\t%lu\n", cp, *i); - cp += strlen(cp) + 1; - } + u_int i; + + for (i = 0; i < intrcnt_index && !db_pager_quit; ++i) + if (intrcnt[i] != 0) + db_printf("%s\t%lu\n", intrnames + i * (MAXCOMLEN + 1), + intrcnt[i]); } #endif diff --git a/sys/kern/subr_intr.c b/sys/kern/subr_intr.c --- a/sys/kern/subr_intr.c +++ b/sys/kern/subr_intr.c @@ -149,9 +149,7 @@ /* Data for MI statistics reporting. */ u_long *intrcnt; char *intrnames; -size_t sintrcnt; -size_t sintrnames; -static u_int intrcnt_index; +u_int intrcnt_index; static struct intr_irqsrc *intr_map_get_isrc(u_int res_id); static void intr_map_set_isrc(u_int res_id, struct intr_irqsrc *isrc); @@ -185,8 +183,6 @@ M_WAITOK | M_ZERO); intrnames = mallocarray(intrcnt_count, INTRNAME_LEN, M_INTRNG, M_WAITOK | M_ZERO); - sintrcnt = intrcnt_count * sizeof(u_long); - sintrnames = intrcnt_count * INTRNAME_LEN; irq_sources = mallocarray(intr_nirq, sizeof(struct intr_irqsrc*), M_INTRNG, M_WAITOK | M_ZERO); } diff --git a/sys/powerpc/powerpc/intr_machdep.c b/sys/powerpc/powerpc/intr_machdep.c --- a/sys/powerpc/powerpc/intr_machdep.c +++ b/sys/powerpc/powerpc/intr_machdep.c @@ -116,7 +116,6 @@ int base; }; -static u_int intrcnt_index = 0; static struct mtx intr_table_lock; static struct powerpc_intr **powerpc_intrs; static struct pic piclist[MAX_PICS]; @@ -131,8 +130,7 @@ u_long *intrcnt; char *intrnames; -size_t sintrcnt = sizeof(intrcnt); -size_t sintrnames = sizeof(intrnames); +u_int intrcnt_index; int nintrcnt; /* @@ -181,8 +179,6 @@ M_ZERO); intrnames = mallocarray(nintrcnt, MAXCOMLEN + 1, M_INTR, M_WAITOK | M_ZERO); - sintrcnt = nintrcnt * sizeof(u_long); - sintrnames = nintrcnt * (MAXCOMLEN + 1); intrcnt_setname("???", 0); intrcnt_index = 1; diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h --- a/sys/sys/interrupt.h +++ b/sys/sys/interrupt.h @@ -160,8 +160,7 @@ /* Counts and names for statistics (defined in MD code). */ extern u_long *intrcnt; /* counts for each device and stray */ extern char *intrnames; /* string table containing device names */ -extern size_t sintrcnt; /* size of intrcnt table */ -extern size_t sintrnames; /* size of intrnames table */ +extern u_int intrcnt_index; /* number of counters/names */ #ifdef DDB void db_dump_intr_event(struct intr_event *ie, int handlers); diff --git a/sys/x86/x86/intr_machdep.c b/sys/x86/x86/intr_machdep.c --- a/sys/x86/x86/intr_machdep.c +++ b/sys/x86/x86/intr_machdep.c @@ -76,7 +76,6 @@ typedef void (*mask_fn)(void *); -static int intrcnt_index; static struct intsrc **interrupt_sources; #ifdef SMP static struct intsrc **interrupt_sorted; @@ -97,8 +96,7 @@ u_long *intrcnt; char *intrnames; -size_t sintrcnt = sizeof(intrcnt); -size_t sintrnames = sizeof(intrnames); +u_int intrcnt_index; int nintrcnt; static MALLOC_DEFINE(M_INTR, "intr", "Interrupt Sources"); @@ -191,8 +189,6 @@ M_ZERO); intrnames = mallocarray(nintrcnt, MAXCOMLEN + 1, M_INTR, M_WAITOK | M_ZERO); - sintrcnt = nintrcnt * sizeof(u_long); - sintrnames = nintrcnt * (MAXCOMLEN + 1); intrcnt_setname("???", 0); intrcnt_index = 1;