On Fri, 8 Mar 2013, Till Straumann wrote:I know. But this means that when the counter overflows 31 bits (2^31 - 1)
1) I'm not sure adding the SPURIOUS_DEFERRED flag intoatomic_t is going to stay 32 bit otherwise we'll have more horrible
threads_handled_last is OK - what happens if the atomic_t counter
can hold more than 31 bits? In this case, when thread handlers
increment the counter there is interference with the flag. If
this is not harmful then it is at least ugly.
problems than that one.
So you are saying that there 'handle_nested_irq()' can never be executed
I'm not as familiar with the code as you are but wouldn't it beYeah, we could do it that way. Would probably be simpler.
simpler to always defer spurious detection thus avoiding to have to
keep track of the state (deferral active/inactive)? I.e., if any
primary handler returns IRQ_HANDLED then we simply increment the
counter. note_interrupt() could then always compare the previous
count to the current count and if they are equal conclude that the
interrupt was not handled:
handle_irq_event_percpu()That should not matter much methinks, but I'll try what explodes on
{
...
if (!noirqdebug)
note_interrupt(irq, desc, retval);
if ( (retval & IRQ_HANDLED) )
atomic_inc(&desc->threads_handled);
}
and in 'note_interrupt()'
handled = atomic_read(&desc->threads_handled);
if ( desc->threads_handled_last == handled ) {
action_ret = IRQ_NONE;
} else {
action_ret = IRQ_HANDLED;
desc->threads_handled_last = handled;
}
Either way - I'm not sure what deferral does to the part of the algorithm
in note_interrupt() which deals with misrouted interrupts since the
'action_ret' that goes into try_misrouted_irq() is delayed by one interrupt
cycle.
one of my affected machines.
2) note_interrupt is also called from irq/chip.c:handle_nested_irq() and IThat's a different issue. The nested_irq handler is for interrupts
believe
this routine would also need to increment the 'threads_handled' counter
rather
than calling note_interrupt.
which are demultiplexed by a primary threaded handler. That interrupt
is never handled in hard interrupt context. It's always called from
the context of the demultiplxing thread.
Thanks,
tglx