diff mbox series

mpt3sas: Fix timeouts observed while reenabling IRQ

Message ID 20201102072746.27410-1-sreekanth.reddy@broadcom.com (mailing list archive)
State Accepted
Headers show
Series mpt3sas: Fix timeouts observed while reenabling IRQ | expand

Commit Message

Sreekanth Reddy Nov. 2, 2020, 7:27 a.m. UTC
While reenabling the IRQ after irq poll there may be small time
window where HBA firmware has posted some replies and raise the
interrupts but driver has not received the interrupts. So we may
observe IO timeouts as the driver has not processed the replies
as interrupts got missed while reenabling the IRQ.

So, to fix this issue, the driver has to go for one more
round of processing the reply descriptors from reply descriptor
post queue after enabling the IRQ.

Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Reported-by: Tomas Henzl <thenzl@redhat.com>
---
 drivers/scsi/mpt3sas/mpt3sas_base.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Tomas Henzl Nov. 2, 2020, 5:19 p.m. UTC | #1
On 11/2/20 8:27 AM, Sreekanth Reddy wrote:
> While reenabling the IRQ after irq poll there may be small time
> window where HBA firmware has posted some replies and raise the
> interrupts but driver has not received the interrupts. So we may
> observe IO timeouts as the driver has not processed the replies
> as interrupts got missed while reenabling the IRQ.
> 
> So, to fix this issue, the driver has to go for one more
> round of processing the reply descriptors from reply descriptor
> post queue after enabling the IRQ.
> 
> Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
> Reported-by: Tomas Henzl <thenzl@redhat.com>
> ---
>  drivers/scsi/mpt3sas/mpt3sas_base.c | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
> index b096917..a0ab44d 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_base.c
> +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
> @@ -1740,6 +1740,13 @@ _base_irqpoll(struct irq_poll *irqpoll, int budget)
>  		reply_q->irq_poll_scheduled = false;
>  		reply_q->irq_line_enable = true;
>  		enable_irq(reply_q->os_irq);
> +		/*
> +		 * Go for one more round of processing the
> +		 * reply descriptor post queue incase if HBA
> +		 * Firmware has posted some reply descriptors
> +		 * while reenabling the IRQ.
> +		 */
> +		_base_process_reply_queue(reply_q);
>  	}
>  
>  	return num_entries;
> 

I've tested the fix and the system now works.

Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Martin K. Petersen Nov. 3, 2020, 2:01 a.m. UTC | #2
On Mon, 2 Nov 2020 12:57:46 +0530, Sreekanth Reddy wrote:

> While reenabling the IRQ after irq poll there may be small time
> window where HBA firmware has posted some replies and raise the
> interrupts but driver has not received the interrupts. So we may
> observe IO timeouts as the driver has not processed the replies
> as interrupts got missed while reenabling the IRQ.
> 
> So, to fix this issue, the driver has to go for one more
> round of processing the reply descriptors from reply descriptor
> post queue after enabling the IRQ.

Applied to 5.10/scsi-fixes, thanks!

[1/1] scsi: mpt3sas: Fix timeouts observed while reenabling IRQ
      https://git.kernel.org/mkp/scsi/c/5feed64f9199
diff mbox series

Patch

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index b096917..a0ab44d 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -1740,6 +1740,13 @@  _base_irqpoll(struct irq_poll *irqpoll, int budget)
 		reply_q->irq_poll_scheduled = false;
 		reply_q->irq_line_enable = true;
 		enable_irq(reply_q->os_irq);
+		/*
+		 * Go for one more round of processing the
+		 * reply descriptor post queue incase if HBA
+		 * Firmware has posted some reply descriptors
+		 * while reenabling the IRQ.
+		 */
+		_base_process_reply_queue(reply_q);
 	}
 
 	return num_entries;