Skip to content

Commit 43fac4d

Browse files
Anirban ChakrabortyJames Bottomley
authored andcommitted
[SCSI] qla2xxx: Resolve a performance issue in interrupt
Reverted back a change in qla*_intr_handler code that caused an increase in cpu cycles by allowing interrupts to occur while the instance hardware lock was being held. Fix by taking the lock in irqsave mode. Reported-and-tested-by: Douglas W. Styner <[email protected]> Signed-off-by: Anirban Chakraborty <[email protected]> Signed-off-by: James Bottomley <[email protected]>
1 parent babdb78 commit 43fac4d

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

drivers/scsi/qla2xxx/qla_isr.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ qla2100_intr_handler(int irq, void *dev_id)
3737
uint16_t hccr;
3838
uint16_t mb[4];
3939
struct rsp_que *rsp;
40+
unsigned long flags;
4041

4142
rsp = (struct rsp_que *) dev_id;
4243
if (!rsp) {
@@ -49,7 +50,7 @@ qla2100_intr_handler(int irq, void *dev_id)
4950
reg = &ha->iobase->isp;
5051
status = 0;
5152

52-
spin_lock(&ha->hardware_lock);
53+
spin_lock_irqsave(&ha->hardware_lock, flags);
5354
vha = pci_get_drvdata(ha->pdev);
5455
for (iter = 50; iter--; ) {
5556
hccr = RD_REG_WORD(&reg->hccr);
@@ -101,7 +102,7 @@ qla2100_intr_handler(int irq, void *dev_id)
101102
RD_REG_WORD(&reg->hccr);
102103
}
103104
}
104-
spin_unlock(&ha->hardware_lock);
105+
spin_unlock_irqrestore(&ha->hardware_lock, flags);
105106

106107
if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
107108
(status & MBX_INTERRUPT) && ha->flags.mbox_int) {
@@ -133,6 +134,7 @@ qla2300_intr_handler(int irq, void *dev_id)
133134
uint16_t mb[4];
134135
struct rsp_que *rsp;
135136
struct qla_hw_data *ha;
137+
unsigned long flags;
136138

137139
rsp = (struct rsp_que *) dev_id;
138140
if (!rsp) {
@@ -145,7 +147,7 @@ qla2300_intr_handler(int irq, void *dev_id)
145147
reg = &ha->iobase->isp;
146148
status = 0;
147149

148-
spin_lock(&ha->hardware_lock);
150+
spin_lock_irqsave(&ha->hardware_lock, flags);
149151
vha = pci_get_drvdata(ha->pdev);
150152
for (iter = 50; iter--; ) {
151153
stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
@@ -216,7 +218,7 @@ qla2300_intr_handler(int irq, void *dev_id)
216218
WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
217219
RD_REG_WORD_RELAXED(&reg->hccr);
218220
}
219-
spin_unlock(&ha->hardware_lock);
221+
spin_unlock_irqrestore(&ha->hardware_lock, flags);
220222

221223
if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
222224
(status & MBX_INTERRUPT) && ha->flags.mbox_int) {
@@ -1626,6 +1628,7 @@ qla24xx_intr_handler(int irq, void *dev_id)
16261628
uint32_t hccr;
16271629
uint16_t mb[4];
16281630
struct rsp_que *rsp;
1631+
unsigned long flags;
16291632

16301633
rsp = (struct rsp_que *) dev_id;
16311634
if (!rsp) {
@@ -1638,7 +1641,7 @@ qla24xx_intr_handler(int irq, void *dev_id)
16381641
reg = &ha->iobase->isp24;
16391642
status = 0;
16401643

1641-
spin_lock(&ha->hardware_lock);
1644+
spin_lock_irqsave(&ha->hardware_lock, flags);
16421645
vha = pci_get_drvdata(ha->pdev);
16431646
for (iter = 50; iter--; ) {
16441647
stat = RD_REG_DWORD(&reg->host_status);
@@ -1688,7 +1691,7 @@ qla24xx_intr_handler(int irq, void *dev_id)
16881691
WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
16891692
RD_REG_DWORD_RELAXED(&reg->hccr);
16901693
}
1691-
spin_unlock(&ha->hardware_lock);
1694+
spin_unlock_irqrestore(&ha->hardware_lock, flags);
16921695

16931696
if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) &&
16941697
(status & MBX_INTERRUPT) && ha->flags.mbox_int) {

0 commit comments

Comments
 (0)