[SCSI] lpfc 8.3.33: Make I/O to hw queue distribution algorithm a module parameter
authorJames Smart <james.smart@emulex.com>
Fri, 3 Aug 2012 16:36:42 +0000 (12:36 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 14 Sep 2012 13:43:46 +0000 (14:43 +0100)
Signed-off-by: James Smart <james.smart@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/lpfc/lpfc.h
drivers/scsi/lpfc/lpfc_attr.c
drivers/scsi/lpfc/lpfc_hw4.h
drivers/scsi/lpfc/lpfc_sli.c

index d9f21fbc4099379d7a3ce3666704c17f032a8967..26bcbfb2a18b264476a321289bd99629e538cf10 100644 (file)
@@ -684,6 +684,7 @@ struct lpfc_hba {
 #define LPFC_FCF_FOV 1         /* Fast fcf failover */
 #define LPFC_FCF_PRIORITY 2    /* Priority fcf failover */
        uint32_t cfg_fcf_failover_policy;
+       uint32_t cfg_fcp_io_sched;
        uint32_t cfg_cr_delay;
        uint32_t cfg_cr_count;
        uint32_t cfg_multi_ring_support;
index f7c5531d984cc96f565fa9e064bc425f62d709e9..2ab2b9f2bff5d8a3af70ab1a74024e0e0582d8a8 100644 (file)
@@ -3777,6 +3777,16 @@ static DEVICE_ATTR(lpfc_max_scsicmpl_time, S_IRUGO | S_IWUSR,
 */
 LPFC_ATTR_R(ack0, 0, 0, 1, "Enable ACK0 support");
 
+/*
+# lpfc_fcp_io_sched: Determine scheduling algrithmn for issuing FCP cmds
+# range is [0,1]. Default value is 0.
+# For [0], FCP commands are issued to Work Queues ina round robin fashion.
+# For [1], FCP commands are issued to a Work Queue associated with the
+#          current CPU.
+*/
+LPFC_ATTR_RW(fcp_io_sched, 0, 0, 1, "Determine scheduling algrithmn for "
+               "issuing commands [0] - Round Robin, [1] - Current CPU");
+
 /*
 # lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing
 # cr_delay (msec) or cr_count outstanding commands. cr_delay can take
@@ -4001,6 +4011,7 @@ struct device_attribute *lpfc_hba_attrs[] = {
        &dev_attr_lpfc_topology,
        &dev_attr_lpfc_scan_down,
        &dev_attr_lpfc_link_speed,
+       &dev_attr_lpfc_fcp_io_sched,
        &dev_attr_lpfc_cr_delay,
        &dev_attr_lpfc_cr_count,
        &dev_attr_lpfc_multi_ring_support,
@@ -4990,6 +5001,7 @@ struct fc_function_template lpfc_vport_transport_functions = {
 void
 lpfc_get_cfgparam(struct lpfc_hba *phba)
 {
+       lpfc_fcp_io_sched_init(phba, lpfc_fcp_io_sched);
        lpfc_cr_delay_init(phba, lpfc_cr_delay);
        lpfc_cr_count_init(phba, lpfc_cr_count);
        lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support);
index 821262d2cf76d80224ab28825c60255d4a149233..45fbfb623ad90e4e80ea2258fa0ca2aad77e9159 100644 (file)
@@ -187,6 +187,10 @@ struct lpfc_sli_intf {
 /* Active interrupt test count */
 #define LPFC_ACT_INTR_CNT      4
 
+/* Algrithmns for scheduling FCP commands to WQs */
+#define        LPFC_FCP_SCHED_ROUND_ROBIN      0
+#define        LPFC_FCP_SCHED_BY_CPU           1
+
 /* Delay Multiplier constant */
 #define LPFC_DMULT_CONST       651042
 
index 0d5dab3da964655e0de35cb8b179ba244912e7b0..d8dbe403c37e6a2998baa92a82ff1b9d189c116c 100644 (file)
@@ -7816,7 +7816,11 @@ lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba)
 {
        int i;
 
-       i = atomic_add_return(1, &phba->fcp_qidx);
+       if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_CPU)
+               i = smp_processor_id();
+       else
+               i = atomic_add_return(1, &phba->fcp_qidx);
+
        i = (i % phba->cfg_fcp_io_channel);
        return i;
 }