* [PATCH 0/2 V2] enable/disable IRQD_NO_BALANCING during reset
@ 2025-10-28 14:24 wenxiong
2025-10-28 14:24 ` [PATCH 1/2 V2] scsi/ipr: " wenxiong
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: wenxiong @ 2025-10-28 14:24 UTC (permalink / raw)
To: njavali, brking, linux-scsi; +Cc: wenxiong, Wen Xiong
From: Wen Xiong <wenxiong@linux.ibm.com>
Issue is:
Dynamic remove/add storage adapter(SCSI IPR and FC Qlogic) test
hits EEH on Powerpc.
This patchset fixes the issue with enable/disable IRQD_NO_BALANCING
during adapter reset in both of ipr and qla2xxx drivers.
V2: fixes the complier issue on x86 platform.
Wen Xiong (2):
scsi/ipr: enable/disable IRQD_NO_BALANCING during reset
scsi/qla2xxx: enable/disable IRQD_NO_BALANCING during reset
drivers/scsi/ipr.c | 28 +++++++++++++++++++++++++++-
drivers/scsi/qla2xxx/qla_os.c | 30 ++++++++++++++++++++++++++++++
2 files changed, 57 insertions(+), 1 deletion(-)
--
2.47.3
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/2 V2] scsi/ipr: enable/disable IRQD_NO_BALANCING during reset
2025-10-28 14:24 [PATCH 0/2 V2] enable/disable IRQD_NO_BALANCING during reset wenxiong
@ 2025-10-28 14:24 ` wenxiong
2025-10-28 14:24 ` [PATCH 2/2 V2] scsi/qla2xxx: " wenxiong
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: wenxiong @ 2025-10-28 14:24 UTC (permalink / raw)
To: njavali, brking, linux-scsi; +Cc: wenxiong, Wen Xiong, Kyle Mahlkuch
From: Wen Xiong <wenxiong@linux.ibm.com>
Issue is:
Dynamic remove/add storage adapter(SCSI IPR and FC Qlogic) test
hits EEH on Powerpc.
EEH: [c00000000004f75c] __eeh_send_failure_event+0x7c/0x160
EEH: [c000000000048444] eeh_dev_check_failure.part.0+0x254/0x650
EEH: [c008000001650678] eeh_readl+0x60/0x90 [ipr]
EEH: [c00800000166746c] ipr_cancel_op+0x2b8/0x524 [ipr]
EEH: [c008000001656524] ipr_eh_abort+0x6c/0x130 [ipr]
EEH: [c000000000ab0d20] scmd_eh_abort_handler+0x140/0x440
EEH: [c00000000017e558] process_one_work+0x298/0x590
EEH: [c00000000017eef8] worker_thread+0xa8/0x620
EEH: [c00000000018be34] kthread+0x124/0x130
EEH: [c00000000000cd64] ret_from_kernel_thread+0x5c/0x64
We took a pcie bus trace and found out that a vector of msix is
cleared to 0 by irqbalance daemon. If we disable irqbalance
daemon, we won't see the issue on both of adapters.
We enabled debug in ipr driver,
[ 44.103071] ipr: Entering __ipr_remove
[ 44.103083] ipr: Entering ipr_initiate_ioa_bringdown
[ 44.103091] ipr: Entering ipr_reset_shutdown_ioa
[ 44.103099] ipr: Leaving ipr_reset_shutdown_ioa
[ 44.103105] ipr: Leaving ipr_initiate_ioa_bringdown
[ 44.149918] ipr: Entering ipr_reset_ucode_download
[ 44.149935] ipr: Entering ipr_reset_alert
[ 44.150032] ipr: Entering ipr_reset_start_timer
[ 44.150038] ipr: Leaving ipr_reset_alert
[ 44.244343] scsi 1:2:3:0: alua: Detached
[ 44.254300] ipr: Entering ipr_reset_start_bist
[ 44.254320] ipr: Entering ipr_reset_start_timer
[ 44.254325] ipr: Leaving ipr_reset_start_bist
[ 44.364329] scsi 1:2:4:0: alua: Detached
[ 45.134341] scsi 1:2:5:0: alua: Detached
[ 45.860949] ipr: Entering ipr_reset_shutdown_ioa
[ 45.860962] ipr: Leaving ipr_reset_shutdown_ioa
[ 45.860966] ipr: Entering ipr_reset_alert
[ 45.861028] ipr: Entering ipr_reset_start_timer
[ 45.861035] ipr: Leaving ipr_reset_alert
[ 45.964302] ipr: Entering ipr_reset_start_bist
[ 45.964309] ipr: Entering ipr_reset_start_timer
[ 45.964313] ipr: Leaving ipr_reset_start_bist
[ 46.264301] ipr: Entering ipr_reset_bist_done
[ 46.264309] ipr: Leaving ipr_reset_bist_done
During adapter reset, ipr device driver blocks config space access but
can't block MMIO access for msix entries.
There is very small window: irqbalance daemon kicks in during adapter
reset before ipr driver calls pci_restore_state(pdev) to restore msix
table.
irqbalance daemon reads back all 0 for that msix vector
in __pci_read_msi_msg().
irqbalance daemon:
msi_domain_set_affinity()
->irq_chip_set_affinity_patent()
->xive_irq_set_affinity()
->irq_chip_compose_msi_msg()
->pseries_msi_compose_msg()
->__pci_read_msi_msg(): read all 0 since didn't call pci_restore_state
->irq_chip_write_msi_msg()
-> pci_write_msg_msi(): write 0 to the msix vector entry
When ipr driver call pci_restore_state(pdev) in
ipr_reset_restore_cfg_space(), the msix vector entry
has been cleared by irqbalance daemon in pci_write_msg_msix().
pci_restore_state()
->__pci_restore_msix_state()
Below is the MSIX table for ipr adapter after 'irqbalance"
dameon kicked in during adapter reset
Dump MSIx table: index=0 address_lo=c800 address_hi=10000000 msg_data=0
Dump MSIx table: index=1 address_lo=c810 address_hi=10000000 msg_data=0
Dump MSIx table: index=2 address_lo=c820 address_hi=10000000 msg_data=0
Dump MSIx table: index=3 address_lo=c830 address_hi=10000000 msg_data=0
Dump MSIx table: index=4 address_lo=c840 address_hi=10000000 msg_data=0
Dump MSIx table: index=5 address_lo=c850 address_hi=10000000 msg_data=0
Dump MSIx table: index=6 address_lo=c860 address_hi=10000000 msg_data=0
Dump MSIx table: index=7 address_lo=c870 address_hi=10000000 msg_data=0
Dump MSIx table: index=8 address_lo=0 address_hi=0 msg_data=0
---------> Hit EEH since msix vector of index=8 are 0
Dump MSIx table: index=9 address_lo=c890 address_hi=10000000 msg_data=0
Dump MSIx table: index=10 address_lo=c8a0 address_hi=10000000 msg_data=0
Dump MSIx table: index=11 address_lo=c8b0 address_hi=10000000 msg_data=0
Dump MSIx table: index=12 address_lo=c8c0 address_hi=10000000 msg_data=0
Dump MSIx table: index=13 address_lo=c8d0 address_hi=10000000 msg_data=0
Dump MSIx table: index=14 address_lo=c8e0 address_hi=10000000 msg_data=0
Dump MSIx table: index=15 address_lo=c8f0 address_hi=10000000 msg_data=0
[ 46.264312] ipr: Entering ipr_reset_restore_cfg_space
[ 46.267439] ipr: Entering ipr_fail_all_ops
[ 46.267447] ipr: Leaving ipr_fail_all_ops
[ 46.267451] ipr: Leaving ipr_reset_restore_cfg_space
[ 46.267454] ipr: Entering ipr_ioa_bringdown_done
[ 46.267458] ipr: Leaving ipr_ioa_bringdown_done
[ 46.267467] ipr: Entering ipr_worker_thread
[ 46.267470] ipr: Leaving ipr_worker_thread
We don't need to do irq balance during adapter reset.
This patch is enabled "IRQ_NO_BALANCING" bit before starting adapter
reset and disabled it after calling pci_restore_state(). irqbalance
daemon is disabled for this period of short time(~2s);
Thanks,
Wendy
Signed-off-by: Wen Xiong <wenxiong@linux.ibm.com>
Signed-off-by: Kyle Mahlkuch <Kyle.Mahlkuch@ibm.com>
---
drivers/scsi/ipr.c | 28 +++++++++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c
index 4fb5654472d8..4eaca8777630 100644
--- a/drivers/scsi/ipr.c
+++ b/drivers/scsi/ipr.c
@@ -61,8 +61,8 @@
#include <linux/hdreg.h>
#include <linux/reboot.h>
#include <linux/stringify.h>
+#include <linux/irq.h>
#include <asm/io.h>
-#include <asm/irq.h>
#include <asm/processor.h>
#include <scsi/scsi.h>
#include <scsi/scsi_host.h>
@@ -7843,6 +7843,30 @@ static int ipr_dump_mailbox_wait(struct ipr_cmnd *ipr_cmd)
return IPR_RC_JOB_RETURN;
}
+/**
+ * ipr_set_affinity_nobalance
+ * @ioa_cfg: ipr_ioa_cfg struct for an ipr device
+ * @flag: bool
+ * true: ensable "IRQ_NO_BALANCING" bit for msix interrupt
+ * false: disable "IRQ_NO_BALANCING" bit for msix interrupt
+ * Description: This function will be called to disable/enable
+ * "IRQ_NO_BALANCING" to avoid irqbalance daemon
+ * kicking in during adapter reset.
+ **/
+static void ipr_set_affinity_nobalance(struct ipr_ioa_cfg *ioa_cfg, bool flag)
+{
+ int irq, i;
+
+ for (i = 0; i < ioa_cfg->nvectors; i++) {
+ irq = pci_irq_vector(ioa_cfg->pdev, i);
+
+ if (flag)
+ irq_set_status_flags(irq, IRQ_NO_BALANCING);
+ else
+ irq_clear_status_flags(irq, IRQ_NO_BALANCING);
+ }
+}
+
/**
* ipr_reset_restore_cfg_space - Restore PCI config space.
* @ipr_cmd: ipr command struct
@@ -7867,6 +7891,7 @@ static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
return IPR_RC_JOB_CONTINUE;
}
+ ipr_set_affinity_nobalance(ioa_cfg, false);
ipr_fail_all_ops(ioa_cfg);
if (ioa_cfg->sis64) {
@@ -7946,6 +7971,7 @@ static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd)
rc = pci_write_config_byte(ioa_cfg->pdev, PCI_BIST, PCI_BIST_START);
if (rc == PCIBIOS_SUCCESSFUL) {
+ ipr_set_affinity_nobalance(ioa_cfg, true);
ipr_cmd->job_step = ipr_reset_bist_done;
ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
rc = IPR_RC_JOB_RETURN;
--
2.47.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/2 V2] scsi/qla2xxx: enable/disable IRQD_NO_BALANCING during reset
2025-10-28 14:24 [PATCH 0/2 V2] enable/disable IRQD_NO_BALANCING during reset wenxiong
2025-10-28 14:24 ` [PATCH 1/2 V2] scsi/ipr: " wenxiong
@ 2025-10-28 14:24 ` wenxiong
2025-11-29 21:33 ` [PATCH 0/2 V2] " Martin K. Petersen
2025-12-09 3:21 ` Martin K. Petersen
3 siblings, 0 replies; 5+ messages in thread
From: wenxiong @ 2025-10-28 14:24 UTC (permalink / raw)
To: njavali, brking, linux-scsi; +Cc: wenxiong, Wen Xiong, Kyle Mahlkuch
From: Wen Xiong <wenxiong@linux.ibm.com>
Issue is:
Dynamic remove/add of FC Qlogic storage adapters test hits EEH on Powerpc.
EEH: [c00000000004f77c] __eeh_send_failure_event+0x7c/0x160
EEH: [c000000000048464] eeh_dev_check_failure.part.0+0x254/0x660
EEH: [c000000000934e0c] __pci_read_msi_msg+0x1ac/0x280
EEH: [c000000000100f68] pseries_msi_compose_msg+0x28/0x40
EEH: [c00000000020e1cc] irq_chip_compose_msi_msg+0x5c/0x90
EEH: [c000000000214b1c] msi_domain_set_affinity+0xbc/0x100
EEH: [c000000000206be4] irq_do_set_affinity+0x214/0x2c0
EEH: [c000000000206e04] irq_set_affinity_locked+0x174/0x230
EEH: [c000000000207044] irq_set_affinity+0x64/0xa0
EEH: [c000000000212890] write_irq_affinity.constprop.0.isra.0+0x130/0x150
EEH: [c00000000068868c] proc_reg_write+0xfc/0x160
EEH: [c0000000005adb48] vfs_write+0xf8/0x4e0
EEH: [c0000000005ae234] ksys_write+0x84/0x140
EEH: [c00000000002e994] system_call_exception+0x164/0x310
EEH: [c00000000000bfe8] system_call_vectored_common+0xe8/0x278
We see that irqbalance daemon kicks in before invoking qla2xxx->slot_reset
during the EEH recovery process.
irqbalance daemon
->irq_set_affinity()
->msi_domain_set_affinity()
->irq_chip_set_affiinity_parent()
->xive_irq_set_affinity()
->pseries_msi_compose_ms()
->__pci_read_msi_msg()
->irq_chip_compose_msi_msg()
In __pci_read_msi_msg(), we see the first msix vector is set to all F by the
irqbalance daemon.
pci_write_msg_msix: index=0, lo=ffffffff hi=fffffff
We tried disabling the irqbalance daemon, then ran the DLPAR remove/add
test and the test completed succesfully.
We don't need to do irq balance during adapter reset.
This patch enables "IRQ_NO_BALANCING" bit before starting adapter
reset and disables the bit after calling pci_restore_state(). The irqbalance
daemon is disabled for this short period of ~2s.
Thanks,
Kyle
Signed-off-by: Kyle Mahlkuch <Kyle.Mahlkuch@ibm.com>
Signed-off-by: Wen Xiong <wenxiong@linux.ibm.com>
---
drivers/scsi/qla2xxx/qla_os.c | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 9a2f328200ab..c5e91f5779e8 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -17,6 +17,7 @@
#include <linux/crash_dump.h>
#include <linux/trace_events.h>
#include <linux/trace.h>
+#include <linux/irq.h>
#include <scsi/scsi_tcq.h>
#include <scsi/scsicam.h>
@@ -7771,6 +7772,31 @@ static void qla_pci_error_cleanup(scsi_qla_host_t *vha)
}
+/**
+ * qla2xxx_set_affinity_nobalance
+ * @pdev: pci_dev struct for a qla2xxx device
+ * @flag: bool
+ * true: enable "IRQ_NO_BALANCING" bit for msix interrupt
+ * false: disable "IRQ_NO_BALANCING" bit for msix interrupt
+ * Description: This function will be called to disable/enable
+ * "IRQ_NO_BALANCING" to avoid irqbalance daemon
+ * kicking in during adapter reset.
+ **/
+
+static void qla2xxx_set_affinity_nobalance(struct pci_dev *pdev, bool flag)
+{
+ int irq, i;
+
+ for (i = 0; i < QLA_BASE_VECTORS; i++) {
+ irq = pci_irq_vector(pdev, i);
+
+ if (flag)
+ irq_set_status_flags(irq, IRQ_NO_BALANCING);
+ else
+ irq_clear_status_flags(irq, IRQ_NO_BALANCING);
+ }
+}
+
static pci_ers_result_t
qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
{
@@ -7789,6 +7815,8 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
goto out;
}
+ qla2xxx_set_affinity_nobalance(pdev, false);
+
switch (state) {
case pci_channel_io_normal:
qla_pci_set_eeh_busy(vha);
@@ -7935,6 +7963,8 @@ qla2xxx_pci_slot_reset(struct pci_dev *pdev)
ql_dbg(ql_dbg_aer, base_vha, 0x900e,
"Slot Reset returning %x.\n", ret);
+ qla2xxx_set_affinity_nobalance(pdev, true);
+
return ret;
}
--
2.47.3
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 0/2 V2] enable/disable IRQD_NO_BALANCING during reset
2025-10-28 14:24 [PATCH 0/2 V2] enable/disable IRQD_NO_BALANCING during reset wenxiong
2025-10-28 14:24 ` [PATCH 1/2 V2] scsi/ipr: " wenxiong
2025-10-28 14:24 ` [PATCH 2/2 V2] scsi/qla2xxx: " wenxiong
@ 2025-11-29 21:33 ` Martin K. Petersen
2025-12-09 3:21 ` Martin K. Petersen
3 siblings, 0 replies; 5+ messages in thread
From: Martin K. Petersen @ 2025-11-29 21:33 UTC (permalink / raw)
To: wenxiong; +Cc: njavali, brking, linux-scsi, wenxiong
Wen,
> Issue is: Dynamic remove/add storage adapter(SCSI IPR and FC Qlogic)
> test hits EEH on Powerpc.
>
> This patchset fixes the issue with enable/disable IRQD_NO_BALANCING
> during adapter reset in both of ipr and qla2xxx drivers.
Applied to 6.19/scsi-staging, thanks!
--
Martin K. Petersen
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 0/2 V2] enable/disable IRQD_NO_BALANCING during reset
2025-10-28 14:24 [PATCH 0/2 V2] enable/disable IRQD_NO_BALANCING during reset wenxiong
` (2 preceding siblings ...)
2025-11-29 21:33 ` [PATCH 0/2 V2] " Martin K. Petersen
@ 2025-12-09 3:21 ` Martin K. Petersen
3 siblings, 0 replies; 5+ messages in thread
From: Martin K. Petersen @ 2025-12-09 3:21 UTC (permalink / raw)
To: njavali, brking, linux-scsi, wenxiong; +Cc: Martin K . Petersen, wenxiong
On Tue, 28 Oct 2025 09:24:25 -0500, wenxiong@linux.ibm.com wrote:
> Issue is:
> Dynamic remove/add storage adapter(SCSI IPR and FC Qlogic) test
> hits EEH on Powerpc.
>
> This patchset fixes the issue with enable/disable IRQD_NO_BALANCING
> during adapter reset in both of ipr and qla2xxx drivers.
>
> [...]
Applied to 6.19/scsi-queue, thanks!
[1/2] scsi/ipr: enable/disable IRQD_NO_BALANCING during reset
https://git.kernel.org/mkp/scsi/c/6ac3484fb13b
[2/2] scsi/qla2xxx: enable/disable IRQD_NO_BALANCING during reset
https://git.kernel.org/mkp/scsi/c/eaea513077cd
--
Martin K. Petersen
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-12-09 3:21 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-28 14:24 [PATCH 0/2 V2] enable/disable IRQD_NO_BALANCING during reset wenxiong
2025-10-28 14:24 ` [PATCH 1/2 V2] scsi/ipr: " wenxiong
2025-10-28 14:24 ` [PATCH 2/2 V2] scsi/qla2xxx: " wenxiong
2025-11-29 21:33 ` [PATCH 0/2 V2] " Martin K. Petersen
2025-12-09 3:21 ` Martin K. Petersen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox