]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
scsi: megaraid_sas: fix the wrong way to get irq number
authorJianchao Wang <jianchao.w.wang@oracle.com>
Fri, 3 Aug 2018 05:32:43 +0000 (13:32 +0800)
committerBrian Maly <brian.maly@oracle.com>
Wed, 15 Aug 2018 21:30:54 +0000 (17:30 -0400)
Customer's machine report following warning log:
WARNING: CPU: 7 PID: 934 at drivers/scsi/megaraid/kcompat.h:14 megasas_sync_irqs+0x7a/0x90 [megaraid_sas]()
...
CPU: 7 PID: 934 Comm: scsi_eh_0 Not tainted 4.1.12-112.14.2.el6uek.x86_64 #2
Hardware name: Dell Inc. PowerEdge M630/0R10KJ, BIOS 2.6.0 10/27/2017
Call Trace:
 [<ffffffff816eb150>] dump_stack+0x63/0x83
 [<ffffffff81086f25>] warn_slowpath_common+0x95/0xe0
 [<ffffffff81086f8a>] warn_slowpath_null+0x1a/0x20
 [<ffffffffa031a8ca>] megasas_sync_irqs+0x7a/0x90 [megaraid_sas]
 [<ffffffffa031e2d0>] megasas_reset_fusion+0xd0/0x8b0 [megaraid_sas]
 [<ffffffffa0314cbe>] megasas_reset_bus_host+0x8e/0x210 [megaraid_sas]
 [<ffffffff814ca1e6>] scsi_try_host_reset+0x56/0x120
 [<ffffffff814cd649>] scsi_eh_host_reset+0x59/0x180
 [<ffffffff814cd804>] scsi_eh_ready_devs+0x94/0x100
 [<ffffffff814cd97d>] scsi_unjam_host+0x10d/0x230
 [<ffffffff814cdc28>] scsi_error_handler+0x188/0x210
 [<ffffffff810a72de>] kthread+0xce/0xf0
 [<ffffffff816f11a2>] ret_from_fork+0x42/0x70

This is introduced by the 490515384dc4 (scsi: megaraid_sas: Use
synchronize_irq to wait for IRQs to complete). The introduced
pci_irq_vector() compatibility wrapper did not take all interrupt
delivery methods into account. We should use the instance->msixentry[]
to get the irq number for the case of instance->msix_vectors > 0.

Orabug: 28436426

Fixes: 490515384dc4 (scsi: megaraid_sas: Use synchronize_irq to wait for IRQs to complete)
Signed-off-by: Jianchao Wang <jianchao.w.wang@oracle.com>
Cc: Somasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
Cc: Jack Vogel <jack.vogel@oracle.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/scsi/megaraid/kcompat.h [deleted file]
drivers/scsi/megaraid/megaraid_sas_fusion.c

diff --git a/drivers/scsi/megaraid/kcompat.h b/drivers/scsi/megaraid/kcompat.h
deleted file mode 100644 (file)
index f5cd941..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef _KCOMPAT_H_
-#define _KCOMPAT_H_
-#endif
-
-#ifndef LINUX_VERSION_CODE
-#include <linux/version.h>
-#else
-#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
-#endif
-
-
-static inline int pci_irq_vector(struct pci_dev *dev, unsigned int nr)
-{
-       if (WARN_ON_ONCE(nr > 0))
-               return -EINVAL;
-       return dev->irq;
-}
-
-
index 6ab1f7f737c0052e5eca457ae78196dc4310d646..1987284fcd0cac43f174b1d4371175bdd086b11d 100644 (file)
@@ -56,7 +56,6 @@
 #include <scsi/scsi_dbg.h>
 #include <linux/dmi.h>
 
-#include "kcompat.h"
 #include "megaraid_sas_fusion.h"
 #include "megaraid_sas.h"
 
@@ -3486,14 +3485,15 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex)
  */
 void megasas_sync_irqs(unsigned long instance_addr)
 {
-       u32 count, i;
        struct megasas_instance *instance =
                (struct megasas_instance *)instance_addr;
+       int i;
 
-       count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
-
-       for (i = 0; i < count; i++)
-               synchronize_irq(pci_irq_vector(instance->pdev, i));
+       if (instance->msix_vectors)
+               for (i = 0; i < instance->msix_vectors; i++)
+                       synchronize_irq(instance->msixentry[i].vector);
+       else
+               synchronize_irq(instance->pdev->irq);
 }
 
 /**