scsi: mpt3sas: Fix sync irqs
[ Upstream commit45181eab8b
] _base_process_reply_queue() called from _base_interrupt() may schedule a new irq poll. Fix this by calling synchronize_irq() first. Also ensure that enable_irq() is called only when necessary to avoid "Unbalanced enable for IRQ..." errors. Link: https://lore.kernel.org/r/20200910142126.8147-1-thenzl@redhat.com Fixes:320e77acb3
("scsi: mpt3sas: Irq poll to avoid CPU hard lockups") Acked-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com> Signed-off-by: Tomas Henzl <thenzl@redhat.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
e757a39c2d
commit
148b49be72
|
@ -1708,18 +1708,22 @@ mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc)
|
|||
/* TMs are on msix_index == 0 */
|
||||
if (reply_q->msix_index == 0)
|
||||
continue;
|
||||
synchronize_irq(pci_irq_vector(ioc->pdev, reply_q->msix_index));
|
||||
if (reply_q->irq_poll_scheduled) {
|
||||
/* Calling irq_poll_disable will wait for any pending
|
||||
* callbacks to have completed.
|
||||
*/
|
||||
irq_poll_disable(&reply_q->irqpoll);
|
||||
irq_poll_enable(&reply_q->irqpoll);
|
||||
reply_q->irq_poll_scheduled = false;
|
||||
reply_q->irq_line_enable = true;
|
||||
enable_irq(reply_q->os_irq);
|
||||
continue;
|
||||
/* check how the scheduled poll has ended,
|
||||
* clean up only if necessary
|
||||
*/
|
||||
if (reply_q->irq_poll_scheduled) {
|
||||
reply_q->irq_poll_scheduled = false;
|
||||
reply_q->irq_line_enable = true;
|
||||
enable_irq(reply_q->os_irq);
|
||||
}
|
||||
}
|
||||
synchronize_irq(pci_irq_vector(ioc->pdev, reply_q->msix_index));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue