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 @@ -1631,75 +1631,3 @@ } SYSINIT(start_softintr, SI_SUB_SOFTINTR, SI_ORDER_FIRST, start_softintr, NULL); - -/* - * Sysctls used by systat and others: hw.intrnames and hw.intrcnt. - * The data for this machine dependent, and the declarations are in machine - * dependent code. The layout of intrnames and intrcnt however is machine - * independent. - * - * We do not know the length of intrcnt and intrnames at compile time, so - * calculate things at run time. - */ -static int -sysctl_intrnames(SYSCTL_HANDLER_ARGS) -{ - return (sysctl_handle_opaque(oidp, intrnames, sintrnames, req)); -} - -SYSCTL_PROC(_hw, OID_AUTO, intrnames, - CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, - sysctl_intrnames, "", - "Interrupt Names"); - -static int -sysctl_intrcnt(SYSCTL_HANDLER_ARGS) -{ -#ifdef SCTL_MASK32 - uint32_t *intrcnt32; - unsigned i; - int error; - - 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); - if (intrcnt32 == NULL) - return (ENOMEM); - for (i = 0; i < sintrcnt / sizeof (u_long); i++) - intrcnt32[i] = intrcnt[i]; - error = sysctl_handle_opaque(oidp, intrcnt32, sintrcnt / 2, req); - free(intrcnt32, M_TEMP); - return (error); - } -#endif - return (sysctl_handle_opaque(oidp, intrcnt, sintrcnt, req)); -} - -SYSCTL_PROC(_hw, OID_AUTO, intrcnt, - CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, - sysctl_intrcnt, "", - "Interrupt Counts"); - -#ifdef DDB -/* - * DDB command to dump the interrupt statistics. - */ -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; - } -} -#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 @@ -148,11 +148,11 @@ SYSCTL_UINT(_machdep, OID_AUTO, nirq, CTLFLAG_RDTUN, &intr_nirq, 0, "Number of IRQs"); -/* Data for MI statistics reporting. */ -u_long *intrcnt; -char *intrnames; -size_t sintrcnt; -size_t sintrnames; +/* 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 u_int intrcnt_count; @@ -1748,3 +1748,69 @@ M_INTRNG, M_WAITOK | M_ZERO); } SYSINIT(intr_map_init, SI_SUB_INTR, SI_ORDER_FIRST, intr_map_init, NULL); + +/* + * Sysctls used by systat and others: hw.intrnames and hw.intrcnt. + */ +static int +sysctl_intrnames(SYSCTL_HANDLER_ARGS) +{ + return (sysctl_handle_opaque(oidp, intrnames, sintrnames, req)); +} + +SYSCTL_PROC(_hw, OID_AUTO, intrnames, + CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, + sysctl_intrnames, + "", "Interrupt Names"); + +static int +sysctl_intrcnt(SYSCTL_HANDLER_ARGS) +{ +#ifdef SCTL_MASK32 + uint32_t *intrcnt32; + unsigned i; + int error; + + 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); + if (intrcnt32 == NULL) + return (ENOMEM); + for (i = 0; i < sintrcnt / sizeof (u_long); i++) + intrcnt32[i] = intrcnt[i]; + error = sysctl_handle_opaque(oidp, intrcnt32, sintrcnt / 2, req); + free(intrcnt32, M_TEMP); + return (error); + } +#endif + return (sysctl_handle_opaque(oidp, intrcnt, sintrcnt, req)); +} + +SYSCTL_PROC(_hw, OID_AUTO, intrcnt, + CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, + sysctl_intrcnt, + "", "Interrupt Counts"); + +#ifdef DDB +/* + * DDB command to dump the interrupt statistics. + */ +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; + } +} +#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 @@ -77,6 +77,7 @@ #include #include #include +#include #include #include #include @@ -130,11 +131,11 @@ static u_int stray_count; #define INTRNAME_LEN (MAXCOMLEN + 1) -u_long *intrcnt; -char *intrnames; -size_t sintrcnt = sizeof(intrcnt); -size_t sintrnames = sizeof(intrnames); -int nintrcnt; +static u_long *intrcnt; +static char *intrnames; +static size_t sintrcnt = sizeof(intrcnt); +static size_t sintrnames = sizeof(intrnames); +static int nintrcnt; /* * Just to start @@ -695,3 +696,69 @@ PIC_UNMASK(i->pic, i->intline, i->priv); } + +/* + * Sysctls used by systat and others: hw.intrnames and hw.intrcnt. + */ +static int +sysctl_intrnames(SYSCTL_HANDLER_ARGS) +{ + return (sysctl_handle_opaque(oidp, intrnames, sintrnames, req)); +} + +SYSCTL_PROC(_hw, OID_AUTO, intrnames, + CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, + sysctl_intrnames, + "", "Interrupt Names"); + +static int +sysctl_intrcnt(SYSCTL_HANDLER_ARGS) +{ +#ifdef SCTL_MASK32 + uint32_t *intrcnt32; + unsigned i; + int error; + + 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); + if (intrcnt32 == NULL) + return (ENOMEM); + for (i = 0; i < sintrcnt / sizeof (u_long); i++) + intrcnt32[i] = intrcnt[i]; + error = sysctl_handle_opaque(oidp, intrcnt32, sintrcnt / 2, req); + free(intrcnt32, M_TEMP); + return (error); + } +#endif + return (sysctl_handle_opaque(oidp, intrcnt, sintrcnt, req)); +} + +SYSCTL_PROC(_hw, OID_AUTO, intrcnt, + CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, + sysctl_intrcnt, + "", "Interrupt Counts"); + +#ifdef DDB +/* + * DDB command to dump the interrupt statistics. + */ +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; + } +} +#endif diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h --- a/sys/sys/interrupt.h +++ b/sys/sys/interrupt.h @@ -157,12 +157,6 @@ extern struct intr_event *clk_intr_event; -/* 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 */ - #ifdef DDB void db_dump_intr_event(struct intr_event *ie, int handlers); #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 @@ -96,11 +96,11 @@ #endif #define INTRNAME_LEN (MAXCOMLEN + 1) -u_long *intrcnt; -char *intrnames; -size_t sintrcnt = sizeof(intrcnt); -size_t sintrnames = sizeof(intrnames); -int nintrcnt; +static u_long *intrcnt; +static char *intrnames; +static size_t sintrcnt = sizeof(intrcnt); +static size_t sintrnames = sizeof(intrnames); +static int nintrcnt; static MALLOC_DEFINE(M_INTR, "intr", "Interrupt Sources"); @@ -846,3 +846,69 @@ return (PCPU_GET(apic_id)); } #endif + +/* + * Sysctls used by systat and others: hw.intrnames and hw.intrcnt. + */ +static int +sysctl_intrnames(SYSCTL_HANDLER_ARGS) +{ + return (sysctl_handle_opaque(oidp, intrnames, sintrnames, req)); +} + +SYSCTL_PROC(_hw, OID_AUTO, intrnames, + CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, + sysctl_intrnames, + "", "Interrupt Names"); + +static int +sysctl_intrcnt(SYSCTL_HANDLER_ARGS) +{ +#ifdef SCTL_MASK32 + uint32_t *intrcnt32; + unsigned i; + int error; + + 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); + if (intrcnt32 == NULL) + return (ENOMEM); + for (i = 0; i < sintrcnt / sizeof (u_long); i++) + intrcnt32[i] = intrcnt[i]; + error = sysctl_handle_opaque(oidp, intrcnt32, sintrcnt / 2, req); + free(intrcnt32, M_TEMP); + return (error); + } +#endif + return (sysctl_handle_opaque(oidp, intrcnt, sintrcnt, req)); +} + +SYSCTL_PROC(_hw, OID_AUTO, intrcnt, + CTLTYPE_OPAQUE | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, + sysctl_intrcnt, + "", "Interrupt Counts"); + +#ifdef DDB +/* + * DDB command to dump the interrupt statistics. + */ +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; + } +} +#endif