Re: [PATCH v4 00/14] qla2xxx: Bug Fixes and updates for target.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 2017-03-15 at 09:48 -0700, Himanshu Madhani wrote:
> o Fixed regression repored by Bart in following patch.
> "qla2xxx: Fix delayed response to command for loop mode/direct connect."

Thanks for having fixed this! BTW, while retesting this patch series I
ran into another (longstanding) bug. Please consider to include the (untested)
patch below in a future patch series.

Bart.


[PATCH] qla2xxx: Avoid using smp_processor_id() where inappropriate

Use queue_work(...) instead of queue_work_on(raw_smp_processor_id(),
...). These two calls have the same effect for workqueues for which
WQ_UNBOUND has not been set. This patch avoids that the following
is reported:

BUG: using smp_processor_id() in preemptible [00000000] code: kworker/u16:0/5
caller is debug_smp_processor_id+0x17/0x20
CPU: 4 PID: 5 Comm: kworker/u16:0 Not tainted 4.11.0-rc2-dbg+ #1
Workqueue: tmr-iblock target_tmr_work [target_core_mod]
Call Trace:
 dump_stack+0x86/0xc3
 check_preemption_disabled+0xe2/0xf0
 debug_smp_processor_id+0x17/0x20
 tcm_qla2xxx_free_cmd+0x92/0xd0 [tcm_qla2xxx]
 tcm_qla2xxx_aborted_task+0x74/0x80 [tcm_qla2xxx]
 transport_cmd_finish_abort+0x54/0x80 [target_core_mod]
 core_tmr_lun_reset+0x38f/0x800 [target_core_mod]
 target_tmr_work+0xdb/0x130 [target_core_mod]
 process_one_work+0x20d/0x6c0
 worker_thread+0x4e/0x4a0
 kthread+0x10c/0x140
 ret_from_fork+0x31/0x40

Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxxxxxx>
---
 drivers/scsi/qla2xxx/qla_target.c  | 14 ++++----------
 drivers/scsi/qla2xxx/tcm_qla2xxx.c |  4 ++--
 2 files changed, 6 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index 0e03ca2ab3e5..8c9906ac9bbc 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -4197,6 +4197,7 @@ static int qlt_handle_cmd_for_atio(struct scsi_qla_host *vha,
 	struct fc_port *sess;
 	struct qla_tgt_cmd *cmd;
 	unsigned long flags;
+	int cpu;
 
 	if (unlikely(tgt->tgt_stop)) {
 		ql_dbg(ql_dbg_io, vha, 0x3061,
@@ -4263,16 +4264,9 @@ static int qlt_handle_cmd_for_atio(struct scsi_qla_host *vha,
 	spin_unlock_irqrestore(&vha->cmd_list_lock, flags);
 
 	INIT_WORK(&cmd->work, qlt_do_work);
-	if (ha->msix_count) {
-		if (cmd->atio.u.isp24.fcp_cmnd.rddata)
-			queue_work_on(smp_processor_id(), qla_tgt_wq,
-			    &cmd->work);
-		else
-			queue_work_on(cmd->se_cmd.cpuid, qla_tgt_wq,
-			    &cmd->work);
-	} else {
-		queue_work(qla_tgt_wq, &cmd->work);
-	}
+	cpu = ha->msix_count && !cmd->atio.u.isp24.fcp_cmnd.rddata ?
+		cmd->se_cmd.cpuid : raw_smp_processor_id();
+	queue_work_on(cpu, qla_tgt_wq, &cmd->work);
 	return 0;
 
 }
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
index 7443e4efa3ae..0f1ee1680eb8 100644
--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c
+++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c
@@ -303,7 +303,7 @@ static void tcm_qla2xxx_free_cmd(struct qla_tgt_cmd *cmd)
 	cmd->trc_flags |= TRC_CMD_DONE;
 
 	INIT_WORK(&cmd->work, tcm_qla2xxx_complete_free);
-	queue_work_on(smp_processor_id(), tcm_qla2xxx_free_wq, &cmd->work);
+	queue_work(tcm_qla2xxx_free_wq, &cmd->work);
 }
 
 /*
@@ -570,7 +570,7 @@ static void tcm_qla2xxx_handle_data(struct qla_tgt_cmd *cmd)
 	cmd->trc_flags |= TRC_DATA_IN;
 	cmd->cmd_in_wq = 1;
 	INIT_WORK(&cmd->work, tcm_qla2xxx_handle_data_work);
-	queue_work_on(smp_processor_id(), tcm_qla2xxx_free_wq, &cmd->work);
+	queue_work(tcm_qla2xxx_free_wq, &cmd->work);
 }
 
 static int tcm_qla2xxx_chk_dif_tags(uint32_t tag)
-- 
2.12.0
��.n��������+%������w��{.n����j�����{ay�ʇڙ���f���h������_�(�階�ݢj"��������G����?���&��




[Index of Archives]     [Linux SCSI]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux