From f988c254dfc2ecee6305b84349657bf357814603 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Tue, 11 Mar 2014 15:58:31 +0100 Subject: [PATCH] hw: comment conditions of interprocessor interrupt ref #1088 --- base-hw/src/core/kernel/processor.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/base-hw/src/core/kernel/processor.cc b/base-hw/src/core/kernel/processor.cc index 4e277101b4..b443ecad9d 100644 --- a/base-hw/src/core/kernel/processor.cc +++ b/base-hw/src/core/kernel/processor.cc @@ -63,7 +63,18 @@ void Kernel::Processor::schedule(Processor_client * const client) { if (_id != executing_id()) { - /* remote add client and let target processor notice it if necessary */ + /* + * Remote add client and let target processor notice it if necessary + * + * The interrupt controller might provide redundant submission of + * inter-processor interrupts. Thus its possible that once the targeted + * processor is able to grab the kernel lock, multiple remote updates + * occured and consequently the processor traps multiple times for the + * sole purpose of recognizing the result of the accumulative changes. + * Hence, we omit further interrupts if there is one pending already. + * Additionailly we omit the interrupt if the insertion doesn't + * rescind the current scheduling choice of the processor. + */ if (_scheduler.insert_and_check(client) && !_ip_interrupt_pending) { pic()->trigger_ip_interrupt(_id); _ip_interrupt_pending = true;