Re: [PATCH] PCI/LINK: bw_notification: Do not leave interrupt handler NULL

From: Lukas Wunner
Date: Tue Mar 19 2019 - 15:25:55 EST


On Mon, Mar 18, 2019 at 08:12:04PM -0500, Alexandru Gagniuc wrote:
> A threaded IRQ with a NULL handler does not work with level-triggered
> interrupts. request_threaded_irq() will return an error:
>
> genirq: Threaded irq requested with handler=NULL and !ONESHOT for irq 16
> pcie_bw_notification: probe of 0000:00:1b.0:pcie010 failed with error -22
>
> For level interrupts we need to silence the interrupt before exiting
> the IRQ handler, so just clear the PCI_EXP_LNKSTA_LBMS bit there.
>
> Reported-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
> Signed-off-by: Alexandru Gagniuc <mr.nuke.me@xxxxxxxxx>

I've tested this on my Ivy Bridge MacBook Pro which uses INTx on root and
downstream ports and I'm not seeing probe errors, so:

Tested-by: Lukas Wunner <lukas@xxxxxxxxx>


> @@ -67,8 +77,8 @@ static irqreturn_t pcie_bw_notification_handler(int irq, void *context)
> __pcie_print_link_status(dev, false);
> up_read(&pci_bus_sem);
>
> + pcie_capability_read_word(port, PCI_EXP_LNKSTA, &link_status);
> pcie_update_link_speed(port->subordinate, link_status);
> - pcie_capability_write_word(port, PCI_EXP_LNKSTA, events);
> return IRQ_HANDLED;
> }

I'd suggest leaving the call to pcie_update_link_speed() in
pcie_bw_notification_irq() to avoid the duplicate read of the
Link Status register.

With that addressed,
Reviewed-by: Lukas Wunner <lukas@xxxxxxxxx>

Thanks,

Lukas