qla2xxx: Add selective command queuing
authorQuinn Tran <quinn.tran@qlogic.com>
Thu, 17 Dec 2015 19:57:06 +0000 (14:57 -0500)
committerNicholas Bellinger <nab@linux-iscsi.org>
Thu, 7 Jan 2016 21:57:47 +0000 (13:57 -0800)
queue work element to specific process lessen cache miss

Signed-off-by: Quinn Tran <quinn.tran@qlogic.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_target.c
drivers/scsi/qla2xxx/tcm_qla2xxx.c
drivers/target/target_core_transport.c
include/target/target_core_base.h

index cf0fe8e..3e89122 100644 (file)
@@ -3302,7 +3302,7 @@ static void qla_irq_affinity_notify(struct irq_affinity_notify *notify,
        }
 }
 
-void qla_irq_affinity_release(struct kref *ref)
+static void qla_irq_affinity_release(struct kref *ref)
 {
        struct irq_affinity_notify *notify =
                container_of(ref, struct irq_affinity_notify, kref);
index 9a4aed0..d3cd271 100644 (file)
@@ -3982,13 +3982,24 @@ static int qlt_handle_cmd_for_atio(struct scsi_qla_host *vha,
 
        cmd->cmd_in_wq = 1;
        cmd->cmd_flags |= BIT_0;
+       cmd->se_cmd.cpuid = -1;
 
        spin_lock(&vha->cmd_list_lock);
        list_add_tail(&cmd->cmd_list, &vha->qla_cmd_list);
        spin_unlock(&vha->cmd_list_lock);
 
        INIT_WORK(&cmd->work, qlt_do_work);
-       queue_work(qla_tgt_wq, &cmd->work);
+       if (ha->msix_count) {
+               cmd->se_cmd.cpuid = ha->tgt.rspq_vector_cpuid;
+               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);
+       }
        return 0;
 
 }
index 2881509..b44f397 100644 (file)
@@ -299,7 +299,7 @@ static void tcm_qla2xxx_free_cmd(struct qla_tgt_cmd *cmd)
        cmd->vha->tgt_counters.core_qla_free_cmd++;
        cmd->cmd_in_wq = 1;
        INIT_WORK(&cmd->work, tcm_qla2xxx_complete_free);
-       queue_work(tcm_qla2xxx_free_wq, &cmd->work);
+       queue_work_on(smp_processor_id(), tcm_qla2xxx_free_wq, &cmd->work);
 }
 
 /*
@@ -504,7 +504,7 @@ static void tcm_qla2xxx_handle_data(struct qla_tgt_cmd *cmd)
        cmd->cmd_flags |= BIT_10;
        cmd->cmd_in_wq = 1;
        INIT_WORK(&cmd->work, tcm_qla2xxx_handle_data_work);
-       queue_work(tcm_qla2xxx_free_wq, &cmd->work);
+       queue_work_on(smp_processor_id(), tcm_qla2xxx_free_wq, &cmd->work);
 }
 
 static void tcm_qla2xxx_handle_dif_work(struct work_struct *work)
index eae4924..717c73b 100644 (file)
@@ -715,7 +715,10 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status)
        cmd->transport_state |= (CMD_T_COMPLETE | CMD_T_ACTIVE);
        spin_unlock_irqrestore(&cmd->t_state_lock, flags);
 
-       queue_work(target_completion_wq, &cmd->work);
+       if (cmd->cpuid == -1)
+               queue_work(target_completion_wq, &cmd->work);
+       else
+               queue_work_on(cmd->cpuid, target_completion_wq, &cmd->work);
 }
 EXPORT_SYMBOL(target_complete_cmd);
 
index dc8b796..4b258fc 100644 (file)
@@ -528,6 +528,7 @@ struct se_cmd {
        unsigned int            t_prot_nents;
        sense_reason_t          pi_err;
        sector_t                bad_sector;
+       int                     cpuid;
 };
 
 struct se_ua {