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>
+++ /dev/null
-#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;
-}
-
-
#include <scsi/scsi_dbg.h>
#include <linux/dmi.h>
-#include "kcompat.h"
#include "megaraid_sas_fusion.h"
#include "megaraid_sas.h"
*/
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);
}
/**