Commit 49aa143d authored by James Smart's avatar James Smart Committed by James Bottomley

[SCSI] lpfc 8.3.33: Make I/O to hw queue distribution algorithm a module parameter

Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 4305f183
...@@ -684,6 +684,7 @@ struct lpfc_hba { ...@@ -684,6 +684,7 @@ struct lpfc_hba {
#define LPFC_FCF_FOV 1 /* Fast fcf failover */ #define LPFC_FCF_FOV 1 /* Fast fcf failover */
#define LPFC_FCF_PRIORITY 2 /* Priority fcf failover */ #define LPFC_FCF_PRIORITY 2 /* Priority fcf failover */
uint32_t cfg_fcf_failover_policy; uint32_t cfg_fcf_failover_policy;
uint32_t cfg_fcp_io_sched;
uint32_t cfg_cr_delay; uint32_t cfg_cr_delay;
uint32_t cfg_cr_count; uint32_t cfg_cr_count;
uint32_t cfg_multi_ring_support; uint32_t cfg_multi_ring_support;
......
...@@ -3777,6 +3777,16 @@ static DEVICE_ATTR(lpfc_max_scsicmpl_time, S_IRUGO | S_IWUSR, ...@@ -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_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 # lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing
# cr_delay (msec) or cr_count outstanding commands. cr_delay can take # cr_delay (msec) or cr_count outstanding commands. cr_delay can take
...@@ -4001,6 +4011,7 @@ struct device_attribute *lpfc_hba_attrs[] = { ...@@ -4001,6 +4011,7 @@ struct device_attribute *lpfc_hba_attrs[] = {
&dev_attr_lpfc_topology, &dev_attr_lpfc_topology,
&dev_attr_lpfc_scan_down, &dev_attr_lpfc_scan_down,
&dev_attr_lpfc_link_speed, &dev_attr_lpfc_link_speed,
&dev_attr_lpfc_fcp_io_sched,
&dev_attr_lpfc_cr_delay, &dev_attr_lpfc_cr_delay,
&dev_attr_lpfc_cr_count, &dev_attr_lpfc_cr_count,
&dev_attr_lpfc_multi_ring_support, &dev_attr_lpfc_multi_ring_support,
...@@ -4990,6 +5001,7 @@ struct fc_function_template lpfc_vport_transport_functions = { ...@@ -4990,6 +5001,7 @@ struct fc_function_template lpfc_vport_transport_functions = {
void void
lpfc_get_cfgparam(struct lpfc_hba *phba) 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_delay_init(phba, lpfc_cr_delay);
lpfc_cr_count_init(phba, lpfc_cr_count); lpfc_cr_count_init(phba, lpfc_cr_count);
lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support); lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support);
......
...@@ -187,6 +187,10 @@ struct lpfc_sli_intf { ...@@ -187,6 +187,10 @@ struct lpfc_sli_intf {
/* Active interrupt test count */ /* Active interrupt test count */
#define LPFC_ACT_INTR_CNT 4 #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 */ /* Delay Multiplier constant */
#define LPFC_DMULT_CONST 651042 #define LPFC_DMULT_CONST 651042
......
...@@ -7816,7 +7816,11 @@ lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba) ...@@ -7816,7 +7816,11 @@ lpfc_sli4_scmd_to_wqidx_distr(struct lpfc_hba *phba)
{ {
int i; 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); i = (i % phba->cfg_fcp_io_channel);
return i; return i;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment