[PATCHv2 5/8] ata: sata_dwc_460ex: fix data race on hsdev->sactive_issued in interrupt handler
Rosen Penev <[email protected]>
| Newsgroups | org.kernel.vger.linux-ide,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
hsdev->sactive_issued is written locklessly in sata_dwc_isr() before acquiring host->lock, while sata_dwc_qc_complete() performs a read-modify-write on the same field under the lock. This creates a data race that can corrupt NCQ tag tracking state. Move the zero assignment inside the critical section so all accesses to sactive_issued are serialized by host->lock. Assisted-by: opencode:big-pickle Signed-off-by: Rosen Penev <[email protected]> --- drivers/ata/sata_dwc_460ex.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ata/sata_dwc_460ex.c b/drivers/ata/sata_dwc_460ex.c index 2a28e6655bba..4c54c3ecd18e 100644 --- a/drivers/ata/sata_dwc_460ex.c +++ b/drivers/ata/sata_dwc_460ex.c @@ -467,9 +467,9 @@ static irqreturn_t sata_dwc_isr(int irq, void *dev_instance) int handled, port = 0; uint intpr, sactive, sactive2, tag_mask; struct sata_dwc_device_port *hsdevp; - hsdev->sactive_issued = 0; spin_lock_irqsave(&host->lock, flags); + hsdev->sactive_issued = 0; /* Read the interrupt register */ intpr = sata_dwc_readl(&hsdev->sata_dwc_regs->intpr); -- 2.55.0