scsi: qla2xxx: Move sess cmd list/lock to driver
authorMike Christie <michael.christie@oracle.com>
Sun, 1 Nov 2020 18:59:31 +0000 (12:59 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 5 Nov 2020 03:39:37 +0000 (22:39 -0500)
Except for debug output in the shutdown path, tcm_qla2xxx is the only
driver using the se_session sess_cmd_list. Move the list to that driver to
facilitate removing the sess_cmd_lock from the main I/O path for the rest
of the drivers.

Link: https://lore.kernel.org/r/1604257174-4524-6-git-send-email-michael.christie@oracle.com
Cc: Nilesh Javali <njavali@marvell.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_target.c
drivers/scsi/qla2xxx/qla_target.h
drivers/scsi/qla2xxx/tcm_qla2xxx.c

index 4f0486fe30dd7f7386ff29914be89a03c0b25928..ed9b10f8537d6ceecba1a39df71c2d2387fa418c 100644 (file)
@@ -2493,6 +2493,8 @@ typedef struct fc_port {
        int generation;
 
        struct se_session *se_sess;
+       struct list_head sess_cmd_list;
+       spinlock_t sess_cmd_lock;
        struct kref sess_kref;
        struct qla_tgt *tgt;
        unsigned long expires;
index 898c70b8ebbf6a726a0b65d01a6c7485e77220d2..5626e9b6949fc4fb5d71fec32a6098137b3152f9 100644 (file)
@@ -4974,6 +4974,9 @@ qla2x00_alloc_fcport(scsi_qla_host_t *vha, gfp_t flags)
        INIT_LIST_HEAD(&fcport->gnl_entry);
        INIT_LIST_HEAD(&fcport->list);
 
+       INIT_LIST_HEAD(&fcport->sess_cmd_list);
+       spin_lock_init(&fcport->sess_cmd_lock);
+
        return fcport;
 }
 
index f88548b8b84e22849db0c936b4e2f8bba8553b4c..6603caddc0542ccbfe6e7dca15f5df9ea7bd9073 100644 (file)
@@ -4292,6 +4292,7 @@ static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha,
 
        cmd->cmd_type = TYPE_TGT_CMD;
        memcpy(&cmd->atio, atio, sizeof(*atio));
+       INIT_LIST_HEAD(&cmd->sess_cmd_list);
        cmd->state = QLA_TGT_STATE_NEW;
        cmd->tgt = vha->vha_tgt.qla_tgt;
        qlt_incr_num_pend_cmds(vha);
index 1cff7c69d4483d3fdc6d1f57e167900b6f159649..10e5e6c8087dc8993f6a64d3239b9b6e77074c48 100644 (file)
@@ -856,6 +856,7 @@ struct qla_tgt_cmd {
        uint8_t cmd_type;
        uint8_t pad[7];
        struct se_cmd se_cmd;
+       struct list_head sess_cmd_list;
        struct fc_port *sess;
        struct qla_qpair *qpair;
        uint32_t reset_count;
index f5a91bf8be947476214cc6096a785f39a2b47b0f..e122da98eda71a6131caed77f00d300532eaccaf 100644 (file)
@@ -255,6 +255,7 @@ static void tcm_qla2xxx_free_mcmd(struct qla_tgt_mgmt_cmd *mcmd)
 static void tcm_qla2xxx_complete_free(struct work_struct *work)
 {
        struct qla_tgt_cmd *cmd = container_of(work, struct qla_tgt_cmd, work);
+       unsigned long flags;
 
        cmd->cmd_in_wq = 0;
 
@@ -265,6 +266,10 @@ static void tcm_qla2xxx_complete_free(struct work_struct *work)
        cmd->trc_flags |= TRC_CMD_FREE;
        cmd->cmd_sent_to_fw = 0;
 
+       spin_lock_irqsave(&cmd->sess->sess_cmd_lock, flags);
+       list_del_init(&cmd->sess_cmd_list);
+       spin_unlock_irqrestore(&cmd->sess->sess_cmd_lock, flags);
+
        transport_generic_free_cmd(&cmd->se_cmd, 0);
 }
 
@@ -451,13 +456,14 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, struct qla_tgt_cmd *cmd,
        struct se_portal_group *se_tpg;
        struct tcm_qla2xxx_tpg *tpg;
 #endif
-       int flags = TARGET_SCF_ACK_KREF;
+       int target_flags = TARGET_SCF_ACK_KREF;
+       unsigned long flags;
 
        if (bidi)
-               flags |= TARGET_SCF_BIDI_OP;
+               target_flags |= TARGET_SCF_BIDI_OP;
 
        if (se_cmd->cpuid != WORK_CPU_UNBOUND)
-               flags |= TARGET_SCF_USE_CPUID;
+               target_flags |= TARGET_SCF_USE_CPUID;
 
        sess = cmd->sess;
        if (!sess) {
@@ -479,11 +485,15 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, struct qla_tgt_cmd *cmd,
                return 0;
        }
 #endif
-
        cmd->qpair->tgt_counters.qla_core_sbt_cmd++;
+
+       spin_lock_irqsave(&sess->sess_cmd_lock, flags);
+       list_add_tail(&cmd->sess_cmd_list, &sess->sess_cmd_list);
+       spin_unlock_irqrestore(&sess->sess_cmd_lock, flags);
+
        return target_submit_cmd(se_cmd, se_sess, cdb, &cmd->sense_buffer[0],
-                               cmd->unpacked_lun, data_length, fcp_task_attr,
-                               data_dir, flags);
+                                cmd->unpacked_lun, data_length, fcp_task_attr,
+                                data_dir, target_flags);
 }
 
 static void tcm_qla2xxx_handle_data_work(struct work_struct *work)
@@ -617,25 +627,20 @@ static int tcm_qla2xxx_handle_tmr(struct qla_tgt_mgmt_cmd *mcmd, u64 lun,
 static struct qla_tgt_cmd *tcm_qla2xxx_find_cmd_by_tag(struct fc_port *sess,
     uint64_t tag)
 {
-       struct qla_tgt_cmd *cmd = NULL;
-       struct se_cmd *secmd;
+       struct qla_tgt_cmd *cmd;
        unsigned long flags;
 
        if (!sess->se_sess)
                return NULL;
 
-       spin_lock_irqsave(&sess->se_sess->sess_cmd_lock, flags);
-       list_for_each_entry(secmd, &sess->se_sess->sess_cmd_list, se_cmd_list) {
-               /* skip task management functions, including tmr->task_cmd */
-               if (secmd->se_cmd_flags & SCF_SCSI_TMR_CDB)
-                       continue;
-
-               if (secmd->tag == tag) {
-                       cmd = container_of(secmd, struct qla_tgt_cmd, se_cmd);
-                       break;
-               }
+       spin_lock_irqsave(&sess->sess_cmd_lock, flags);
+       list_for_each_entry(cmd, &sess->sess_cmd_list, sess_cmd_list) {
+               if (cmd->se_cmd.tag == tag)
+                       goto done;
        }
-       spin_unlock_irqrestore(&sess->se_sess->sess_cmd_lock, flags);
+       cmd = NULL;
+done:
+       spin_unlock_irqrestore(&sess->sess_cmd_lock, flags);
 
        return cmd;
 }
@@ -765,11 +770,19 @@ static void tcm_qla2xxx_queue_tm_rsp(struct se_cmd *se_cmd)
 
 static void tcm_qla2xxx_aborted_task(struct se_cmd *se_cmd)
 {
-       struct qla_tgt_cmd *cmd = container_of(se_cmd,
-                               struct qla_tgt_cmd, se_cmd);
+       struct qla_tgt_cmd *cmd;
+       unsigned long flags;
 
-       if (qlt_abort_cmd(cmd))
+       if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB)
                return;
+
+       cmd  = container_of(se_cmd, struct qla_tgt_cmd, se_cmd);
+
+       spin_lock_irqsave(&cmd->sess->sess_cmd_lock, flags);
+       list_del_init(&cmd->sess_cmd_list);
+       spin_unlock_irqrestore(&cmd->sess->sess_cmd_lock, flags);
+
+       qlt_abort_cmd(cmd);
 }
 
 static void tcm_qla2xxx_clear_sess_lookup(struct tcm_qla2xxx_lport *,