Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

scsi: qla2xxx: Enable/disable IRQD_NO_BALANCING during reset

A dynamic remove/add storage adapter 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

The 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(), the first MSI-X vector is set to all F by the
irqbalance daemon. pci_write_msg_msix: index=0, lo=ffffffff hi=fffffff

IRQ balancing is not required during adapter reset.

Enable "IRQ_NO_BALANCING" bit before starting adapter reset and disable
it calling pci_restore_state(). The irqbalance daemon is disabled for
this short period of time (~2s).

Co-developed-by: Kyle Mahlkuch <Kyle.Mahlkuch@ibm.com>
Signed-off-by: Kyle Mahlkuch <Kyle.Mahlkuch@ibm.com>
Signed-off-by: Wen Xiong <wenxiong@linux.ibm.com>
Link: https://patch.msgid.link/20251028142427.3969819-3-wenxiong@linux.ibm.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Wen Xiong and committed by
Martin K. Petersen
eaea5130 6ac3484f

+30
+30
drivers/scsi/qla2xxx/qla_os.c
··· 17 17 #include <linux/crash_dump.h> 18 18 #include <linux/trace_events.h> 19 19 #include <linux/trace.h> 20 + #include <linux/irq.h> 20 21 21 22 #include <scsi/scsi_tcq.h> 22 23 #include <scsi/scsicam.h> ··· 7777 7776 } 7778 7777 7779 7778 7779 + /** 7780 + * qla2xxx_set_affinity_nobalance 7781 + * @pdev: pci_dev struct for a qla2xxx device 7782 + * @flag: bool 7783 + * true: enable "IRQ_NO_BALANCING" bit for msix interrupt 7784 + * false: disable "IRQ_NO_BALANCING" bit for msix interrupt 7785 + * Description: This function will be called to disable/enable 7786 + * "IRQ_NO_BALANCING" to avoid irqbalance daemon 7787 + * kicking in during adapter reset. 7788 + **/ 7789 + 7790 + static void qla2xxx_set_affinity_nobalance(struct pci_dev *pdev, bool flag) 7791 + { 7792 + int irq, i; 7793 + 7794 + for (i = 0; i < QLA_BASE_VECTORS; i++) { 7795 + irq = pci_irq_vector(pdev, i); 7796 + 7797 + if (flag) 7798 + irq_set_status_flags(irq, IRQ_NO_BALANCING); 7799 + else 7800 + irq_clear_status_flags(irq, IRQ_NO_BALANCING); 7801 + } 7802 + } 7803 + 7780 7804 static pci_ers_result_t 7781 7805 qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state) 7782 7806 { ··· 7819 7793 ret = PCI_ERS_RESULT_NEED_RESET; 7820 7794 goto out; 7821 7795 } 7796 + 7797 + qla2xxx_set_affinity_nobalance(pdev, false); 7822 7798 7823 7799 switch (state) { 7824 7800 case pci_channel_io_normal: ··· 7962 7934 exit_slot_reset: 7963 7935 ql_dbg(ql_dbg_aer, base_vha, 0x900e, 7964 7936 "Slot Reset returning %x.\n", ret); 7937 + 7938 + qla2xxx_set_affinity_nobalance(pdev, true); 7965 7939 7966 7940 return ret; 7967 7941 }