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 @@ -152,8 +152,7 @@ /* Data for statistics reporting. */ static u_long *intrcnt; static char *intrnames; -static size_t sintrcnt; -static size_t sintrnames; +static u_int intrcnt_index; static int nintrcnt; static bitstr_t *intrcnt_bitmap; @@ -188,8 +187,6 @@ M_WAITOK | M_ZERO); intrnames = mallocarray(nintrcnt, INTRNAME_LEN, M_INTRNG, M_WAITOK | M_ZERO); - sintrcnt = nintrcnt * sizeof(u_long); - sintrnames = nintrcnt * INTRNAME_LEN; /* Allocate the bitmap tracking counter allocations. */ intrcnt_bitmap = bit_alloc(nintrcnt, M_INTRNG, M_WAITOK | M_ZERO); @@ -283,6 +280,8 @@ if (index == -1) panic("Failed to allocate 2 counters. Array exhausted?"); bit_nset(intrcnt_bitmap, index, index + 1); + if (index >= intrcnt_index) + intrcnt_index = index + 2; isrc->isrc_index = index; isrc->isrc_count = &intrcnt[index]; isrc_update_name(isrc, NULL); @@ -325,6 +324,8 @@ panic("Failed to allocate %d counters. Array exhausted?", MAXCPU); bit_nset(intrcnt_bitmap, index, index + MAXCPU - 1); + if (index >= intrcnt_index) + intrcnt_index = index + MAXCPU; for (i = 0; i < MAXCPU; i++) { snprintf(str, INTRNAME_LEN, "cpu%d:%s", i, name); intrcnt_setname(str, index + i); @@ -1783,7 +1784,8 @@ static int sysctl_intrnames(SYSCTL_HANDLER_ARGS) { - return (sysctl_handle_opaque(oidp, intrnames, sintrnames, req)); + return (sysctl_handle_opaque(oidp, intrnames, + intrcnt_index * INTRNAME_LEN, req)); } SYSCTL_PROC(_hw, OID_AUTO, intrnames, @@ -1801,18 +1803,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, @@ -1826,19 +1832,11 @@ */ DB_SHOW_COMMAND_FLAGS(intrcnt, db_show_intrcnt, DB_CMD_MEMSAFE) { - u_long *i; - char *cp; - u_int j; + u_int i; - 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; - } + for (i = 0; i < intrcnt_index && !db_pager_quit; ++i) + if (intrcnt[i] != 0) + db_printf("%s\t%lu\n", intrnames + i * INTRNAME_LEN, + intrcnt[i]); } #endif 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 @@ -117,7 +117,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]; @@ -133,8 +132,7 @@ #define INTRNAME_LEN (MAXCOMLEN + 1) static u_long *intrcnt; static char *intrnames; -static size_t sintrcnt = sizeof(intrcnt); -static size_t sintrnames = sizeof(intrnames); +static u_int intrcnt_index; static int nintrcnt; /* @@ -183,8 +181,6 @@ M_ZERO); intrnames = mallocarray(nintrcnt, INTRNAME_LEN, M_INTR, M_WAITOK | M_ZERO); - sintrcnt = nintrcnt * sizeof(u_long); - sintrnames = nintrcnt * INTRNAME_LEN; intrcnt_setname("???", 0); intrcnt_index = 1; @@ -703,7 +699,8 @@ static int sysctl_intrnames(SYSCTL_HANDLER_ARGS) { - return (sysctl_handle_opaque(oidp, intrnames, sintrnames, req)); + return (sysctl_handle_opaque(oidp, intrnames, + intrcnt_index * INTRNAME_LEN, req)); } SYSCTL_PROC(_hw, OID_AUTO, intrnames, @@ -721,18 +718,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, @@ -746,19 +747,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 * INTRNAME_LEN, + intrcnt[i]); } #endif 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; @@ -98,8 +97,7 @@ #define INTRNAME_LEN (MAXCOMLEN + 1) static u_long *intrcnt; static char *intrnames; -static size_t sintrcnt = sizeof(intrcnt); -static size_t sintrnames = sizeof(intrnames); +static u_int intrcnt_index; static int nintrcnt; static MALLOC_DEFINE(M_INTR, "intr", "Interrupt Sources"); @@ -192,8 +190,6 @@ M_ZERO); intrnames = mallocarray(nintrcnt, INTRNAME_LEN, M_INTR, M_WAITOK | M_ZERO); - sintrcnt = nintrcnt * sizeof(u_long); - sintrnames = nintrcnt * INTRNAME_LEN; intrcnt_setname("???", 0); intrcnt_index = 1; @@ -854,7 +850,8 @@ static int sysctl_intrnames(SYSCTL_HANDLER_ARGS) { - return (sysctl_handle_opaque(oidp, intrnames, sintrnames, req)); + return (sysctl_handle_opaque(oidp, intrnames, + intrcnt_index * INTRNAME_LEN, req)); } SYSCTL_PROC(_hw, OID_AUTO, intrnames, @@ -872,18 +869,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, @@ -897,19 +898,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 * INTRNAME_LEN, + intrcnt[i]); } #endif