Message ID | 20180504145011.5752-2-bigeasy@linutronix.de (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
> On May 4, 2018, at 7:50 AM, Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote: > > In commit d2ba5675d899 ("[SCSI] qla2xxx: Disable local-interrupts while > polling for RISC status.") added a local_irq_disable() before invoking > the ->intr_handler callback. The function, which was used in this > callback, did not disable interrupts while acquiring the spin_lock so a > deadlock was possible and this change was one possible solution. > > The function in question was qla2300_intr_handler() and is using > spin_lock_irqsave() since commit 43fac4d97a1a ("[SCSI] qla2xxx: Resolve > a performance issue in interrupt"). > I checked all other ->intr_handler callbacks and all of them use the > irqsave variant so it is safe to remove the local_irq_save() block now. > > Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > --- > drivers/scsi/qla2xxx/qla_inline.h | 4 +--- > 1 file changed, 1 insertion(+), 3 deletions(-) > > diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h > index 37ae0f6d8ae5..bcbdf28bd7b9 100644 > --- a/drivers/scsi/qla2xxx/qla_inline.h > +++ b/drivers/scsi/qla2xxx/qla_inline.h > @@ -58,14 +58,12 @@ qla2x00_debounce_register(volatile uint16_t __iomem *addr) > static inline void > qla2x00_poll(struct rsp_que *rsp) > { > - unsigned long flags; > struct qla_hw_data *ha = rsp->hw; > - local_irq_save(flags); > + > if (IS_P3P_TYPE(ha)) > qla82xx_poll(0, rsp); > else > ha->isp_ops->intr_handler(0, rsp); > - local_irq_restore(flags); > } > > static inline uint8_t * > -- > 2.17.0 > Looks good Acked-by: Himanshu Madhani <himanshu.madhani@cavium.com> Thanks, - Himanshu
Himanshu, >> In commit d2ba5675d899 ("[SCSI] qla2xxx: Disable local-interrupts while >> polling for RISC status.") added a local_irq_disable() before invoking >> the ->intr_handler callback. The function, which was used in this >> callback, did not disable interrupts while acquiring the spin_lock so a >> deadlock was possible and this change was one possible solution. Applied to 4.19/scsi-queue. Thanks!
diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h index 37ae0f6d8ae5..bcbdf28bd7b9 100644 --- a/drivers/scsi/qla2xxx/qla_inline.h +++ b/drivers/scsi/qla2xxx/qla_inline.h @@ -58,14 +58,12 @@ qla2x00_debounce_register(volatile uint16_t __iomem *addr) static inline void qla2x00_poll(struct rsp_que *rsp) { - unsigned long flags; struct qla_hw_data *ha = rsp->hw; - local_irq_save(flags); + if (IS_P3P_TYPE(ha)) qla82xx_poll(0, rsp); else ha->isp_ops->intr_handler(0, rsp); - local_irq_restore(flags); } static inline uint8_t *
In commit d2ba5675d899 ("[SCSI] qla2xxx: Disable local-interrupts while polling for RISC status.") added a local_irq_disable() before invoking the ->intr_handler callback. The function, which was used in this callback, did not disable interrupts while acquiring the spin_lock so a deadlock was possible and this change was one possible solution. The function in question was qla2300_intr_handler() and is using spin_lock_irqsave() since commit 43fac4d97a1a ("[SCSI] qla2xxx: Resolve a performance issue in interrupt"). I checked all other ->intr_handler callbacks and all of them use the irqsave variant so it is safe to remove the local_irq_save() block now. Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- drivers/scsi/qla2xxx/qla_inline.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)