Index: sys/dev/xen/bus/xen_intr.c =================================================================== --- sys/dev/xen/bus/xen_intr.c +++ sys/dev/xen/bus/xen_intr.c @@ -564,8 +564,10 @@ ("Received unexpected event on vCPU#%u, event bound to vCPU#%u", PCPU_GET(cpuid), isrc->xi_cpu)); - intr_execute_handlers(first_evtchn_irq + port, - &isrc->xi_arch, trap_frame); + intr_execute_handlers(&isrc->xi_arch, trap_frame, + "stray Xen event on channel %u\n", + "too many stray Xen event %u's: not logging anymore\n", + port); /* * If this is the final port processed, Index: sys/x86/include/intr_machdep.h =================================================================== --- sys/x86/include/intr_machdep.h +++ sys/x86/include/intr_machdep.h @@ -66,6 +66,15 @@ #ifndef LOCORE +/* + * Standard format strings for the stray interrupt messages. The value should + * be the IRQ. + */ + +#define INTR_EXECUTE_STRAYMSG "stray irq %u\n" + +#define INTR_EXECUTE_MAXSTRAY "too many stray irq %u's: not logging anymore\n" + typedef void inthand_t(void); #define IDTVEC(name) __CONCAT(X,name) @@ -148,8 +157,9 @@ int intr_config_intr(struct intsrc *isrc, enum intr_trigger trig, enum intr_polarity pol); int intr_describe(struct intsrc *isrc, void *ih, const char *descr); -u_long intr_execute_handlers(u_int vector, struct intsrc *isrc, - struct trapframe *frame); +u_long intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame, + const char *straymsg, const char *maxstray, ...) __printflike(3, 5) + __printflike(4, 5); u_int intr_next_cpu(int domain); struct intsrc *intr_lookup_source(int vector); int intr_register_pic(struct pic *pic); Index: sys/x86/isa/atpic.c =================================================================== --- sys/x86/isa/atpic.c +++ sys/x86/isa/atpic.c @@ -549,7 +549,8 @@ if ((isr & IRQ_MASK(7)) == 0) return; } - intr_execute_handlers(atpic_vector(isrc), isrc, frame); + intr_execute_handlers(isrc, frame, INTR_EXECUTE_STRAYMSG, + INTR_EXECUTE_MAXSTRAY, vector); } #ifdef DEV_ISA Index: sys/x86/x86/intr_machdep.c =================================================================== --- sys/x86/x86/intr_machdep.c +++ sys/x86/x86/intr_machdep.c @@ -60,6 +60,7 @@ #include #include #include +#include #ifdef DDB #include #endif @@ -316,10 +317,11 @@ } u_long -intr_execute_handlers(u_int vector, struct intsrc *isrc, - struct trapframe *frame) +intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame, + const char *straymsg, const char *maxstray, ...) { struct intr_event *ie; + va_list args; /* * We count software interrupts when we process them. The @@ -346,12 +348,14 @@ if (intr_event_handle(ie, frame) != 0) { isrc->is_pic->pic_disable_source(isrc, PIC_EOI); (*isrc->is_straycount)++; + va_start(args, maxstray); if (*isrc->is_straycount < INTR_STRAY_LOG_MAX) - log(LOG_ERR, "stray irq%d\n", vector); + if (straymsg != NULL) + vlog(LOG_ERR, straymsg, args); else if (*isrc->is_straycount == MAX_STRAY_LOG) - log(LOG_CRIT, - "too many stray irq %d's: not logging anymore\n", - vector); + if (maxstray != NULL) + vlog(LOG_CRIT, maxstray, args); + va_end(args); return (*isrc->is_straycount); } return (0); Index: sys/x86/x86/local_apic.c =================================================================== --- sys/x86/x86/local_apic.c +++ sys/x86/x86/local_apic.c @@ -1296,7 +1296,8 @@ irq = apic_idt_to_irq(PCPU_GET(apic_id), vector); isrc = intr_lookup_source(irq); - intr_execute_handlers(irq, isrc, frame); + intr_execute_handlers(isrc, frame, INTR_EXECUTE_STRAYMSG, + INTR_EXECUTE_MAXSTRAY, irq); } void