lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 261/757] scsi: mpt3sas: Fix sync irqs
    Date
    From: Tomas Henzl <thenzl@redhat.com>

    [ Upstream commit 45181eab8ba79ed7a41b549f00500c0093828521 ]

    _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: 320e77acb327 ("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>
    ---
    drivers/scsi/mpt3sas/mpt3sas_base.c | 14 +++++++++-----
    1 file changed, 9 insertions(+), 5 deletions(-)

    diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
    index 8062bd99add85..e86682dc34eca 100644
    --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
    +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
    @@ -1809,18 +1809,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));
    }
    }

    --
    2.25.1


    \
     
     \ /
      Last update: 2020-10-27 17:11    [W:2.283 / U:1.640 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site