From 8be612127e0826ac38faf1515e283b0d02399ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= Date: Sat, 17 Oct 2009 12:05:02 +0000 Subject: [PATCH] When debugging interrupt handlers is enabled, keep count of handled irq for each handler, to ease tracking which driver is unfriendly to others for shared irqs. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33614 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/int.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/system/kernel/int.c b/src/system/kernel/int.c index d721c09998..dc4daedee3 100644 --- a/src/system/kernel/int.c +++ b/src/system/kernel/int.c @@ -37,6 +37,9 @@ struct io_handler { void *data; bool use_enable_counter; bool no_handled_info; +#if DEBUG_INTERRUPTS + int64 handled_count; +#endif }; struct io_vector { @@ -86,8 +89,8 @@ dump_int_statistics(int argc, char **argv) if (strchr(imageName, '/') != NULL) imageName = strrchr(imageName, '/') + 1; - kprintf("\t%s:%s (%p), data %p\n", imageName, symbol, io->func, - io->data); + kprintf("\t%s:%s (%p), data %p, handled %8lld\n", imageName, symbol, io->func, + io->data, io->handled_count); } else kprintf("\t%p, data %p\n", io->func, io->data); } @@ -195,6 +198,9 @@ int_io_interrupt_handler(int vector, bool levelTriggered) handled = true; else if (status == B_INVOKE_SCHEDULER) invokeScheduler = true; +#if DEBUG_INTERRUPTS + io->handled_count++; +#endif } #if DEBUG_INTERRUPTS @@ -300,6 +306,9 @@ install_io_interrupt_handler(long vector, interrupt_handler handler, void *data, io->data = data; io->use_enable_counter = (flags & B_NO_ENABLE_COUNTER) == 0; io->no_handled_info = (flags & B_NO_HANDLED_INFO) != 0; +#if DEBUG_INTERRUPTS + io->handled_count = 0LL; +#endif // Disable the interrupts, get the spinlock for this irq only // and then insert the handler