Re: PCI: MSI interrupts masked using prohibited method

!MAILaRCHIVE_VOTE_RePLACE
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: David Vrabel <david.vrabel@...>
Cc: Jesse Barnes <jbarnes@...>, Kernel development list <linux-kernel@...>, Ingo Molnar <mingo@...>, Thomas Gleixner <tglx@...>
Date: Thursday, July 17, 2008 - 11:39 am

On Thu, Jul 17, 2008 at 02:14:40PM +0100, David Vrabel wrote:

Yes it is, but we don't touch that bit at this time.

When we enable MSIs, we set the INTx disable bit (or at least do a write
to it ... as Krzysztof Halasa pointed out, not all devices implement
this bit).  When we mask MSIs, we clear the MSI enable bit.  So a device
conforming to PCI 2.3 has both INTx and MSI disabled.  Unfortunately, a
device conforming to PCI 2.2 has MSI disabled and INTx implicitly
re-enabled.  Oops.


Maybe so, but we don't control that.  Here's the flow that leads to
the problem you've observed (note: only x86-64 analysed here, other
architectures may vary):

The mask_msi_irq() function is the heart of what's going on.  This is
set to be the ->mask() function pointer in the MSI irq_chip struct.

The device generates an MSI interrupt.
Some magic happens in assembly, and the processor ends up in do_IRQ()
which calls generic_handle_irq().  Because it's an MSI IRQ,
handle_edge_irq() is called instead of __do_IRQ().

There are two opportunities for calling the ->mask() here, one is:

        if (unlikely((desc->status & (IRQ_INPROGRESS | IRQ_DISABLED)) ||
                    !desc->action)) {
                desc->status |= (IRQ_PENDING | IRQ_MASKED);
                mask_ack_irq(desc, irq);

The other is:

                if (unlikely(!action)) {
                        desc->chip->mask(irq);

This is all in generic code which knows nothing about any device-specific
method of masking interrupts from the chip.


This is a good thought, let's follow it through.  What if we simply make
->mask a no-op for devices which don't support mask bits?

MSIs are 'edge triggered' interrupts.  They're sent once and then
forgotten by the hardware (as opposed to level triggered which will
continue to be triggered until deasserted).

The first time through (assuming ->action is non-NULL ...), we won't
try to mask the irq.  The second time through, IRQ_INPROGRESS will be set,
so we try to mask_ack_irq().

How about we simply don't ack the irq at this point?  That should prevent
it being triggered again, right?

Working on a patch to do this now ...

-- 
Intel are signing my paycheques ... these opinions are still mine
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours.  We can't possibly take such
a retrograde step."
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
PCI: MSI interrupts masked using prohibited method, David Vrabel, (Tue Jun 24, 6:46 am)
Re: PCI: MSI interrupts masked using prohibited method, Jesse Barnes, (Wed Jun 25, 5:20 pm)
Re: PCI: MSI interrupts masked using prohibited method, David Vrabel, (Fri Jun 27, 8:17 am)
Re: PCI: MSI interrupts masked using prohibited method, Jesse Barnes, (Fri Jun 27, 1:07 pm)
Re: PCI: MSI interrupts masked using prohibited method, Jesse Barnes, (Wed Jul 16, 3:43 pm)
Re: PCI: MSI interrupts masked using prohibited method, Matthew Wilcox, (Wed Jul 16, 3:58 pm)
Re: PCI: MSI interrupts masked using prohibited method, David Vrabel, (Thu Jul 17, 9:14 am)
Re: PCI: MSI interrupts masked using prohibited method, Matthew Wilcox, (Thu Jul 17, 11:39 am)
Re: PCI: MSI interrupts masked using prohibited method, Thomas Gleixner, (Thu Jul 17, 11:58 am)
Re: PCI: MSI interrupts masked using prohibited method, Matthew Wilcox, (Thu Jul 17, 12:56 pm)
Re: PCI: MSI interrupts masked using prohibited method, Matthew Wilcox, (Thu Jul 17, 12:11 pm)
Re: PCI: MSI interrupts masked using prohibited method, Thomas Gleixner, (Thu Jul 17, 1:04 pm)
Re: PCI: MSI interrupts masked using prohibited method, Krzysztof Halasa, (Thu Jul 17, 8:16 am)
Re: PCI: MSI interrupts masked using prohibited method, Matthew Wilcox, (Thu Jul 17, 8:43 am)
Re: PCI: MSI interrupts masked using prohibited method, David Miller, (Wed Jul 16, 4:35 pm)