Re: better leve triggered IRQ management needed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Apr 24, 2006 at 12:02:47PM -0700, Linus Torvalds wrote:
> On Mon, 24 Apr 2006, Stephen Hemminger wrote:
> > We should fail request_irq() if the SA_SHIRQ but the irq is edge-triggered.
> 
> That would be HORRIBLE.
> 
> Edge-triggered works perfectly fine for SA_SHIRQ, as long as there is just 
> one user and the driver is properly written. Making request_irq() fail 
> would break existing and working setups.

Sorry, untrue.  If you take a serial port and a network card on the same
edge triggered interrupt line, take the following sequence of events:

1. serial port receives characters, asserts interrupt.

2. interrupt handlers get called, serial starts reading characters from
   the port.  Interrupt does not change state because there's still
   characters in the FIFO to be read.

3. meanwhile, the network interface receives a packet and asserts it's
   interrupt.  Interrupt does not change state since it's already asserted.

4. serial interrupt handler continues to service serial ports until it is
   damned sure all serial ports have released the interrupt line, and
   returns.  Interrupt does not change state because the network device
   is holding it asserted.

5. network interrupt handler gets invoked next (it's next in the chain)
   but hasn't acknowledged the interrupt.  Hence, the interrupt line has
   remained asserted since step 1.

6. serial port receives another character, asserting it's interrupt output.

7. network interrupt handler services network device.  Network device is
   no longer holding the interrupt line in the asserted state.  But the
   serial device is, so still no change in interrupt line state since
   step 1.

8. all handlers complete, kernel returns to foreground task.

9. No further serial or network interrupts because there's _no_ edge to
   trigger the interrupt.  Your serial and network are dead.

If you allow shared interrupts, no matter how hard you try in a driver,
you can NOT get around this problem.  It has to be handled at a higher
level.

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 Serial core
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux