From: Jianchao Wang Date: Fri, 3 Aug 2018 05:32:43 +0000 (+0800) Subject: scsi: megaraid_sas: fix the wrong way to get irq number X-Git-Tag: v4.1.12-124.31.3~576 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=cf2de3ad6dbf88ac1fa6e8462b50dfbb76312e26;p=users%2Fjedix%2Flinux-maple.git scsi: megaraid_sas: fix the wrong way to get irq number 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: [] dump_stack+0x63/0x83 [] warn_slowpath_common+0x95/0xe0 [] warn_slowpath_null+0x1a/0x20 [] megasas_sync_irqs+0x7a/0x90 [megaraid_sas] [] megasas_reset_fusion+0xd0/0x8b0 [megaraid_sas] [] megasas_reset_bus_host+0x8e/0x210 [megaraid_sas] [] scsi_try_host_reset+0x56/0x120 [] scsi_eh_host_reset+0x59/0x180 [] scsi_eh_ready_devs+0x94/0x100 [] scsi_unjam_host+0x10d/0x230 [] scsi_error_handler+0x188/0x210 [] kthread+0xce/0xf0 [] 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 Cc: Somasundaram Krishnasamy Cc: Jack Vogel Reviewed-by: Martin K. Petersen Signed-off-by: Brian Maly --- diff --git a/drivers/scsi/megaraid/kcompat.h b/drivers/scsi/megaraid/kcompat.h deleted file mode 100644 index f5cd94198934..000000000000 --- a/drivers/scsi/megaraid/kcompat.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef _KCOMPAT_H_ -#define _KCOMPAT_H_ -#endif - -#ifndef LINUX_VERSION_CODE -#include -#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; -} - - diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c index 6ab1f7f737c0..1987284fcd0c 100644 --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c @@ -56,7 +56,6 @@ #include #include -#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); } /**