Re: [PATCH] mpt3sas: fix sync irqs

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Sep 10, 2020 at 7:51 PM Tomas Henzl <thenzl@xxxxxxxxxx> wrote:
>
> - _base_process_reply_queue called from _base_interrupt
> may schedule a new irq poll, fix this by calling
> synchronize_irq first
> - a fix for "Unbalanced enable for IRQ..."
> enable_irq should be called only when necessary
>
> Fixes: 320e77acb327 ("scsi: mpt3sas: Irq poll to avoid CPU hard lockups")
> Signed-off-by: Tomas Henzl <thenzl@xxxxxxxxxx>
Acked-by: sreekanth reddy <sreekanth.reddy@xxxxxxxxxxxx>

Thanks,
Sreekanth

> ---
>  drivers/scsi/mpt3sas/mpt3sas_base.c | 14 +++++++++-----
>  drivers/scsi/scsi_scan.c            |  8 ++++++++
>  2 files changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
> index a85c9672c6ea..a67749c8f4ab 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
> @@ -1808,18 +1808,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.4
>



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux