Blame SOURCES/0143-scsi-scsi-qla2xxx-Fix-premature-timer-expiration.patch

3d7c23
From d03e239cf7d9d07d5ad186e66164625190fe1f80 Mon Sep 17 00:00:00 2001
3d7c23
From: Himanshu Madhani <hmadhani@redhat.com>
3d7c23
Date: Thu, 21 Nov 2019 16:36:53 -0500
3d7c23
Subject: [PATCH 143/155] [scsi] scsi: qla2xxx: Fix premature timer expiration
3d7c23
3d7c23
Message-id: <20191121163701.43688-19-hmadhani@redhat.com>
3d7c23
Patchwork-id: 287853
3d7c23
O-Subject: [RHLE 7.8 e-stor PATCH v3 18/26] scsi: qla2xxx: Fix premature timer expiration
3d7c23
Bugzilla: 1731581
3d7c23
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
3d7c23
RH-Acked-by: Ewan Milne <emilne@redhat.com>
3d7c23
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
3d7c23
3d7c23
From: Quinn Tran <qutran@marvell.com>
3d7c23
3d7c23
Bugzilla 1731581
3d7c23
3d7c23
For any qla2xxx async command, the SRB buffer is used to send it. In
3d7c23
setting up the SRB buffer, the timer for this command is started before all
3d7c23
memory allocation has finished.  Under low memory pressure, memory alloc
3d7c23
can go to sleep and not wake up before the timer expires. Once timer has
3d7c23
expired, the timer thread will access uninitialize fields resulting into
3d7c23
NULL pointer crash.
3d7c23
3d7c23
This patch fixes this crash by moving the start of timer after everything
3d7c23
is setup.
3d7c23
3d7c23
backtrace shows following
3d7c23
3d7c23
PID: 3720   TASK: ffff996928401040  CPU: 0   COMMAND: "qla2xxx_1_dpc"
3d7c23
0 [ffff99652751b698] __schedule at ffffffff965676c7
3d7c23
1 [ffff99652751b728] schedule at ffffffff96567bc9
3d7c23
2 [ffff99652751b738] schedule_timeout at ffffffff965655e8
3d7c23
3 [ffff99652751b7e0] io_schedule_timeout at ffffffff9656726d
3d7c23
4 [ffff99652751b810] congestion_wait at ffffffff95fd8d12
3d7c23
5 [ffff99652751b870] isolate_migratepages_range at ffffffff95fddaf3
3d7c23
6 [ffff99652751b930] compact_zone at ffffffff95fdde96
3d7c23
7 [ffff99652751b980] compact_zone_order at ffffffff95fde0bc
3d7c23
8 [ffff99652751ba20] try_to_compact_pages at ffffffff95fde481
3d7c23
9 [ffff99652751ba80] __alloc_pages_direct_compact at ffffffff9655cc31
3d7c23
10 [ffff99652751bae0] __alloc_pages_slowpath at ffffffff9655d101
3d7c23
11 [ffff99652751bbd0] __alloc_pages_nodemask at ffffffff95fc0e95
3d7c23
12 [ffff99652751bc80] dma_generic_alloc_coherent at ffffffff95e3217f
3d7c23
13 [ffff99652751bcc8] x86_swiotlb_alloc_coherent at ffffffff95e6b7a1
3d7c23
14 [ffff99652751bcf8] qla2x00_rft_id at ffffffffc055b5e0 [qla2xxx]
3d7c23
15 [ffff99652751bd50] qla2x00_loop_resync at ffffffffc0533e71 [qla2xxx]
3d7c23
16 [ffff99652751be68] qla2x00_do_dpc at ffffffffc05210ca [qla2xxx]
3d7c23
3d7c23
PID: 0      TASK: ffffffff96a18480  CPU: 0   COMMAND: "swapper/0"
3d7c23
 0 [ffff99652fc03ae0] machine_kexec at ffffffff95e63674
3d7c23
 1 [ffff99652fc03b40] __crash_kexec at ffffffff95f1ce12
3d7c23
 2 [ffff99652fc03c10] crash_kexec at ffffffff95f1cf00
3d7c23
 3 [ffff99652fc03c28] oops_end at ffffffff9656c758
3d7c23
 4 [ffff99652fc03c50] no_context at ffffffff9655aa7e
3d7c23
 5 [ffff99652fc03ca0] __bad_area_nosemaphore at ffffffff9655ab15
3d7c23
 6 [ffff99652fc03cf0] bad_area_nosemaphore at ffffffff9655ac86
3d7c23
 7 [ffff99652fc03d00] __do_page_fault at ffffffff9656f6b0
3d7c23
 8 [ffff99652fc03d70] do_page_fault at ffffffff9656f915
3d7c23
 9 [ffff99652fc03da0] page_fault at ffffffff9656b758
3d7c23
    [exception RIP: unknown or invalid address]
3d7c23
    RIP: 0000000000000000  RSP: ffff99652fc03e50  RFLAGS: 00010202
3d7c23
    RAX: 0000000000000000  RBX: ffff99652b79a600  RCX: ffff99652b79a760
3d7c23
    RDX: ffff99652b79a600  RSI: ffffffffc0525ad0  RDI: ffff99652b79a600
3d7c23
    RBP: ffff99652fc03e60   R8: ffffffff96a18a18   R9: ffffffff96ee3c00
3d7c23
    R10: 0000000000000002  R11: ffff99652fc03de8  R12: ffff99652b79a760
3d7c23
    R13: 0000000000000100  R14: ffffffffc0525ad0  R15: ffff99652b79a600
3d7c23
    ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0018
3d7c23
10 [ffff99652fc03e50] qla2x00_sp_timeout at ffffffffc0525af8 [qla2xxx]
3d7c23
11 [ffff99652fc03e68] call_timer_fn at ffffffff95ea7f58
3d7c23
12 [ffff99652fc03ea0] run_timer_softirq at ffffffff95eaa3bd
3d7c23
13 [ffff99652fc03f18] __do_softirq at ffffffff95ea0f05
3d7c23
14 [ffff99652fc03f88] call_softirq at ffffffff9657832c
3d7c23
15 [ffff99652fc03fa0] do_softirq at ffffffff95e2e675
3d7c23
16 [ffff99652fc03fc0] irq_exit at ffffffff95ea1285
3d7c23
17 [ffff99652fc03fd8] smp_apic_timer_interrupt at ffffffff965796c8
3d7c23
18 [ffff99652fc03ff0] apic_timer_interrupt at ffffffff96575df2
3d7c23
3d7c23
Signed-off-by: Quinn Tran <qutran@marvell.com>
3d7c23
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
3d7c23
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
3d7c23
(cherry picked from commit 3a4b6cc7332130ac5cbf3b505d8cddf0aa2ea745)
3d7c23
Signed-off-by: Himanshu Madhani <hmadhani@redhat.com>
3d7c23
Signed-off-by: Jan Stancek <jstancek@redhat.com>
3d7c23
---
3d7c23
 drivers/scsi/qla2xxx/qla_def.h  | 1 +
3d7c23
 drivers/scsi/qla2xxx/qla_iocb.c | 5 ++++-
3d7c23
 2 files changed, 5 insertions(+), 1 deletion(-)
3d7c23
3d7c23
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
3d7c23
index 980e9a914d80..24a4a2bdf6a7 100644
3d7c23
--- a/drivers/scsi/qla2xxx/qla_def.h
3d7c23
+++ b/drivers/scsi/qla2xxx/qla_def.h
3d7c23
@@ -546,6 +546,7 @@ typedef struct srb {
3d7c23
 	wait_queue_head_t nvme_ls_waitq;
3d7c23
 	struct fc_port *fcport;
3d7c23
 	struct scsi_qla_host *vha;
3d7c23
+	unsigned int start_timer:1;
3d7c23
 	uint32_t handle;
3d7c23
 	uint16_t flags;
3d7c23
 	uint16_t type;
3d7c23
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c
3d7c23
index c1f3b7a0f950..05acf2f85895 100644
3d7c23
--- a/drivers/scsi/qla2xxx/qla_iocb.c
3d7c23
+++ b/drivers/scsi/qla2xxx/qla_iocb.c
3d7c23
@@ -2616,7 +2616,7 @@ void qla2x00_init_timer(srb_t *sp, unsigned long tmo)
3d7c23
 	sp->free = qla2x00_sp_free;
3d7c23
 	if (IS_QLAFX00(sp->vha->hw) && (sp->type == SRB_FXIOCB_DCMD))
3d7c23
 		init_completion(&sp->u.iocb_cmd.u.fxiocb.fxiocb_comp);
3d7c23
-	add_timer(&sp->u.iocb_cmd.timer);
3d7c23
+	sp->start_timer = 1;
3d7c23
 }
3d7c23
 
3d7c23
 static void
3d7c23
@@ -3899,6 +3899,9 @@ qla2x00_start_sp(srb_t *sp)
3d7c23
 		break;
3d7c23
 	}
3d7c23
 
3d7c23
+	if (sp->start_timer)
3d7c23
+		add_timer(&sp->u.iocb_cmd.timer);
3d7c23
+
3d7c23
 	wmb();
3d7c23
 	qla2x00_start_iocbs(vha, qp->req);
3d7c23
 done:
3d7c23
-- 
3d7c23
2.13.6
3d7c23