Message ID | 20230330085357.2653599-17-damien.lemoal@opensource.wdc.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | PCI endpoint fixes and improvements | expand |
On Thu, Mar 30, 2023 at 05:53:56PM +0900, Damien Le Moal wrote: > pci_endpoint_test_irqhandler() always rewrites the status register when > an IRQ is raised, either as-is if STATUS_IRQ_RAISED is not set, or with > STATUS_IRQ_RAISED cleared if that flag is set. The first case creates a > race window with the endpoint side, meaning that the host side test > driver may end up reading what it just wrote, thus loosing the real > status as set by the endpoint side before raising the next interrupt. > This can prevent detecting that the STATUS_IRQ_RAISED flag was set by > the endpoint. s/loosing/losing/
diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_test.c index 24efe3b88a1f..afd2577261f8 100644 --- a/drivers/misc/pci_endpoint_test.c +++ b/drivers/misc/pci_endpoint_test.c @@ -159,10 +159,7 @@ static irqreturn_t pci_endpoint_test_irqhandler(int irq, void *dev_id) if (reg & STATUS_IRQ_RAISED) { test->last_irq = irq; complete(&test->irq_raised); - reg &= ~STATUS_IRQ_RAISED; } - pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_STATUS, - reg); return IRQ_HANDLED; }