summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Smart <jsmart2021@gmail.com>2019-01-28 14:14:31 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2019-02-05 22:29:49 -0500
commit6a828b0f6192b4930894925d1c1d0dc1f1d99e6e (patch)
tree30837f3b1f484f4b6357b173b173e3e3b8672464
parentb3295c2a75333a4d6f0f945c7c148b1c0a453a8f (diff)
scsi: lpfc: Support non-uniform allocation of MSIX vectors to hardware queues
So far MSIX vector allocation assumed it would be 1:1 with hardware queues. However, there are several reasons why fewer MSIX vectors may be allocated than hardware queues such as the platform being out of vectors or adapter limits being less than cpu count. This patch reworks the MSIX/EQ relationships with the per-cpu hardware queues so they can function independently. MSIX vectors will be equitably split been cpu sockets/cores and then the per-cpu hardware queues will be mapped to the vectors most efficient for them. Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <jsmart2021@gmail.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/lpfc/lpfc.h7
-rw-r--r--drivers/scsi/lpfc/lpfc_attr.c96
-rw-r--r--drivers/scsi/lpfc/lpfc_crtn.h1
-rw-r--r--drivers/scsi/lpfc/lpfc_debugfs.c303
-rw-r--r--drivers/scsi/lpfc/lpfc_debugfs.h3
-rw-r--r--drivers/scsi/lpfc/lpfc_hw4.h3
-rw-r--r--drivers/scsi/lpfc/lpfc_init.c503
-rw-r--r--drivers/scsi/lpfc/lpfc_nvme.c18
-rw-r--r--drivers/scsi/lpfc/lpfc_scsi.c28
-rw-r--r--drivers/scsi/lpfc/lpfc_sli.c148
-rw-r--r--drivers/scsi/lpfc/lpfc_sli4.h64
11 files changed, 831 insertions, 343 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h
index 0f8964fdfecf..9fd2811ffa8b 100644
--- a/drivers/scsi/lpfc/lpfc.h
+++ b/drivers/scsi/lpfc/lpfc.h
@@ -84,8 +84,6 @@ struct lpfc_sli2_slim;
84#define LPFC_HB_MBOX_INTERVAL 5 /* Heart beat interval in seconds. */ 84#define LPFC_HB_MBOX_INTERVAL 5 /* Heart beat interval in seconds. */
85#define LPFC_HB_MBOX_TIMEOUT 30 /* Heart beat timeout in seconds. */ 85#define LPFC_HB_MBOX_TIMEOUT 30 /* Heart beat timeout in seconds. */
86 86
87#define LPFC_LOOK_AHEAD_OFF 0 /* Look ahead logic is turned off */
88
89/* Error Attention event polling interval */ 87/* Error Attention event polling interval */
90#define LPFC_ERATT_POLL_INTERVAL 5 /* EATT poll interval in seconds */ 88#define LPFC_ERATT_POLL_INTERVAL 5 /* EATT poll interval in seconds */
91 89
@@ -821,6 +819,7 @@ struct lpfc_hba {
821 uint32_t cfg_fcp_imax; 819 uint32_t cfg_fcp_imax;
822 uint32_t cfg_fcp_cpu_map; 820 uint32_t cfg_fcp_cpu_map;
823 uint32_t cfg_hdw_queue; 821 uint32_t cfg_hdw_queue;
822 uint32_t cfg_irq_chann;
824 uint32_t cfg_suppress_rsp; 823 uint32_t cfg_suppress_rsp;
825 uint32_t cfg_nvme_oas; 824 uint32_t cfg_nvme_oas;
826 uint32_t cfg_nvme_embed_cmd; 825 uint32_t cfg_nvme_embed_cmd;
@@ -1042,6 +1041,9 @@ struct lpfc_hba {
1042 struct dentry *debug_nvmeio_trc; 1041 struct dentry *debug_nvmeio_trc;
1043 struct lpfc_debugfs_nvmeio_trc *nvmeio_trc; 1042 struct lpfc_debugfs_nvmeio_trc *nvmeio_trc;
1044 struct dentry *debug_hdwqinfo; 1043 struct dentry *debug_hdwqinfo;
1044#ifdef LPFC_HDWQ_LOCK_STAT
1045 struct dentry *debug_lockstat;
1046#endif
1045 atomic_t nvmeio_trc_cnt; 1047 atomic_t nvmeio_trc_cnt;
1046 uint32_t nvmeio_trc_size; 1048 uint32_t nvmeio_trc_size;
1047 uint32_t nvmeio_trc_output_idx; 1049 uint32_t nvmeio_trc_output_idx;
@@ -1161,6 +1163,7 @@ struct lpfc_hba {
1161#define LPFC_CHECK_NVME_IO 1 1163#define LPFC_CHECK_NVME_IO 1
1162#define LPFC_CHECK_NVMET_RCV 2 1164#define LPFC_CHECK_NVMET_RCV 2
1163#define LPFC_CHECK_NVMET_IO 4 1165#define LPFC_CHECK_NVMET_IO 4
1166#define LPFC_CHECK_SCSI_IO 8
1164 uint16_t ktime_on; 1167 uint16_t ktime_on;
1165 uint64_t ktime_data_samples; 1168 uint64_t ktime_data_samples;
1166 uint64_t ktime_status_samples; 1169 uint64_t ktime_status_samples;
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
index 787812dd57a9..fc7f80d68638 100644
--- a/drivers/scsi/lpfc/lpfc_attr.c
+++ b/drivers/scsi/lpfc/lpfc_attr.c
@@ -4958,7 +4958,7 @@ lpfc_fcp_imax_store(struct device *dev, struct device_attribute *attr,
4958 phba->cfg_fcp_imax = (uint32_t)val; 4958 phba->cfg_fcp_imax = (uint32_t)val;
4959 phba->initial_imax = phba->cfg_fcp_imax; 4959 phba->initial_imax = phba->cfg_fcp_imax;
4960 4960
4961 for (i = 0; i < phba->cfg_hdw_queue; i += LPFC_MAX_EQ_DELAY_EQID_CNT) 4961 for (i = 0; i < phba->cfg_irq_chann; i += LPFC_MAX_EQ_DELAY_EQID_CNT)
4962 lpfc_modify_hba_eq_delay(phba, i, LPFC_MAX_EQ_DELAY_EQID_CNT, 4962 lpfc_modify_hba_eq_delay(phba, i, LPFC_MAX_EQ_DELAY_EQID_CNT,
4963 val); 4963 val);
4964 4964
@@ -5059,13 +5059,6 @@ lpfc_fcp_cpu_map_show(struct device *dev, struct device_attribute *attr,
5059 phba->cfg_fcp_cpu_map, 5059 phba->cfg_fcp_cpu_map,
5060 phba->sli4_hba.num_online_cpu); 5060 phba->sli4_hba.num_online_cpu);
5061 break; 5061 break;
5062 case 2:
5063 len += snprintf(buf + len, PAGE_SIZE-len,
5064 "fcp_cpu_map: Driver centric mapping (%d): "
5065 "%d online CPUs\n",
5066 phba->cfg_fcp_cpu_map,
5067 phba->sli4_hba.num_online_cpu);
5068 break;
5069 } 5062 }
5070 5063
5071 while (phba->sli4_hba.curr_disp_cpu < phba->sli4_hba.num_present_cpu) { 5064 while (phba->sli4_hba.curr_disp_cpu < phba->sli4_hba.num_present_cpu) {
@@ -5076,35 +5069,35 @@ lpfc_fcp_cpu_map_show(struct device *dev, struct device_attribute *attr,
5076 len += snprintf( 5069 len += snprintf(
5077 buf + len, PAGE_SIZE - len, 5070 buf + len, PAGE_SIZE - len,
5078 "CPU %02d hdwq None " 5071 "CPU %02d hdwq None "
5079 "physid %d coreid %d\n", 5072 "physid %d coreid %d ht %d\n",
5080 phba->sli4_hba.curr_disp_cpu, 5073 phba->sli4_hba.curr_disp_cpu,
5081 cpup->phys_id, 5074 cpup->phys_id,
5082 cpup->core_id); 5075 cpup->core_id, cpup->hyper);
5083 else 5076 else
5084 len += snprintf( 5077 len += snprintf(
5085 buf + len, PAGE_SIZE - len, 5078 buf + len, PAGE_SIZE - len,
5086 "CPU %02d hdwq %04d " 5079 "CPU %02d EQ %04d hdwq %04d "
5087 "physid %d coreid %d\n", 5080 "physid %d coreid %d ht %d\n",
5088 phba->sli4_hba.curr_disp_cpu, 5081 phba->sli4_hba.curr_disp_cpu,
5089 cpup->hdwq, cpup->phys_id, 5082 cpup->eq, cpup->hdwq, cpup->phys_id,
5090 cpup->core_id); 5083 cpup->core_id, cpup->hyper);
5091 } else { 5084 } else {
5092 if (cpup->hdwq == LPFC_VECTOR_MAP_EMPTY) 5085 if (cpup->hdwq == LPFC_VECTOR_MAP_EMPTY)
5093 len += snprintf( 5086 len += snprintf(
5094 buf + len, PAGE_SIZE - len, 5087 buf + len, PAGE_SIZE - len,
5095 "CPU %02d hdwq None " 5088 "CPU %02d hdwq None "
5096 "physid %d coreid %d IRQ %d\n", 5089 "physid %d coreid %d ht %d IRQ %d\n",
5097 phba->sli4_hba.curr_disp_cpu, 5090 phba->sli4_hba.curr_disp_cpu,
5098 cpup->phys_id, 5091 cpup->phys_id,
5099 cpup->core_id, cpup->irq); 5092 cpup->core_id, cpup->hyper, cpup->irq);
5100 else 5093 else
5101 len += snprintf( 5094 len += snprintf(
5102 buf + len, PAGE_SIZE - len, 5095 buf + len, PAGE_SIZE - len,
5103 "CPU %02d hdwq %04d " 5096 "CPU %02d EQ %04d hdwq %04d "
5104 "physid %d coreid %d IRQ %d\n", 5097 "physid %d coreid %d ht %d IRQ %d\n",
5105 phba->sli4_hba.curr_disp_cpu, 5098 phba->sli4_hba.curr_disp_cpu,
5106 cpup->hdwq, cpup->phys_id, 5099 cpup->eq, cpup->hdwq, cpup->phys_id,
5107 cpup->core_id, cpup->irq); 5100 cpup->core_id, cpup->hyper, cpup->irq);
5108 } 5101 }
5109 5102
5110 phba->sli4_hba.curr_disp_cpu++; 5103 phba->sli4_hba.curr_disp_cpu++;
@@ -5146,14 +5139,13 @@ lpfc_fcp_cpu_map_store(struct device *dev, struct device_attribute *attr,
5146# lpfc_fcp_cpu_map: Defines how to map CPUs to IRQ vectors 5139# lpfc_fcp_cpu_map: Defines how to map CPUs to IRQ vectors
5147# for the HBA. 5140# for the HBA.
5148# 5141#
5149# Value range is [0 to 2]. Default value is LPFC_DRIVER_CPU_MAP (2). 5142# Value range is [0 to 1]. Default value is LPFC_HBA_CPU_MAP (1).
5150# 0 - Do not affinitze IRQ vectors 5143# 0 - Do not affinitze IRQ vectors
5151# 1 - Affintize HBA vectors with respect to each HBA 5144# 1 - Affintize HBA vectors with respect to each HBA
5152# (start with CPU0 for each HBA) 5145# (start with CPU0 for each HBA)
5153# 2 - Affintize HBA vectors with respect to the entire driver 5146# This also defines how Hardware Queues are mapped to specific CPUs.
5154# (round robin thru all CPUs across all HBAs)
5155*/ 5147*/
5156static int lpfc_fcp_cpu_map = LPFC_DRIVER_CPU_MAP; 5148static int lpfc_fcp_cpu_map = LPFC_HBA_CPU_MAP;
5157module_param(lpfc_fcp_cpu_map, int, S_IRUGO|S_IWUSR); 5149module_param(lpfc_fcp_cpu_map, int, S_IRUGO|S_IWUSR);
5158MODULE_PARM_DESC(lpfc_fcp_cpu_map, 5150MODULE_PARM_DESC(lpfc_fcp_cpu_map,
5159 "Defines how to map CPUs to IRQ vectors per HBA"); 5151 "Defines how to map CPUs to IRQ vectors per HBA");
@@ -5187,7 +5179,7 @@ lpfc_fcp_cpu_map_init(struct lpfc_hba *phba, int val)
5187 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 5179 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
5188 "3326 lpfc_fcp_cpu_map: %d out of range, using " 5180 "3326 lpfc_fcp_cpu_map: %d out of range, using "
5189 "default\n", val); 5181 "default\n", val);
5190 phba->cfg_fcp_cpu_map = LPFC_DRIVER_CPU_MAP; 5182 phba->cfg_fcp_cpu_map = LPFC_HBA_CPU_MAP;
5191 5183
5192 return 0; 5184 return 0;
5193} 5185}
@@ -5308,7 +5300,7 @@ LPFC_ATTR_R(xri_rebalancing, 1, 0, 1, "Enable/Disable XRI rebalancing");
5308 * CPU. Otherwise, the default 0 (Round Robin) scheduling of FCP/NVME I/Os 5300 * CPU. Otherwise, the default 0 (Round Robin) scheduling of FCP/NVME I/Os
5309 * through WQs will be used. 5301 * through WQs will be used.
5310 */ 5302 */
5311LPFC_ATTR_RW(fcp_io_sched, LPFC_FCP_SCHED_BY_HDWQ, 5303LPFC_ATTR_RW(fcp_io_sched, LPFC_FCP_SCHED_BY_CPU,
5312 LPFC_FCP_SCHED_BY_HDWQ, 5304 LPFC_FCP_SCHED_BY_HDWQ,
5313 LPFC_FCP_SCHED_BY_CPU, 5305 LPFC_FCP_SCHED_BY_CPU,
5314 "Determine scheduling algorithm for " 5306 "Determine scheduling algorithm for "
@@ -5474,18 +5466,18 @@ LPFC_ATTR_RW(nvme_embed_cmd, 1, 0, 2,
5474 "Embed NVME Command in WQE"); 5466 "Embed NVME Command in WQE");
5475 5467
5476/* 5468/*
5477 * lpfc_hdw_queue: Set the number of IO channels the driver 5469 * lpfc_hdw_queue: Set the number of Hardware Queues the driver
5478 * will advertise it supports to the NVME and SCSI layers. This also 5470 * will advertise it supports to the NVME and SCSI layers. This also
5479 * will map to the number of EQ/CQ/WQs the driver will create. 5471 * will map to the number of CQ/WQ pairs the driver will create.
5480 * 5472 *
5481 * The NVME Layer will try to create this many, plus 1 administrative 5473 * The NVME Layer will try to create this many, plus 1 administrative
5482 * hardware queue. The administrative queue will always map to WQ 0 5474 * hardware queue. The administrative queue will always map to WQ 0
5483 * A hardware IO queue maps (qidx) to a specific driver WQ. 5475 * A hardware IO queue maps (qidx) to a specific driver CQ/WQ.
5484 * 5476 *
5485 * 0 = Configure the number of hdw queues to the number of active CPUs. 5477 * 0 = Configure the number of hdw queues to the number of active CPUs.
5486 * 1,64 = Manually specify how many hdw queues to use. 5478 * 1,128 = Manually specify how many hdw queues to use.
5487 * 5479 *
5488 * Value range is [0,64]. Default value is 0. 5480 * Value range is [0,128]. Default value is 0.
5489 */ 5481 */
5490LPFC_ATTR_R(hdw_queue, 5482LPFC_ATTR_R(hdw_queue,
5491 LPFC_HBA_HDWQ_DEF, 5483 LPFC_HBA_HDWQ_DEF,
@@ -5493,6 +5485,22 @@ LPFC_ATTR_R(hdw_queue,
5493 "Set the number of I/O Hardware Queues"); 5485 "Set the number of I/O Hardware Queues");
5494 5486
5495/* 5487/*
5488 * lpfc_irq_chann: Set the number of IRQ vectors that are available
5489 * for Hardware Queues to utilize. This also will map to the number
5490 * of EQ / MSI-X vectors the driver will create. This should never be
5491 * more than the number of Hardware Queues
5492 *
5493 * 0 = Configure number of IRQ Channels to the number of active CPUs.
5494 * 1,128 = Manually specify how many IRQ Channels to use.
5495 *
5496 * Value range is [0,128]. Default value is 0.
5497 */
5498LPFC_ATTR_R(irq_chann,
5499 LPFC_HBA_HDWQ_DEF,
5500 LPFC_HBA_HDWQ_MIN, LPFC_HBA_HDWQ_MAX,
5501 "Set the number of I/O IRQ Channels");
5502
5503/*
5496# lpfc_enable_hba_reset: Allow or prevent HBA resets to the hardware. 5504# lpfc_enable_hba_reset: Allow or prevent HBA resets to the hardware.
5497# 0 = HBA resets disabled 5505# 0 = HBA resets disabled
5498# 1 = HBA resets enabled (default) 5506# 1 = HBA resets enabled (default)
@@ -5533,16 +5541,6 @@ LPFC_ATTR_RW(XLanePriority, 0, 0x0, 0x7f, "CS_CTL for Express Lane Feature.");
5533LPFC_ATTR_R(enable_bg, 0, 0, 1, "Enable BlockGuard Support"); 5541LPFC_ATTR_R(enable_bg, 0, 0, 1, "Enable BlockGuard Support");
5534 5542
5535/* 5543/*
5536# lpfc_fcp_look_ahead: Look ahead for completions in FCP start routine
5537# 0 = disabled (default)
5538# 1 = enabled
5539# Value range is [0,1]. Default value is 0.
5540#
5541# This feature in under investigation and may be supported in the future.
5542*/
5543unsigned int lpfc_fcp_look_ahead = LPFC_LOOK_AHEAD_OFF;
5544
5545/*
5546# lpfc_prot_mask: i 5544# lpfc_prot_mask: i
5547# - Bit mask of host protection capabilities used to register with the 5545# - Bit mask of host protection capabilities used to register with the
5548# SCSI mid-layer 5546# SCSI mid-layer
@@ -5788,6 +5786,7 @@ struct device_attribute *lpfc_hba_attrs[] = {
5788 &dev_attr_lpfc_fcp_imax, 5786 &dev_attr_lpfc_fcp_imax,
5789 &dev_attr_lpfc_fcp_cpu_map, 5787 &dev_attr_lpfc_fcp_cpu_map,
5790 &dev_attr_lpfc_hdw_queue, 5788 &dev_attr_lpfc_hdw_queue,
5789 &dev_attr_lpfc_irq_chann,
5791 &dev_attr_lpfc_suppress_rsp, 5790 &dev_attr_lpfc_suppress_rsp,
5792 &dev_attr_lpfc_nvmet_mrq, 5791 &dev_attr_lpfc_nvmet_mrq,
5793 &dev_attr_lpfc_nvmet_mrq_post, 5792 &dev_attr_lpfc_nvmet_mrq_post,
@@ -6867,6 +6866,7 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
6867 lpfc_nvme_enable_fb_init(phba, lpfc_nvme_enable_fb); 6866 lpfc_nvme_enable_fb_init(phba, lpfc_nvme_enable_fb);
6868 lpfc_nvmet_fb_size_init(phba, lpfc_nvmet_fb_size); 6867 lpfc_nvmet_fb_size_init(phba, lpfc_nvmet_fb_size);
6869 lpfc_hdw_queue_init(phba, lpfc_hdw_queue); 6868 lpfc_hdw_queue_init(phba, lpfc_hdw_queue);
6869 lpfc_irq_chann_init(phba, lpfc_irq_chann);
6870 lpfc_enable_bbcr_init(phba, lpfc_enable_bbcr); 6870 lpfc_enable_bbcr_init(phba, lpfc_enable_bbcr);
6871 lpfc_enable_dpp_init(phba, lpfc_enable_dpp); 6871 lpfc_enable_dpp_init(phba, lpfc_enable_dpp);
6872 6872
@@ -6891,6 +6891,10 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
6891 /* A value of 0 means use the number of CPUs found in the system */ 6891 /* A value of 0 means use the number of CPUs found in the system */
6892 if (phba->cfg_hdw_queue == 0) 6892 if (phba->cfg_hdw_queue == 0)
6893 phba->cfg_hdw_queue = phba->sli4_hba.num_present_cpu; 6893 phba->cfg_hdw_queue = phba->sli4_hba.num_present_cpu;
6894 if (phba->cfg_irq_chann == 0)
6895 phba->cfg_irq_chann = phba->sli4_hba.num_present_cpu;
6896 if (phba->cfg_irq_chann > phba->cfg_hdw_queue)
6897 phba->cfg_irq_chann = phba->cfg_hdw_queue;
6894 6898
6895 phba->cfg_soft_wwnn = 0L; 6899 phba->cfg_soft_wwnn = 0L;
6896 phba->cfg_soft_wwpn = 0L; 6900 phba->cfg_soft_wwpn = 0L;
@@ -6933,6 +6937,10 @@ lpfc_nvme_mod_param_dep(struct lpfc_hba *phba)
6933{ 6937{
6934 if (phba->cfg_hdw_queue > phba->sli4_hba.num_present_cpu) 6938 if (phba->cfg_hdw_queue > phba->sli4_hba.num_present_cpu)
6935 phba->cfg_hdw_queue = phba->sli4_hba.num_present_cpu; 6939 phba->cfg_hdw_queue = phba->sli4_hba.num_present_cpu;
6940 if (phba->cfg_irq_chann > phba->sli4_hba.num_present_cpu)
6941 phba->cfg_irq_chann = phba->sli4_hba.num_present_cpu;
6942 if (phba->cfg_irq_chann > phba->cfg_hdw_queue)
6943 phba->cfg_irq_chann = phba->cfg_hdw_queue;
6936 6944
6937 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME && 6945 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME &&
6938 phba->nvmet_support) { 6946 phba->nvmet_support) {
@@ -6953,11 +6961,11 @@ lpfc_nvme_mod_param_dep(struct lpfc_hba *phba)
6953 } 6961 }
6954 6962
6955 if (!phba->cfg_nvmet_mrq) 6963 if (!phba->cfg_nvmet_mrq)
6956 phba->cfg_nvmet_mrq = phba->cfg_hdw_queue; 6964 phba->cfg_nvmet_mrq = phba->cfg_irq_chann;
6957 6965
6958 /* Adjust lpfc_nvmet_mrq to avoid running out of WQE slots */ 6966 /* Adjust lpfc_nvmet_mrq to avoid running out of WQE slots */
6959 if (phba->cfg_nvmet_mrq > phba->cfg_hdw_queue) { 6967 if (phba->cfg_nvmet_mrq > phba->cfg_irq_chann) {
6960 phba->cfg_nvmet_mrq = phba->cfg_hdw_queue; 6968 phba->cfg_nvmet_mrq = phba->cfg_irq_chann;
6961 lpfc_printf_log(phba, KERN_ERR, LOG_NVME_DISC, 6969 lpfc_printf_log(phba, KERN_ERR, LOG_NVME_DISC,
6962 "6018 Adjust lpfc_nvmet_mrq to %d\n", 6970 "6018 Adjust lpfc_nvmet_mrq to %d\n",
6963 phba->cfg_nvmet_mrq); 6971 phba->cfg_nvmet_mrq);
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h
index 726cd6a7c452..982401c31c12 100644
--- a/drivers/scsi/lpfc/lpfc_crtn.h
+++ b/drivers/scsi/lpfc/lpfc_crtn.h
@@ -440,7 +440,6 @@ extern spinlock_t _dump_buf_lock;
440extern int _dump_buf_done; 440extern int _dump_buf_done;
441extern spinlock_t pgcnt_lock; 441extern spinlock_t pgcnt_lock;
442extern unsigned int pgcnt; 442extern unsigned int pgcnt;
443extern unsigned int lpfc_fcp_look_ahead;
444 443
445/* Interface exported by fabric iocb scheduler */ 444/* Interface exported by fabric iocb scheduler */
446void lpfc_fabric_abort_nport(struct lpfc_nodelist *); 445void lpfc_fabric_abort_nport(struct lpfc_nodelist *);
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c
index 2a2c46766eb6..72076b2cd4ff 100644
--- a/drivers/scsi/lpfc/lpfc_debugfs.c
+++ b/drivers/scsi/lpfc/lpfc_debugfs.c
@@ -378,6 +378,67 @@ skipit:
378 return len; 378 return len;
379} 379}
380 380
381static int lpfc_debugfs_last_xripool;
382
383/**
384 * lpfc_debugfs_common_xri_data - Dump Hardware Queue info to a buffer
385 * @phba: The HBA to gather host buffer info from.
386 * @buf: The buffer to dump log into.
387 * @size: The maximum amount of data to process.
388 *
389 * Description:
390 * This routine dumps the Hardware Queue info from the @phba to @buf up to
391 * @size number of bytes. A header that describes the current hdwq state will be
392 * dumped to @buf first and then info on each hdwq entry will be dumped to @buf
393 * until @size bytes have been dumped or all the hdwq info has been dumped.
394 *
395 * Notes:
396 * This routine will rotate through each configured Hardware Queue each
397 * time called.
398 *
399 * Return Value:
400 * This routine returns the amount of bytes that were dumped into @buf and will
401 * not exceed @size.
402 **/
403static int
404lpfc_debugfs_commonxripools_data(struct lpfc_hba *phba, char *buf, int size)
405{
406 struct lpfc_sli4_hdw_queue *qp;
407 int len = 0;
408 int i, out;
409 unsigned long iflag;
410
411 for (i = 0; i < phba->cfg_hdw_queue; i++) {
412 if (len > (LPFC_DUMP_MULTIXRIPOOL_SIZE - 80))
413 break;
414 qp = &phba->sli4_hba.hdwq[lpfc_debugfs_last_xripool];
415
416 len += snprintf(buf + len, size - len, "HdwQ %d Info ", i);
417 spin_lock_irqsave(&qp->abts_scsi_buf_list_lock, iflag);
418 spin_lock(&qp->abts_nvme_buf_list_lock);
419 spin_lock(&qp->io_buf_list_get_lock);
420 spin_lock(&qp->io_buf_list_put_lock);
421 out = qp->total_io_bufs - (qp->get_io_bufs + qp->put_io_bufs +
422 qp->abts_scsi_io_bufs + qp->abts_nvme_io_bufs);
423 len += snprintf(buf + len, size - len,
424 "tot:%d get:%d put:%d mt:%d "
425 "ABTS scsi:%d nvme:%d Out:%d\n",
426 qp->total_io_bufs, qp->get_io_bufs, qp->put_io_bufs,
427 qp->empty_io_bufs, qp->abts_scsi_io_bufs,
428 qp->abts_nvme_io_bufs, out);
429 spin_unlock(&qp->io_buf_list_put_lock);
430 spin_unlock(&qp->io_buf_list_get_lock);
431 spin_unlock(&qp->abts_nvme_buf_list_lock);
432 spin_unlock_irqrestore(&qp->abts_scsi_buf_list_lock, iflag);
433
434 lpfc_debugfs_last_xripool++;
435 if (lpfc_debugfs_last_xripool >= phba->cfg_hdw_queue)
436 lpfc_debugfs_last_xripool = 0;
437 }
438
439 return len;
440}
441
381/** 442/**
382 * lpfc_debugfs_multixripools_data - Display multi-XRI pools information 443 * lpfc_debugfs_multixripools_data - Display multi-XRI pools information
383 * @phba: The HBA to gather host buffer info from. 444 * @phba: The HBA to gather host buffer info from.
@@ -405,6 +466,17 @@ lpfc_debugfs_multixripools_data(struct lpfc_hba *phba, char *buf, int size)
405 u32 txcmplq_cnt; 466 u32 txcmplq_cnt;
406 char tmp[LPFC_DEBUG_OUT_LINE_SZ] = {0}; 467 char tmp[LPFC_DEBUG_OUT_LINE_SZ] = {0};
407 468
469 if (phba->sli_rev != LPFC_SLI_REV4)
470 return 0;
471
472 if (!phba->sli4_hba.hdwq)
473 return 0;
474
475 if (!phba->cfg_xri_rebalancing) {
476 i = lpfc_debugfs_commonxripools_data(phba, buf, size);
477 return i;
478 }
479
408 /* 480 /*
409 * Pbl: Current number of free XRIs in public pool 481 * Pbl: Current number of free XRIs in public pool
410 * Pvt: Current number of free XRIs in private pool 482 * Pvt: Current number of free XRIs in private pool
@@ -498,10 +570,12 @@ lpfc_debugfs_multixripools_data(struct lpfc_hba *phba, char *buf, int size)
498 return strnlen(buf, size); 570 return strnlen(buf, size);
499} 571}
500 572
501static int lpfc_debugfs_last_hdwq; 573
574#ifdef LPFC_HDWQ_LOCK_STAT
575static int lpfc_debugfs_last_lock;
502 576
503/** 577/**
504 * lpfc_debugfs_hdwqinfo_data - Dump Hardware Queue info to a buffer 578 * lpfc_debugfs_lockstat_data - Dump Hardware Queue info to a buffer
505 * @phba: The HBA to gather host buffer info from. 579 * @phba: The HBA to gather host buffer info from.
506 * @buf: The buffer to dump log into. 580 * @buf: The buffer to dump log into.
507 * @size: The maximum amount of data to process. 581 * @size: The maximum amount of data to process.
@@ -521,12 +595,11 @@ static int lpfc_debugfs_last_hdwq;
521 * not exceed @size. 595 * not exceed @size.
522 **/ 596 **/
523static int 597static int
524lpfc_debugfs_hdwqinfo_data(struct lpfc_hba *phba, char *buf, int size) 598lpfc_debugfs_lockstat_data(struct lpfc_hba *phba, char *buf, int size)
525{ 599{
526 struct lpfc_sli4_hdw_queue *qp; 600 struct lpfc_sli4_hdw_queue *qp;
527 int len = 0; 601 int len = 0;
528 int i, out; 602 int i;
529 unsigned long iflag;
530 603
531 if (phba->sli_rev != LPFC_SLI_REV4) 604 if (phba->sli_rev != LPFC_SLI_REV4)
532 return 0; 605 return 0;
@@ -535,35 +608,40 @@ lpfc_debugfs_hdwqinfo_data(struct lpfc_hba *phba, char *buf, int size)
535 return 0; 608 return 0;
536 609
537 for (i = 0; i < phba->cfg_hdw_queue; i++) { 610 for (i = 0; i < phba->cfg_hdw_queue; i++) {
538 if (len > (LPFC_HDWQINFO_SIZE - 80)) 611 if (len > (LPFC_HDWQINFO_SIZE - 100))
539 break; 612 break;
540 qp = &phba->sli4_hba.hdwq[lpfc_debugfs_last_hdwq]; 613 qp = &phba->sli4_hba.hdwq[lpfc_debugfs_last_lock];
541 614
542 len += snprintf(buf + len, size - len, "HdwQ %d Info ", i); 615 len += snprintf(buf + len, size - len, "HdwQ %03d Lock ", i);
543 spin_lock_irqsave(&qp->abts_scsi_buf_list_lock, iflag); 616 if (phba->cfg_xri_rebalancing) {
544 spin_lock(&qp->abts_nvme_buf_list_lock); 617 len += snprintf(buf + len, size - len,
545 spin_lock(&qp->io_buf_list_get_lock); 618 "get_pvt:%d mv_pvt:%d "
546 spin_lock(&qp->io_buf_list_put_lock); 619 "mv2pub:%d mv2pvt:%d "
547 out = qp->total_io_bufs - (qp->get_io_bufs + qp->put_io_bufs + 620 "put_pvt:%d put_pub:%d wq:%d\n",
548 qp->abts_scsi_io_bufs + qp->abts_nvme_io_bufs); 621 qp->lock_conflict.alloc_pvt_pool,
549 len += snprintf(buf + len, size - len, 622 qp->lock_conflict.mv_from_pvt_pool,
550 "tot:%d get:%d put:%d mt:%d " 623 qp->lock_conflict.mv_to_pub_pool,
551 "ABTS scsi:%d nvme:%d Out:%d\n", 624 qp->lock_conflict.mv_to_pvt_pool,
552 qp->total_io_bufs, qp->get_io_bufs, qp->put_io_bufs, 625 qp->lock_conflict.free_pvt_pool,
553 qp->empty_io_bufs, qp->abts_scsi_io_bufs, 626 qp->lock_conflict.free_pub_pool,
554 qp->abts_nvme_io_bufs, out); 627 qp->lock_conflict.wq_access);
555 spin_unlock(&qp->io_buf_list_put_lock); 628 } else {
556 spin_unlock(&qp->io_buf_list_get_lock); 629 len += snprintf(buf + len, size - len,
557 spin_unlock(&qp->abts_nvme_buf_list_lock); 630 "get:%d put:%d free:%d wq:%d\n",
558 spin_unlock_irqrestore(&qp->abts_scsi_buf_list_lock, iflag); 631 qp->lock_conflict.alloc_xri_get,
632 qp->lock_conflict.alloc_xri_put,
633 qp->lock_conflict.free_xri,
634 qp->lock_conflict.wq_access);
635 }
559 636
560 lpfc_debugfs_last_hdwq++; 637 lpfc_debugfs_last_lock++;
561 if (lpfc_debugfs_last_hdwq >= phba->cfg_hdw_queue) 638 if (lpfc_debugfs_last_lock >= phba->cfg_hdw_queue)
562 lpfc_debugfs_last_hdwq = 0; 639 lpfc_debugfs_last_lock = 0;
563 } 640 }
564 641
565 return len; 642 return len;
566} 643}
644#endif
567 645
568static int lpfc_debugfs_last_hba_slim_off; 646static int lpfc_debugfs_last_hba_slim_off;
569 647
@@ -964,7 +1042,7 @@ lpfc_debugfs_nvmestat_data(struct lpfc_vport *vport, char *buf, int size)
964 struct lpfc_nvme_lport *lport; 1042 struct lpfc_nvme_lport *lport;
965 uint64_t data1, data2, data3; 1043 uint64_t data1, data2, data3;
966 uint64_t tot, totin, totout; 1044 uint64_t tot, totin, totout;
967 int cnt, i, maxch; 1045 int cnt, i;
968 int len = 0; 1046 int len = 0;
969 1047
970 if (phba->nvmet_support) { 1048 if (phba->nvmet_support) {
@@ -1106,10 +1184,6 @@ lpfc_debugfs_nvmestat_data(struct lpfc_vport *vport, char *buf, int size)
1106 atomic_read(&lport->fc4NvmeLsRequests), 1184 atomic_read(&lport->fc4NvmeLsRequests),
1107 atomic_read(&lport->fc4NvmeLsCmpls)); 1185 atomic_read(&lport->fc4NvmeLsCmpls));
1108 1186
1109 if (phba->cfg_hdw_queue < LPFC_HBA_HDWQ_MAX)
1110 maxch = phba->cfg_hdw_queue;
1111 else
1112 maxch = LPFC_HBA_HDWQ_MAX;
1113 totin = 0; 1187 totin = 0;
1114 totout = 0; 1188 totout = 0;
1115 for (i = 0; i < phba->cfg_hdw_queue; i++) { 1189 for (i = 0; i < phba->cfg_hdw_queue; i++) {
@@ -1547,7 +1621,7 @@ lpfc_debugfs_cpucheck_data(struct lpfc_vport *vport, char *buf, int size)
1547{ 1621{
1548 struct lpfc_hba *phba = vport->phba; 1622 struct lpfc_hba *phba = vport->phba;
1549 struct lpfc_sli4_hdw_queue *qp; 1623 struct lpfc_sli4_hdw_queue *qp;
1550 int i, j; 1624 int i, j, max_cnt;
1551 int len = 0; 1625 int len = 0;
1552 uint32_t tot_xmt; 1626 uint32_t tot_xmt;
1553 uint32_t tot_rcv; 1627 uint32_t tot_rcv;
@@ -1565,6 +1639,7 @@ lpfc_debugfs_cpucheck_data(struct lpfc_vport *vport, char *buf, int size)
1565 } else { 1639 } else {
1566 len += snprintf(buf + len, PAGE_SIZE - len, "\n"); 1640 len += snprintf(buf + len, PAGE_SIZE - len, "\n");
1567 } 1641 }
1642 max_cnt = size - LPFC_DEBUG_OUT_LINE_SZ;
1568 1643
1569 for (i = 0; i < phba->cfg_hdw_queue; i++) { 1644 for (i = 0; i < phba->cfg_hdw_queue; i++) {
1570 qp = &phba->sli4_hba.hdwq[i]; 1645 qp = &phba->sli4_hba.hdwq[i];
@@ -1606,6 +1681,11 @@ lpfc_debugfs_cpucheck_data(struct lpfc_vport *vport, char *buf, int size)
1606 } 1681 }
1607 len += snprintf(buf + len, PAGE_SIZE - len, 1682 len += snprintf(buf + len, PAGE_SIZE - len,
1608 "Total: %x\n", tot_xmt); 1683 "Total: %x\n", tot_xmt);
1684 if (len >= max_cnt) {
1685 len += snprintf(buf + len, PAGE_SIZE - len,
1686 "Truncated ...\n");
1687 return len;
1688 }
1609 } 1689 }
1610 return len; 1690 return len;
1611} 1691}
@@ -1904,11 +1984,8 @@ lpfc_debugfs_multixripools_open(struct inode *inode, struct file *file)
1904 goto out; 1984 goto out;
1905 } 1985 }
1906 1986
1907 if (phba->cfg_xri_rebalancing) 1987 debug->len = lpfc_debugfs_multixripools_data(
1908 debug->len = lpfc_debugfs_multixripools_data( 1988 phba, debug->buffer, LPFC_DUMP_MULTIXRIPOOL_SIZE);
1909 phba, debug->buffer, LPFC_DUMP_MULTIXRIPOOL_SIZE);
1910 else
1911 debug->len = 0;
1912 1989
1913 debug->i_private = inode->i_private; 1990 debug->i_private = inode->i_private;
1914 file->private_data = debug; 1991 file->private_data = debug;
@@ -1918,8 +1995,9 @@ out:
1918 return rc; 1995 return rc;
1919} 1996}
1920 1997
1998#ifdef LPFC_HDWQ_LOCK_STAT
1921/** 1999/**
1922 * lpfc_debugfs_hdwqinfo_open - Open the hdwqinfo debugfs buffer 2000 * lpfc_debugfs_lockstat_open - Open the lockstat debugfs buffer
1923 * @inode: The inode pointer that contains a vport pointer. 2001 * @inode: The inode pointer that contains a vport pointer.
1924 * @file: The file pointer to attach the log output. 2002 * @file: The file pointer to attach the log output.
1925 * 2003 *
@@ -1934,7 +2012,7 @@ out:
1934 * error value. 2012 * error value.
1935 **/ 2013 **/
1936static int 2014static int
1937lpfc_debugfs_hdwqinfo_open(struct inode *inode, struct file *file) 2015lpfc_debugfs_lockstat_open(struct inode *inode, struct file *file)
1938{ 2016{
1939 struct lpfc_hba *phba = inode->i_private; 2017 struct lpfc_hba *phba = inode->i_private;
1940 struct lpfc_debug *debug; 2018 struct lpfc_debug *debug;
@@ -1951,7 +2029,7 @@ lpfc_debugfs_hdwqinfo_open(struct inode *inode, struct file *file)
1951 goto out; 2029 goto out;
1952 } 2030 }
1953 2031
1954 debug->len = lpfc_debugfs_hdwqinfo_data(phba, debug->buffer, 2032 debug->len = lpfc_debugfs_lockstat_data(phba, debug->buffer,
1955 LPFC_HBQINFO_SIZE); 2033 LPFC_HBQINFO_SIZE);
1956 file->private_data = debug; 2034 file->private_data = debug;
1957 2035
@@ -1960,6 +2038,48 @@ out:
1960 return rc; 2038 return rc;
1961} 2039}
1962 2040
2041static ssize_t
2042lpfc_debugfs_lockstat_write(struct file *file, const char __user *buf,
2043 size_t nbytes, loff_t *ppos)
2044{
2045 struct lpfc_debug *debug = file->private_data;
2046 struct lpfc_hba *phba = (struct lpfc_hba *)debug->i_private;
2047 struct lpfc_sli4_hdw_queue *qp;
2048 char mybuf[64];
2049 char *pbuf;
2050 int i;
2051
2052 /* Protect copy from user */
2053 if (!access_ok(buf, nbytes))
2054 return -EFAULT;
2055
2056 memset(mybuf, 0, sizeof(mybuf));
2057
2058 if (copy_from_user(mybuf, buf, nbytes))
2059 return -EFAULT;
2060 pbuf = &mybuf[0];
2061
2062 if ((strncmp(pbuf, "reset", strlen("reset")) == 0) ||
2063 (strncmp(pbuf, "zero", strlen("zero")) == 0)) {
2064 for (i = 0; i < phba->cfg_hdw_queue; i++) {
2065 qp = &phba->sli4_hba.hdwq[i];
2066 qp->lock_conflict.alloc_xri_get = 0;
2067 qp->lock_conflict.alloc_xri_put = 0;
2068 qp->lock_conflict.free_xri = 0;
2069 qp->lock_conflict.wq_access = 0;
2070 qp->lock_conflict.alloc_pvt_pool = 0;
2071 qp->lock_conflict.mv_from_pvt_pool = 0;
2072 qp->lock_conflict.mv_to_pub_pool = 0;
2073 qp->lock_conflict.mv_to_pvt_pool = 0;
2074 qp->lock_conflict.free_pvt_pool = 0;
2075 qp->lock_conflict.free_pub_pool = 0;
2076 qp->lock_conflict.wq_access = 0;
2077 }
2078 }
2079 return nbytes;
2080}
2081#endif
2082
1963/** 2083/**
1964 * lpfc_debugfs_dumpHBASlim_open - Open the Dump HBA SLIM debugfs buffer 2084 * lpfc_debugfs_dumpHBASlim_open - Open the Dump HBA SLIM debugfs buffer
1965 * @inode: The inode pointer that contains a vport pointer. 2085 * @inode: The inode pointer that contains a vport pointer.
@@ -2816,7 +2936,7 @@ lpfc_debugfs_cpucheck_open(struct inode *inode, struct file *file)
2816 } 2936 }
2817 2937
2818 debug->len = lpfc_debugfs_cpucheck_data(vport, debug->buffer, 2938 debug->len = lpfc_debugfs_cpucheck_data(vport, debug->buffer,
2819 LPFC_NVMEKTIME_SIZE); 2939 LPFC_CPUCHECK_SIZE);
2820 2940
2821 debug->i_private = inode->i_private; 2941 debug->i_private = inode->i_private;
2822 file->private_data = debug; 2942 file->private_data = debug;
@@ -2851,8 +2971,18 @@ lpfc_debugfs_cpucheck_write(struct file *file, const char __user *buf,
2851 if (phba->nvmet_support) 2971 if (phba->nvmet_support)
2852 phba->cpucheck_on |= LPFC_CHECK_NVMET_IO; 2972 phba->cpucheck_on |= LPFC_CHECK_NVMET_IO;
2853 else 2973 else
2974 phba->cpucheck_on |= (LPFC_CHECK_NVME_IO |
2975 LPFC_CHECK_SCSI_IO);
2976 return strlen(pbuf);
2977 } else if ((strncmp(pbuf, "nvme_on", sizeof("nvme_on") - 1) == 0)) {
2978 if (phba->nvmet_support)
2979 phba->cpucheck_on |= LPFC_CHECK_NVMET_IO;
2980 else
2854 phba->cpucheck_on |= LPFC_CHECK_NVME_IO; 2981 phba->cpucheck_on |= LPFC_CHECK_NVME_IO;
2855 return strlen(pbuf); 2982 return strlen(pbuf);
2983 } else if ((strncmp(pbuf, "scsi_on", sizeof("scsi_on") - 1) == 0)) {
2984 phba->cpucheck_on |= LPFC_CHECK_SCSI_IO;
2985 return strlen(pbuf);
2856 } else if ((strncmp(pbuf, "rcv", 2986 } else if ((strncmp(pbuf, "rcv",
2857 sizeof("rcv") - 1) == 0)) { 2987 sizeof("rcv") - 1) == 0)) {
2858 if (phba->nvmet_support) 2988 if (phba->nvmet_support)
@@ -3732,46 +3862,38 @@ lpfc_idiag_cqs_for_eq(struct lpfc_hba *phba, char *pbuffer,
3732 int *len, int max_cnt, int eqidx, int eq_id) 3862 int *len, int max_cnt, int eqidx, int eq_id)
3733{ 3863{
3734 struct lpfc_queue *qp; 3864 struct lpfc_queue *qp;
3735 int qidx, rc; 3865 int rc;
3736 3866
3737 for (qidx = 0; qidx < phba->cfg_hdw_queue; qidx++) { 3867 qp = phba->sli4_hba.hdwq[eqidx].fcp_cq;
3738 qp = phba->sli4_hba.hdwq[qidx].fcp_cq;
3739 if (qp->assoc_qid != eq_id)
3740 continue;
3741 3868
3742 *len = __lpfc_idiag_print_cq(qp, "FCP", pbuffer, *len); 3869 *len = __lpfc_idiag_print_cq(qp, "FCP", pbuffer, *len);
3743 3870
3744 /* Reset max counter */ 3871 /* Reset max counter */
3745 qp->CQ_max_cqe = 0; 3872 qp->CQ_max_cqe = 0;
3746 3873
3747 if (*len >= max_cnt) 3874 if (*len >= max_cnt)
3748 return 1; 3875 return 1;
3749 3876
3750 rc = lpfc_idiag_wqs_for_cq(phba, "FCP", pbuffer, len, 3877 rc = lpfc_idiag_wqs_for_cq(phba, "FCP", pbuffer, len,
3751 max_cnt, qp->queue_id); 3878 max_cnt, qp->queue_id);
3752 if (rc) 3879 if (rc)
3753 return 1; 3880 return 1;
3754 }
3755 3881
3756 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { 3882 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) {
3757 for (qidx = 0; qidx < phba->cfg_hdw_queue; qidx++) { 3883 qp = phba->sli4_hba.hdwq[eqidx].nvme_cq;
3758 qp = phba->sli4_hba.hdwq[qidx].nvme_cq;
3759 if (qp->assoc_qid != eq_id)
3760 continue;
3761 3884
3762 *len = __lpfc_idiag_print_cq(qp, "NVME", pbuffer, *len); 3885 *len = __lpfc_idiag_print_cq(qp, "NVME", pbuffer, *len);
3763 3886
3764 /* Reset max counter */ 3887 /* Reset max counter */
3765 qp->CQ_max_cqe = 0; 3888 qp->CQ_max_cqe = 0;
3766 3889
3767 if (*len >= max_cnt) 3890 if (*len >= max_cnt)
3768 return 1; 3891 return 1;
3769 3892
3770 rc = lpfc_idiag_wqs_for_cq(phba, "NVME", pbuffer, len, 3893 rc = lpfc_idiag_wqs_for_cq(phba, "NVME", pbuffer, len,
3771 max_cnt, qp->queue_id); 3894 max_cnt, qp->queue_id);
3772 if (rc) 3895 if (rc)
3773 return 1; 3896 return 1;
3774 }
3775 } 3897 }
3776 3898
3777 if ((eqidx < phba->cfg_nvmet_mrq) && phba->nvmet_support) { 3899 if ((eqidx < phba->cfg_nvmet_mrq) && phba->nvmet_support) {
@@ -3812,9 +3934,10 @@ __lpfc_idiag_print_eq(struct lpfc_queue *qp, char *eqtype,
3812 (unsigned long long)qp->q_cnt_4, qp->q_mode); 3934 (unsigned long long)qp->q_cnt_4, qp->q_mode);
3813 len += snprintf(pbuffer + len, LPFC_QUE_INFO_GET_BUF_SIZE - len, 3935 len += snprintf(pbuffer + len, LPFC_QUE_INFO_GET_BUF_SIZE - len,
3814 "EQID[%02d], QE-CNT[%04d], QE-SZ[%04d], " 3936 "EQID[%02d], QE-CNT[%04d], QE-SZ[%04d], "
3815 "HST-IDX[%04d], PRT-IDX[%04d], PST[%03d]", 3937 "HST-IDX[%04d], PRT-IDX[%04d], PST[%03d] AFFIN[%03d]",
3816 qp->queue_id, qp->entry_count, qp->entry_size, 3938 qp->queue_id, qp->entry_count, qp->entry_size,
3817 qp->host_index, qp->hba_index, qp->entry_repost); 3939 qp->host_index, qp->hba_index, qp->entry_repost,
3940 qp->chann);
3818 len += snprintf(pbuffer + len, LPFC_QUE_INFO_GET_BUF_SIZE - len, "\n"); 3941 len += snprintf(pbuffer + len, LPFC_QUE_INFO_GET_BUF_SIZE - len, "\n");
3819 3942
3820 return len; 3943 return len;
@@ -3869,7 +3992,7 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes,
3869 phba->lpfc_idiag_last_eq = 0; 3992 phba->lpfc_idiag_last_eq = 0;
3870 3993
3871 len += snprintf(pbuffer + len, LPFC_QUE_INFO_GET_BUF_SIZE - len, 3994 len += snprintf(pbuffer + len, LPFC_QUE_INFO_GET_BUF_SIZE - len,
3872 "EQ %d out of %d HBA EQs\n", 3995 "HDWQ %d out of %d HBA HDWQs\n",
3873 x, phba->cfg_hdw_queue); 3996 x, phba->cfg_hdw_queue);
3874 3997
3875 /* Fast-path EQ */ 3998 /* Fast-path EQ */
@@ -5299,14 +5422,17 @@ static const struct file_operations lpfc_debugfs_op_hbqinfo = {
5299 .release = lpfc_debugfs_release, 5422 .release = lpfc_debugfs_release,
5300}; 5423};
5301 5424
5302#undef lpfc_debugfs_op_hdwqinfo 5425#ifdef LPFC_HDWQ_LOCK_STAT
5303static const struct file_operations lpfc_debugfs_op_hdwqinfo = { 5426#undef lpfc_debugfs_op_lockstat
5427static const struct file_operations lpfc_debugfs_op_lockstat = {
5304 .owner = THIS_MODULE, 5428 .owner = THIS_MODULE,
5305 .open = lpfc_debugfs_hdwqinfo_open, 5429 .open = lpfc_debugfs_lockstat_open,
5306 .llseek = lpfc_debugfs_lseek, 5430 .llseek = lpfc_debugfs_lseek,
5307 .read = lpfc_debugfs_read, 5431 .read = lpfc_debugfs_read,
5432 .write = lpfc_debugfs_lockstat_write,
5308 .release = lpfc_debugfs_release, 5433 .release = lpfc_debugfs_release,
5309}; 5434};
5435#endif
5310 5436
5311#undef lpfc_debugfs_op_dumpHBASlim 5437#undef lpfc_debugfs_op_dumpHBASlim
5312static const struct file_operations lpfc_debugfs_op_dumpHBASlim = { 5438static const struct file_operations lpfc_debugfs_op_dumpHBASlim = {
@@ -5756,17 +5882,19 @@ lpfc_debugfs_initialize(struct lpfc_vport *vport)
5756 phba->hba_debugfs_root, 5882 phba->hba_debugfs_root,
5757 phba, &lpfc_debugfs_op_hbqinfo); 5883 phba, &lpfc_debugfs_op_hbqinfo);
5758 5884
5759 /* Setup hdwqinfo */ 5885#ifdef LPFC_HDWQ_LOCK_STAT
5760 snprintf(name, sizeof(name), "hdwqinfo"); 5886 /* Setup lockstat */
5761 phba->debug_hdwqinfo = 5887 snprintf(name, sizeof(name), "lockstat");
5888 phba->debug_lockstat =
5762 debugfs_create_file(name, S_IFREG | 0644, 5889 debugfs_create_file(name, S_IFREG | 0644,
5763 phba->hba_debugfs_root, 5890 phba->hba_debugfs_root,
5764 phba, &lpfc_debugfs_op_hdwqinfo); 5891 phba, &lpfc_debugfs_op_lockstat);
5765 if (!phba->debug_hdwqinfo) { 5892 if (!phba->debug_lockstat) {
5766 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, 5893 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
5767 "0511 Cant create debugfs hdwqinfo\n"); 5894 "0913 Cant create debugfs lockstat\n");
5768 goto debug_failed; 5895 goto debug_failed;
5769 } 5896 }
5897#endif
5770 5898
5771 /* Setup dumpHBASlim */ 5899 /* Setup dumpHBASlim */
5772 if (phba->sli_rev < LPFC_SLI_REV4) { 5900 if (phba->sli_rev < LPFC_SLI_REV4) {
@@ -6006,7 +6134,7 @@ nvmeio_off:
6006 vport, &lpfc_debugfs_op_scsistat); 6134 vport, &lpfc_debugfs_op_scsistat);
6007 if (!vport->debug_scsistat) { 6135 if (!vport->debug_scsistat) {
6008 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT, 6136 lpfc_printf_vlog(vport, KERN_ERR, LOG_INIT,
6009 "0811 Cannot create debugfs scsistat\n"); 6137 "0914 Cannot create debugfs scsistat\n");
6010 goto debug_failed; 6138 goto debug_failed;
6011 } 6139 }
6012 6140
@@ -6171,9 +6299,10 @@ lpfc_debugfs_terminate(struct lpfc_vport *vport)
6171 debugfs_remove(phba->debug_hbqinfo); /* hbqinfo */ 6299 debugfs_remove(phba->debug_hbqinfo); /* hbqinfo */
6172 phba->debug_hbqinfo = NULL; 6300 phba->debug_hbqinfo = NULL;
6173 6301
6174 debugfs_remove(phba->debug_hdwqinfo); /* hdwqinfo */ 6302#ifdef LPFC_HDWQ_LOCK_STAT
6175 phba->debug_hdwqinfo = NULL; 6303 debugfs_remove(phba->debug_lockstat); /* lockstat */
6176 6304 phba->debug_lockstat = NULL;
6305#endif
6177 debugfs_remove(phba->debug_dumpHBASlim); /* HBASlim */ 6306 debugfs_remove(phba->debug_dumpHBASlim); /* HBASlim */
6178 phba->debug_dumpHBASlim = NULL; 6307 phba->debug_dumpHBASlim = NULL;
6179 6308
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.h b/drivers/scsi/lpfc/lpfc_debugfs.h
index cf256a6dca42..1fbee6496f85 100644
--- a/drivers/scsi/lpfc/lpfc_debugfs.h
+++ b/drivers/scsi/lpfc/lpfc_debugfs.h
@@ -290,9 +290,6 @@ struct lpfc_idiag {
290/* multixripool output buffer size */ 290/* multixripool output buffer size */
291#define LPFC_DUMP_MULTIXRIPOOL_SIZE 8192 291#define LPFC_DUMP_MULTIXRIPOOL_SIZE 8192
292 292
293/* hdwqinfo output buffer size */
294#define LPFC_HDWQINFO_SIZE 8192
295
296enum { 293enum {
297 DUMP_FCP, 294 DUMP_FCP,
298 DUMP_NVME, 295 DUMP_NVME,
diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
index cd39845c909f..665852291a4f 100644
--- a/drivers/scsi/lpfc/lpfc_hw4.h
+++ b/drivers/scsi/lpfc/lpfc_hw4.h
@@ -211,9 +211,8 @@ struct lpfc_sli_intf {
211#define LPFC_DEF_IMAX 150000 211#define LPFC_DEF_IMAX 150000
212 212
213#define LPFC_MIN_CPU_MAP 0 213#define LPFC_MIN_CPU_MAP 0
214#define LPFC_MAX_CPU_MAP 2 214#define LPFC_MAX_CPU_MAP 1
215#define LPFC_HBA_CPU_MAP 1 215#define LPFC_HBA_CPU_MAP 1
216#define LPFC_DRIVER_CPU_MAP 2 /* Default */
217 216
218/* PORT_CAPABILITIES constants. */ 217/* PORT_CAPABILITIES constants. */
219#define LPFC_MAX_SUPPORTED_PAGES 8 218#define LPFC_MAX_SUPPORTED_PAGES 8
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index d9db29817f6b..145c08f112a3 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -37,6 +37,7 @@
37#include <linux/miscdevice.h> 37#include <linux/miscdevice.h>
38#include <linux/percpu.h> 38#include <linux/percpu.h>
39#include <linux/msi.h> 39#include <linux/msi.h>
40#include <linux/irq.h>
40#include <linux/bitops.h> 41#include <linux/bitops.h>
41 42
42#include <scsi/scsi.h> 43#include <scsi/scsi.h>
@@ -92,6 +93,8 @@ static void lpfc_sli4_cq_event_release_all(struct lpfc_hba *);
92static void lpfc_sli4_disable_intr(struct lpfc_hba *); 93static void lpfc_sli4_disable_intr(struct lpfc_hba *);
93static uint32_t lpfc_sli4_enable_intr(struct lpfc_hba *, uint32_t); 94static uint32_t lpfc_sli4_enable_intr(struct lpfc_hba *, uint32_t);
94static void lpfc_sli4_oas_verify(struct lpfc_hba *phba); 95static void lpfc_sli4_oas_verify(struct lpfc_hba *phba);
96static uint16_t lpfc_find_eq_handle(struct lpfc_hba *, uint16_t);
97static uint16_t lpfc_find_cpu_handle(struct lpfc_hba *, uint16_t, int);
95 98
96static struct scsi_transport_template *lpfc_transport_template = NULL; 99static struct scsi_transport_template *lpfc_transport_template = NULL;
97static struct scsi_transport_template *lpfc_vport_transport_template = NULL; 100static struct scsi_transport_template *lpfc_vport_transport_template = NULL;
@@ -1367,13 +1370,13 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
1367 } 1370 }
1368 1371
1369 /* Interrupts per sec per EQ */ 1372 /* Interrupts per sec per EQ */
1370 val = phba->cfg_fcp_imax / phba->cfg_hdw_queue; 1373 val = phba->cfg_fcp_imax / phba->cfg_irq_chann;
1371 tick_cqe = val / CONFIG_HZ; /* Per tick per EQ */ 1374 tick_cqe = val / CONFIG_HZ; /* Per tick per EQ */
1372 1375
1373 /* Assume 1 CQE/ISR, calc max CQEs allowed for time duration */ 1376 /* Assume 1 CQE/ISR, calc max CQEs allowed for time duration */
1374 max_cqe = time_elapsed * tick_cqe; 1377 max_cqe = time_elapsed * tick_cqe;
1375 1378
1376 for (i = 0; i < phba->cfg_hdw_queue; i++) { 1379 for (i = 0; i < phba->cfg_irq_chann; i++) {
1377 /* Fast-path EQ */ 1380 /* Fast-path EQ */
1378 qp = phba->sli4_hba.hdwq[i].hba_eq; 1381 qp = phba->sli4_hba.hdwq[i].hba_eq;
1379 if (!qp) 1382 if (!qp)
@@ -1397,7 +1400,7 @@ lpfc_hb_timeout_handler(struct lpfc_hba *phba)
1397 if (val) { 1400 if (val) {
1398 /* First, interrupts per sec per EQ */ 1401 /* First, interrupts per sec per EQ */
1399 val = phba->cfg_fcp_imax / 1402 val = phba->cfg_fcp_imax /
1400 phba->cfg_hdw_queue; 1403 phba->cfg_irq_chann;
1401 1404
1402 /* us delay between each interrupt */ 1405 /* us delay between each interrupt */
1403 val = LPFC_SEC_TO_USEC / val; 1406 val = LPFC_SEC_TO_USEC / val;
@@ -4335,8 +4338,13 @@ lpfc_create_port(struct lpfc_hba *phba, int instance, struct device *dev)
4335 shost->max_lun = vport->cfg_max_luns; 4338 shost->max_lun = vport->cfg_max_luns;
4336 shost->this_id = -1; 4339 shost->this_id = -1;
4337 shost->max_cmd_len = 16; 4340 shost->max_cmd_len = 16;
4341
4338 if (phba->sli_rev == LPFC_SLI_REV4) { 4342 if (phba->sli_rev == LPFC_SLI_REV4) {
4339 shost->nr_hw_queues = phba->cfg_hdw_queue; 4343 if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_HDWQ)
4344 shost->nr_hw_queues = phba->cfg_hdw_queue;
4345 else
4346 shost->nr_hw_queues = phba->sli4_hba.num_present_cpu;
4347
4340 shost->dma_boundary = 4348 shost->dma_boundary =
4341 phba->sli4_hba.pc_sli4_params.sge_supp_len-1; 4349 phba->sli4_hba.pc_sli4_params.sge_supp_len-1;
4342 shost->sg_tablesize = phba->cfg_scsi_seg_cnt; 4350 shost->sg_tablesize = phba->cfg_scsi_seg_cnt;
@@ -6819,7 +6827,7 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)
6819 goto out_remove_rpi_hdrs; 6827 goto out_remove_rpi_hdrs;
6820 } 6828 }
6821 6829
6822 phba->sli4_hba.hba_eq_hdl = kcalloc(phba->cfg_hdw_queue, 6830 phba->sli4_hba.hba_eq_hdl = kcalloc(phba->cfg_irq_chann,
6823 sizeof(struct lpfc_hba_eq_hdl), 6831 sizeof(struct lpfc_hba_eq_hdl),
6824 GFP_KERNEL); 6832 GFP_KERNEL);
6825 if (!phba->sli4_hba.hba_eq_hdl) { 6833 if (!phba->sli4_hba.hba_eq_hdl) {
@@ -8257,7 +8265,7 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
8257 struct lpfc_rsrc_desc_fcfcoe *desc; 8265 struct lpfc_rsrc_desc_fcfcoe *desc;
8258 char *pdesc_0; 8266 char *pdesc_0;
8259 uint16_t forced_link_speed; 8267 uint16_t forced_link_speed;
8260 uint32_t if_type; 8268 uint32_t if_type, qmin;
8261 int length, i, rc = 0, rc2; 8269 int length, i, rc = 0, rc2;
8262 8270
8263 pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); 8271 pmb = (LPFC_MBOXQ_t *) mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
@@ -8362,40 +8370,44 @@ lpfc_sli4_read_config(struct lpfc_hba *phba)
8362 phba->sli4_hba.max_cfg_param.max_rq); 8370 phba->sli4_hba.max_cfg_param.max_rq);
8363 8371
8364 /* 8372 /*
8365 * Calculate NVME queue resources based on how 8373 * Calculate queue resources based on how
8366 * many WQ/CQs are available. 8374 * many WQ/CQ/EQs are available.
8367 */ 8375 */
8368 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { 8376 qmin = phba->sli4_hba.max_cfg_param.max_wq;
8369 length = phba->sli4_hba.max_cfg_param.max_wq; 8377 if (phba->sli4_hba.max_cfg_param.max_cq < qmin)
8370 if (phba->sli4_hba.max_cfg_param.max_cq < 8378 qmin = phba->sli4_hba.max_cfg_param.max_cq;
8371 phba->sli4_hba.max_cfg_param.max_wq) 8379 if (phba->sli4_hba.max_cfg_param.max_eq < qmin)
8372 length = phba->sli4_hba.max_cfg_param.max_cq; 8380 qmin = phba->sli4_hba.max_cfg_param.max_eq;
8381 /*
8382 * Whats left after this can go toward NVME / FCP.
8383 * The minus 4 accounts for ELS, NVME LS, MBOX
8384 * plus one extra. When configured for
8385 * NVMET, FCP io channel WQs are not created.
8386 */
8387 qmin -= 4;
8373 8388
8374 /* 8389 /* If NVME is configured, double the number of CQ/WQs needed */
8375 * Whats left after this can go toward NVME. 8390 if ((phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) &&
8376 * The minus 6 accounts for ELS, NVME LS, MBOX 8391 !phba->nvmet_support)
8377 * plus a couple extra. When configured for 8392 qmin /= 2;
8378 * NVMET, FCP io channel WQs are not created. 8393
8379 */ 8394 /* Check to see if there is enough for NVME */
8380 length -= 6; 8395 if ((phba->cfg_irq_chann > qmin) ||
8381 8396 (phba->cfg_hdw_queue > qmin)) {
8382 /* Take off FCP queues */ 8397 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
8383 if (!phba->nvmet_support) 8398 "2005 Reducing Queues: "
8384 length -= phba->cfg_hdw_queue; 8399 "WQ %d CQ %d EQ %d: min %d: "
8385 8400 "IRQ %d HDWQ %d\n",
8386 /* Check to see if there is enough for NVME */
8387 if (phba->cfg_hdw_queue > length) {
8388 lpfc_printf_log(
8389 phba, KERN_ERR, LOG_SLI,
8390 "2005 Reducing NVME IO channel to %d: "
8391 "WQ %d CQ %d CommonIO %d\n",
8392 length,
8393 phba->sli4_hba.max_cfg_param.max_wq, 8401 phba->sli4_hba.max_cfg_param.max_wq,
8394 phba->sli4_hba.max_cfg_param.max_cq, 8402 phba->sli4_hba.max_cfg_param.max_cq,
8403 phba->sli4_hba.max_cfg_param.max_eq,
8404 qmin, phba->cfg_irq_chann,
8395 phba->cfg_hdw_queue); 8405 phba->cfg_hdw_queue);
8396 8406
8397 phba->cfg_hdw_queue = length; 8407 if (phba->cfg_irq_chann > qmin)
8398 } 8408 phba->cfg_irq_chann = qmin;
8409 if (phba->cfg_hdw_queue > qmin)
8410 phba->cfg_hdw_queue = qmin;
8399 } 8411 }
8400 } 8412 }
8401 8413
@@ -8612,25 +8624,17 @@ lpfc_sli4_queue_verify(struct lpfc_hba *phba)
8612 * device parameters 8624 * device parameters
8613 */ 8625 */
8614 8626
8615 if (phba->cfg_hdw_queue > phba->sli4_hba.max_cfg_param.max_eq) {
8616 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
8617 "2575 Reducing IO channels to match number of "
8618 "available EQs: from %d to %d\n",
8619 phba->cfg_hdw_queue,
8620 phba->sli4_hba.max_cfg_param.max_eq);
8621 phba->cfg_hdw_queue = phba->sli4_hba.max_cfg_param.max_eq;
8622 }
8623
8624 if (phba->nvmet_support) { 8627 if (phba->nvmet_support) {
8625 if (phba->cfg_hdw_queue < phba->cfg_nvmet_mrq) 8628 if (phba->cfg_irq_chann < phba->cfg_nvmet_mrq)
8626 phba->cfg_nvmet_mrq = phba->cfg_hdw_queue; 8629 phba->cfg_nvmet_mrq = phba->cfg_irq_chann;
8627 } 8630 }
8628 if (phba->cfg_nvmet_mrq > LPFC_NVMET_MRQ_MAX) 8631 if (phba->cfg_nvmet_mrq > LPFC_NVMET_MRQ_MAX)
8629 phba->cfg_nvmet_mrq = LPFC_NVMET_MRQ_MAX; 8632 phba->cfg_nvmet_mrq = LPFC_NVMET_MRQ_MAX;
8630 8633
8631 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 8634 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
8632 "2574 IO channels: hdwQ %d MRQ: %d\n", 8635 "2574 IO channels: hdwQ %d IRQ %d MRQ: %d\n",
8633 phba->cfg_hdw_queue, phba->cfg_nvmet_mrq); 8636 phba->cfg_hdw_queue, phba->cfg_irq_chann,
8637 phba->cfg_nvmet_mrq);
8634 8638
8635 /* Get EQ depth from module parameter, fake the default for now */ 8639 /* Get EQ depth from module parameter, fake the default for now */
8636 phba->sli4_hba.eq_esize = LPFC_EQE_SIZE_4B; 8640 phba->sli4_hba.eq_esize = LPFC_EQE_SIZE_4B;
@@ -8658,6 +8662,7 @@ lpfc_alloc_nvme_wq_cq(struct lpfc_hba *phba, int wqidx)
8658 } 8662 }
8659 qdesc->qe_valid = 1; 8663 qdesc->qe_valid = 1;
8660 qdesc->hdwq = wqidx; 8664 qdesc->hdwq = wqidx;
8665 qdesc->chann = lpfc_find_cpu_handle(phba, wqidx, LPFC_FIND_BY_HDWQ);
8661 phba->sli4_hba.hdwq[wqidx].nvme_cq = qdesc; 8666 phba->sli4_hba.hdwq[wqidx].nvme_cq = qdesc;
8662 8667
8663 qdesc = lpfc_sli4_queue_alloc(phba, LPFC_EXPANDED_PAGE_SIZE, 8668 qdesc = lpfc_sli4_queue_alloc(phba, LPFC_EXPANDED_PAGE_SIZE,
@@ -8669,6 +8674,7 @@ lpfc_alloc_nvme_wq_cq(struct lpfc_hba *phba, int wqidx)
8669 return 1; 8674 return 1;
8670 } 8675 }
8671 qdesc->hdwq = wqidx; 8676 qdesc->hdwq = wqidx;
8677 qdesc->chann = wqidx;
8672 phba->sli4_hba.hdwq[wqidx].nvme_wq = qdesc; 8678 phba->sli4_hba.hdwq[wqidx].nvme_wq = qdesc;
8673 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list); 8679 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list);
8674 return 0; 8680 return 0;
@@ -8698,6 +8704,7 @@ lpfc_alloc_fcp_wq_cq(struct lpfc_hba *phba, int wqidx)
8698 } 8704 }
8699 qdesc->qe_valid = 1; 8705 qdesc->qe_valid = 1;
8700 qdesc->hdwq = wqidx; 8706 qdesc->hdwq = wqidx;
8707 qdesc->chann = lpfc_find_cpu_handle(phba, wqidx, LPFC_FIND_BY_HDWQ);
8701 phba->sli4_hba.hdwq[wqidx].fcp_cq = qdesc; 8708 phba->sli4_hba.hdwq[wqidx].fcp_cq = qdesc;
8702 8709
8703 /* Create Fast Path FCP WQs */ 8710 /* Create Fast Path FCP WQs */
@@ -8720,6 +8727,7 @@ lpfc_alloc_fcp_wq_cq(struct lpfc_hba *phba, int wqidx)
8720 return 1; 8727 return 1;
8721 } 8728 }
8722 qdesc->hdwq = wqidx; 8729 qdesc->hdwq = wqidx;
8730 qdesc->chann = wqidx;
8723 phba->sli4_hba.hdwq[wqidx].fcp_wq = qdesc; 8731 phba->sli4_hba.hdwq[wqidx].fcp_wq = qdesc;
8724 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list); 8732 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list);
8725 return 0; 8733 return 0;
@@ -8743,7 +8751,7 @@ int
8743lpfc_sli4_queue_create(struct lpfc_hba *phba) 8751lpfc_sli4_queue_create(struct lpfc_hba *phba)
8744{ 8752{
8745 struct lpfc_queue *qdesc; 8753 struct lpfc_queue *qdesc;
8746 int idx; 8754 int idx, eqidx;
8747 struct lpfc_sli4_hdw_queue *qp; 8755 struct lpfc_sli4_hdw_queue *qp;
8748 8756
8749 /* 8757 /*
@@ -8829,7 +8837,18 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
8829 8837
8830 /* Create HBA Event Queues (EQs) */ 8838 /* Create HBA Event Queues (EQs) */
8831 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) { 8839 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) {
8832 /* Create EQs */ 8840 /*
8841 * If there are more Hardware Queues than available
8842 * CQs, multiple Hardware Queues may share a common EQ.
8843 */
8844 if (idx >= phba->cfg_irq_chann) {
8845 /* Share an existing EQ */
8846 eqidx = lpfc_find_eq_handle(phba, idx);
8847 phba->sli4_hba.hdwq[idx].hba_eq =
8848 phba->sli4_hba.hdwq[eqidx].hba_eq;
8849 continue;
8850 }
8851 /* Create an EQ */
8833 qdesc = lpfc_sli4_queue_alloc(phba, LPFC_DEFAULT_PAGE_SIZE, 8852 qdesc = lpfc_sli4_queue_alloc(phba, LPFC_DEFAULT_PAGE_SIZE,
8834 phba->sli4_hba.eq_esize, 8853 phba->sli4_hba.eq_esize,
8835 phba->sli4_hba.eq_ecount); 8854 phba->sli4_hba.eq_ecount);
@@ -8840,20 +8859,27 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
8840 } 8859 }
8841 qdesc->qe_valid = 1; 8860 qdesc->qe_valid = 1;
8842 qdesc->hdwq = idx; 8861 qdesc->hdwq = idx;
8862
8863 /* Save the CPU this EQ is affinitised to */
8864 eqidx = lpfc_find_eq_handle(phba, idx);
8865 qdesc->chann = lpfc_find_cpu_handle(phba, eqidx,
8866 LPFC_FIND_BY_EQ);
8843 phba->sli4_hba.hdwq[idx].hba_eq = qdesc; 8867 phba->sli4_hba.hdwq[idx].hba_eq = qdesc;
8844 } 8868 }
8845 8869
8846 8870
8847 /* Allocate SCSI SLI4 CQ/WQs */ 8871 /* Allocate SCSI SLI4 CQ/WQs */
8848 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) 8872 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) {
8849 if (lpfc_alloc_fcp_wq_cq(phba, idx)) 8873 if (lpfc_alloc_fcp_wq_cq(phba, idx))
8850 goto out_error; 8874 goto out_error;
8875 }
8851 8876
8852 /* Allocate NVME SLI4 CQ/WQs */ 8877 /* Allocate NVME SLI4 CQ/WQs */
8853 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { 8878 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) {
8854 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) 8879 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) {
8855 if (lpfc_alloc_nvme_wq_cq(phba, idx)) 8880 if (lpfc_alloc_nvme_wq_cq(phba, idx))
8856 goto out_error; 8881 goto out_error;
8882 }
8857 8883
8858 if (phba->nvmet_support) { 8884 if (phba->nvmet_support) {
8859 for (idx = 0; idx < phba->cfg_nvmet_mrq; idx++) { 8885 for (idx = 0; idx < phba->cfg_nvmet_mrq; idx++) {
@@ -8871,6 +8897,7 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
8871 } 8897 }
8872 qdesc->qe_valid = 1; 8898 qdesc->qe_valid = 1;
8873 qdesc->hdwq = idx; 8899 qdesc->hdwq = idx;
8900 qdesc->chann = idx;
8874 phba->sli4_hba.nvmet_cqset[idx] = qdesc; 8901 phba->sli4_hba.nvmet_cqset[idx] = qdesc;
8875 } 8902 }
8876 } 8903 }
@@ -8902,6 +8929,7 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
8902 goto out_error; 8929 goto out_error;
8903 } 8930 }
8904 qdesc->qe_valid = 1; 8931 qdesc->qe_valid = 1;
8932 qdesc->chann = 0;
8905 phba->sli4_hba.els_cq = qdesc; 8933 phba->sli4_hba.els_cq = qdesc;
8906 8934
8907 8935
@@ -8919,6 +8947,7 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
8919 "0505 Failed allocate slow-path MQ\n"); 8947 "0505 Failed allocate slow-path MQ\n");
8920 goto out_error; 8948 goto out_error;
8921 } 8949 }
8950 qdesc->chann = 0;
8922 phba->sli4_hba.mbx_wq = qdesc; 8951 phba->sli4_hba.mbx_wq = qdesc;
8923 8952
8924 /* 8953 /*
@@ -8934,6 +8963,7 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
8934 "0504 Failed allocate slow-path ELS WQ\n"); 8963 "0504 Failed allocate slow-path ELS WQ\n");
8935 goto out_error; 8964 goto out_error;
8936 } 8965 }
8966 qdesc->chann = 0;
8937 phba->sli4_hba.els_wq = qdesc; 8967 phba->sli4_hba.els_wq = qdesc;
8938 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list); 8968 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list);
8939 8969
@@ -8947,6 +8977,7 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
8947 "6079 Failed allocate NVME LS CQ\n"); 8977 "6079 Failed allocate NVME LS CQ\n");
8948 goto out_error; 8978 goto out_error;
8949 } 8979 }
8980 qdesc->chann = 0;
8950 qdesc->qe_valid = 1; 8981 qdesc->qe_valid = 1;
8951 phba->sli4_hba.nvmels_cq = qdesc; 8982 phba->sli4_hba.nvmels_cq = qdesc;
8952 8983
@@ -8959,6 +8990,7 @@ lpfc_sli4_queue_create(struct lpfc_hba *phba)
8959 "6080 Failed allocate NVME LS WQ\n"); 8990 "6080 Failed allocate NVME LS WQ\n");
8960 goto out_error; 8991 goto out_error;
8961 } 8992 }
8993 qdesc->chann = 0;
8962 phba->sli4_hba.nvmels_wq = qdesc; 8994 phba->sli4_hba.nvmels_wq = qdesc;
8963 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list); 8995 list_add_tail(&qdesc->wq_list, &phba->sli4_hba.lpfc_wq_list);
8964 } 8996 }
@@ -9085,17 +9117,21 @@ lpfc_sli4_release_queues(struct lpfc_queue ***qs, int max)
9085} 9117}
9086 9118
9087static inline void 9119static inline void
9088lpfc_sli4_release_hdwq(struct lpfc_sli4_hdw_queue *hdwq, int max) 9120lpfc_sli4_release_hdwq(struct lpfc_hba *phba)
9089{ 9121{
9122 struct lpfc_sli4_hdw_queue *hdwq;
9090 uint32_t idx; 9123 uint32_t idx;
9091 9124
9092 for (idx = 0; idx < max; idx++) { 9125 hdwq = phba->sli4_hba.hdwq;
9093 lpfc_sli4_queue_free(hdwq[idx].hba_eq); 9126 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) {
9127 if (idx < phba->cfg_irq_chann)
9128 lpfc_sli4_queue_free(hdwq[idx].hba_eq);
9129 hdwq[idx].hba_eq = NULL;
9130
9094 lpfc_sli4_queue_free(hdwq[idx].fcp_cq); 9131 lpfc_sli4_queue_free(hdwq[idx].fcp_cq);
9095 lpfc_sli4_queue_free(hdwq[idx].nvme_cq); 9132 lpfc_sli4_queue_free(hdwq[idx].nvme_cq);
9096 lpfc_sli4_queue_free(hdwq[idx].fcp_wq); 9133 lpfc_sli4_queue_free(hdwq[idx].fcp_wq);
9097 lpfc_sli4_queue_free(hdwq[idx].nvme_wq); 9134 lpfc_sli4_queue_free(hdwq[idx].nvme_wq);
9098 hdwq[idx].hba_eq = NULL;
9099 hdwq[idx].fcp_cq = NULL; 9135 hdwq[idx].fcp_cq = NULL;
9100 hdwq[idx].nvme_cq = NULL; 9136 hdwq[idx].nvme_cq = NULL;
9101 hdwq[idx].fcp_wq = NULL; 9137 hdwq[idx].fcp_wq = NULL;
@@ -9120,8 +9156,7 @@ lpfc_sli4_queue_destroy(struct lpfc_hba *phba)
9120{ 9156{
9121 /* Release HBA eqs */ 9157 /* Release HBA eqs */
9122 if (phba->sli4_hba.hdwq) 9158 if (phba->sli4_hba.hdwq)
9123 lpfc_sli4_release_hdwq(phba->sli4_hba.hdwq, 9159 lpfc_sli4_release_hdwq(phba);
9124 phba->cfg_hdw_queue);
9125 9160
9126 if (phba->nvmet_support) { 9161 if (phba->nvmet_support) {
9127 lpfc_sli4_release_queues(&phba->sli4_hba.nvmet_cqset, 9162 lpfc_sli4_release_queues(&phba->sli4_hba.nvmet_cqset,
@@ -9202,7 +9237,6 @@ lpfc_create_wq_cq(struct lpfc_hba *phba, struct lpfc_queue *eq,
9202 qidx, (uint32_t)rc); 9237 qidx, (uint32_t)rc);
9203 return rc; 9238 return rc;
9204 } 9239 }
9205 cq->chann = qidx;
9206 9240
9207 if (qtype != LPFC_MBOX) { 9241 if (qtype != LPFC_MBOX) {
9208 /* Setup cq_map for fast lookup */ 9242 /* Setup cq_map for fast lookup */
@@ -9222,7 +9256,6 @@ lpfc_create_wq_cq(struct lpfc_hba *phba, struct lpfc_queue *eq,
9222 /* no need to tear down cq - caller will do so */ 9256 /* no need to tear down cq - caller will do so */
9223 return rc; 9257 return rc;
9224 } 9258 }
9225 wq->chann = qidx;
9226 9259
9227 /* Bind this CQ/WQ to the NVME ring */ 9260 /* Bind this CQ/WQ to the NVME ring */
9228 pring = wq->pring; 9261 pring = wq->pring;
@@ -9252,6 +9285,38 @@ lpfc_create_wq_cq(struct lpfc_hba *phba, struct lpfc_queue *eq,
9252} 9285}
9253 9286
9254/** 9287/**
9288 * lpfc_setup_cq_lookup - Setup the CQ lookup table
9289 * @phba: pointer to lpfc hba data structure.
9290 *
9291 * This routine will populate the cq_lookup table by all
9292 * available CQ queue_id's.
9293 **/
9294void
9295lpfc_setup_cq_lookup(struct lpfc_hba *phba)
9296{
9297 struct lpfc_queue *eq, *childq;
9298 struct lpfc_sli4_hdw_queue *qp;
9299 int qidx;
9300
9301 qp = phba->sli4_hba.hdwq;
9302 memset(phba->sli4_hba.cq_lookup, 0,
9303 (sizeof(struct lpfc_queue *) * (phba->sli4_hba.cq_max + 1)));
9304 for (qidx = 0; qidx < phba->cfg_irq_chann; qidx++) {
9305 eq = qp[qidx].hba_eq;
9306 if (!eq)
9307 continue;
9308 list_for_each_entry(childq, &eq->child_list, list) {
9309 if (childq->queue_id > phba->sli4_hba.cq_max)
9310 continue;
9311 if ((childq->subtype == LPFC_FCP) ||
9312 (childq->subtype == LPFC_NVME))
9313 phba->sli4_hba.cq_lookup[childq->queue_id] =
9314 childq;
9315 }
9316 }
9317}
9318
9319/**
9255 * lpfc_sli4_queue_setup - Set up all the SLI4 queues 9320 * lpfc_sli4_queue_setup - Set up all the SLI4 queues
9256 * @phba: pointer to lpfc hba data structure. 9321 * @phba: pointer to lpfc hba data structure.
9257 * 9322 *
@@ -9331,7 +9396,7 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba)
9331 rc = -ENOMEM; 9396 rc = -ENOMEM;
9332 goto out_error; 9397 goto out_error;
9333 } 9398 }
9334 for (qidx = 0; qidx < phba->cfg_hdw_queue; qidx++) { 9399 for (qidx = 0; qidx < phba->cfg_irq_chann; qidx++) {
9335 if (!qp[qidx].hba_eq) { 9400 if (!qp[qidx].hba_eq) {
9336 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 9401 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
9337 "0522 Fast-path EQ (%d) not " 9402 "0522 Fast-path EQ (%d) not "
@@ -9578,11 +9643,23 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba)
9578 phba->sli4_hba.dat_rq->queue_id, 9643 phba->sli4_hba.dat_rq->queue_id,
9579 phba->sli4_hba.els_cq->queue_id); 9644 phba->sli4_hba.els_cq->queue_id);
9580 9645
9581 for (qidx = 0; qidx < phba->cfg_hdw_queue; 9646 for (qidx = 0; qidx < phba->cfg_irq_chann;
9582 qidx += LPFC_MAX_EQ_DELAY_EQID_CNT) 9647 qidx += LPFC_MAX_EQ_DELAY_EQID_CNT)
9583 lpfc_modify_hba_eq_delay(phba, qidx, LPFC_MAX_EQ_DELAY_EQID_CNT, 9648 lpfc_modify_hba_eq_delay(phba, qidx, LPFC_MAX_EQ_DELAY_EQID_CNT,
9584 phba->cfg_fcp_imax); 9649 phba->cfg_fcp_imax);
9585 9650
9651 if (phba->sli4_hba.cq_max) {
9652 kfree(phba->sli4_hba.cq_lookup);
9653 phba->sli4_hba.cq_lookup = kcalloc((phba->sli4_hba.cq_max + 1),
9654 sizeof(struct lpfc_queue *), GFP_KERNEL);
9655 if (!phba->sli4_hba.cq_lookup) {
9656 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
9657 "0549 Failed setup of CQ Lookup table: "
9658 "size 0x%x\n", phba->sli4_hba.cq_max);
9659 goto out_destroy;
9660 }
9661 lpfc_setup_cq_lookup(phba);
9662 }
9586 return 0; 9663 return 0;
9587 9664
9588out_destroy: 9665out_destroy:
@@ -9664,9 +9741,14 @@ lpfc_sli4_queue_unset(struct lpfc_hba *phba)
9664 lpfc_wq_destroy(phba, qp->nvme_wq); 9741 lpfc_wq_destroy(phba, qp->nvme_wq);
9665 lpfc_cq_destroy(phba, qp->fcp_cq); 9742 lpfc_cq_destroy(phba, qp->fcp_cq);
9666 lpfc_cq_destroy(phba, qp->nvme_cq); 9743 lpfc_cq_destroy(phba, qp->nvme_cq);
9667 lpfc_eq_destroy(phba, qp->hba_eq); 9744 if (qidx < phba->cfg_irq_chann)
9745 lpfc_eq_destroy(phba, qp->hba_eq);
9668 } 9746 }
9669 } 9747 }
9748
9749 kfree(phba->sli4_hba.cq_lookup);
9750 phba->sli4_hba.cq_lookup = NULL;
9751 phba->sli4_hba.cq_max = 0;
9670} 9752}
9671 9753
9672/** 9754/**
@@ -10446,22 +10528,198 @@ lpfc_sli_disable_intr(struct lpfc_hba *phba)
10446} 10528}
10447 10529
10448/** 10530/**
10531 * lpfc_find_cpu_handle - Find the CPU that corresponds to the specified EQ
10532 * @phba: pointer to lpfc hba data structure.
10533 * @id: EQ vector index or Hardware Queue index
10534 * @match: LPFC_FIND_BY_EQ = match by EQ
10535 * LPFC_FIND_BY_HDWQ = match by Hardware Queue
10536 */
10537static uint16_t
10538lpfc_find_cpu_handle(struct lpfc_hba *phba, uint16_t id, int match)
10539{
10540 struct lpfc_vector_map_info *cpup;
10541 int cpu;
10542
10543 /* Find the desired phys_id for the specified EQ */
10544 cpup = phba->sli4_hba.cpu_map;
10545 for (cpu = 0; cpu < phba->sli4_hba.num_present_cpu; cpu++) {
10546 if ((match == LPFC_FIND_BY_EQ) &&
10547 (cpup->irq != LPFC_VECTOR_MAP_EMPTY) &&
10548 (cpup->eq == id))
10549 return cpu;
10550 if ((match == LPFC_FIND_BY_HDWQ) && (cpup->hdwq == id))
10551 return cpu;
10552 cpup++;
10553 }
10554 return 0;
10555}
10556
10557/**
10558 * lpfc_find_eq_handle - Find the EQ that corresponds to the specified
10559 * Hardware Queue
10560 * @phba: pointer to lpfc hba data structure.
10561 * @hdwq: Hardware Queue index
10562 */
10563static uint16_t
10564lpfc_find_eq_handle(struct lpfc_hba *phba, uint16_t hdwq)
10565{
10566 struct lpfc_vector_map_info *cpup;
10567 int cpu;
10568
10569 /* Find the desired phys_id for the specified EQ */
10570 cpup = phba->sli4_hba.cpu_map;
10571 for (cpu = 0; cpu < phba->sli4_hba.num_present_cpu; cpu++) {
10572 if (cpup->hdwq == hdwq)
10573 return cpup->eq;
10574 cpup++;
10575 }
10576 return 0;
10577}
10578
10579/**
10580 * lpfc_find_phys_id_eq - Find the next EQ that corresponds to the specified
10581 * Physical Id.
10582 * @phba: pointer to lpfc hba data structure.
10583 * @eqidx: EQ index
10584 * @phys_id: CPU package physical id
10585 */
10586static uint16_t
10587lpfc_find_phys_id_eq(struct lpfc_hba *phba, uint16_t eqidx, uint16_t phys_id)
10588{
10589 struct lpfc_vector_map_info *cpup;
10590 int cpu, desired_phys_id;
10591
10592 desired_phys_id = LPFC_VECTOR_MAP_EMPTY;
10593
10594 /* Find the desired phys_id for the specified EQ */
10595 cpup = phba->sli4_hba.cpu_map;
10596 for (cpu = 0; cpu < phba->sli4_hba.num_present_cpu; cpu++) {
10597 if ((cpup->irq != LPFC_VECTOR_MAP_EMPTY) &&
10598 (cpup->eq == eqidx)) {
10599 desired_phys_id = cpup->phys_id;
10600 break;
10601 }
10602 cpup++;
10603 }
10604 if (phys_id == desired_phys_id)
10605 return eqidx;
10606
10607 /* Find a EQ thats on the specified phys_id */
10608 cpup = phba->sli4_hba.cpu_map;
10609 for (cpu = 0; cpu < phba->sli4_hba.num_present_cpu; cpu++) {
10610 if ((cpup->irq != LPFC_VECTOR_MAP_EMPTY) &&
10611 (cpup->phys_id == phys_id))
10612 return cpup->eq;
10613 cpup++;
10614 }
10615 return 0;
10616}
10617
10618/**
10619 * lpfc_find_cpu_map - Find next available CPU map entry that matches the
10620 * phys_id and core_id.
10621 * @phba: pointer to lpfc hba data structure.
10622 * @phys_id: CPU package physical id
10623 * @core_id: CPU core id
10624 * @hdwqidx: Hardware Queue index
10625 * @eqidx: EQ index
10626 * @isr_avail: Should an IRQ be associated with this entry
10627 */
10628static struct lpfc_vector_map_info *
10629lpfc_find_cpu_map(struct lpfc_hba *phba, uint16_t phys_id, uint16_t core_id,
10630 uint16_t hdwqidx, uint16_t eqidx, int isr_avail)
10631{
10632 struct lpfc_vector_map_info *cpup;
10633 int cpu;
10634
10635 cpup = phba->sli4_hba.cpu_map;
10636 for (cpu = 0; cpu < phba->sli4_hba.num_present_cpu; cpu++) {
10637 /* Does the cpup match the one we are looking for */
10638 if ((cpup->phys_id == phys_id) &&
10639 (cpup->core_id == core_id)) {
10640 /* If it has been already assigned, then skip it */
10641 if (cpup->hdwq != LPFC_VECTOR_MAP_EMPTY) {
10642 cpup++;
10643 continue;
10644 }
10645 /* Ensure we are on the same phys_id as the first one */
10646 if (!isr_avail)
10647 cpup->eq = lpfc_find_phys_id_eq(phba, eqidx,
10648 phys_id);
10649 else
10650 cpup->eq = eqidx;
10651
10652 cpup->hdwq = hdwqidx;
10653 if (isr_avail) {
10654 cpup->irq =
10655 pci_irq_vector(phba->pcidev, eqidx);
10656
10657 /* Now affinitize to the selected CPU */
10658 irq_set_affinity_hint(cpup->irq,
10659 get_cpu_mask(cpu));
10660 irq_set_status_flags(cpup->irq,
10661 IRQ_NO_BALANCING);
10662
10663 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
10664 "3330 Set Affinity: CPU %d "
10665 "EQ %d irq %d (HDWQ %x)\n",
10666 cpu, cpup->eq,
10667 cpup->irq, cpup->hdwq);
10668 }
10669 return cpup;
10670 }
10671 cpup++;
10672 }
10673 return 0;
10674}
10675
10676#ifdef CONFIG_X86
10677/**
10678 * lpfc_find_hyper - Determine if the CPU map entry is hyper-threaded
10679 * @phba: pointer to lpfc hba data structure.
10680 * @cpu: CPU map index
10681 * @phys_id: CPU package physical id
10682 * @core_id: CPU core id
10683 */
10684static int
10685lpfc_find_hyper(struct lpfc_hba *phba, int cpu,
10686 uint16_t phys_id, uint16_t core_id)
10687{
10688 struct lpfc_vector_map_info *cpup;
10689 int idx;
10690
10691 cpup = phba->sli4_hba.cpu_map;
10692 for (idx = 0; idx < phba->sli4_hba.num_present_cpu; idx++) {
10693 /* Does the cpup match the one we are looking for */
10694 if ((cpup->phys_id == phys_id) &&
10695 (cpup->core_id == core_id) &&
10696 (cpu != idx)) {
10697 return 1;
10698 }
10699 cpup++;
10700 }
10701 return 0;
10702}
10703#endif
10704
10705/**
10449 * lpfc_cpu_affinity_check - Check vector CPU affinity mappings 10706 * lpfc_cpu_affinity_check - Check vector CPU affinity mappings
10450 * @phba: pointer to lpfc hba data structure. 10707 * @phba: pointer to lpfc hba data structure.
10708 * @vectors: number of msix vectors allocated.
10451 * 10709 *
10452 * The routine will figure out the CPU affinity assignment for every 10710 * The routine will figure out the CPU affinity assignment for every
10453 * MSI-X vector allocated for the HBA. The hba_eq_hdl will be updated 10711 * MSI-X vector allocated for the HBA.
10454 * with a pointer to the CPU mask that defines ALL the CPUs this vector
10455 * can be associated with. If the vector can be unquely associated with
10456 * a single CPU, that CPU will be recorded in hba_eq_hdl[index].cpu.
10457 * In addition, the CPU to IO channel mapping will be calculated 10712 * In addition, the CPU to IO channel mapping will be calculated
10458 * and the phba->sli4_hba.cpu_map array will reflect this. 10713 * and the phba->sli4_hba.cpu_map array will reflect this.
10459 */ 10714 */
10460static void 10715static void
10461lpfc_cpu_affinity_check(struct lpfc_hba *phba) 10716lpfc_cpu_affinity_check(struct lpfc_hba *phba, int vectors)
10462{ 10717{
10718 int i, j, idx, phys_id;
10719 int max_phys_id, min_phys_id;
10720 int max_core_id, min_core_id;
10463 struct lpfc_vector_map_info *cpup; 10721 struct lpfc_vector_map_info *cpup;
10464 int cpu, idx; 10722 int cpu, eqidx, hdwqidx, isr_avail;
10465#ifdef CONFIG_X86 10723#ifdef CONFIG_X86
10466 struct cpuinfo_x86 *cpuinfo; 10724 struct cpuinfo_x86 *cpuinfo;
10467#endif 10725#endif
@@ -10471,6 +10729,12 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba)
10471 (sizeof(struct lpfc_vector_map_info) * 10729 (sizeof(struct lpfc_vector_map_info) *
10472 phba->sli4_hba.num_present_cpu)); 10730 phba->sli4_hba.num_present_cpu));
10473 10731
10732 max_phys_id = 0;
10733 min_phys_id = 0xffff;
10734 max_core_id = 0;
10735 min_core_id = 0xffff;
10736 phys_id = 0;
10737
10474 /* Update CPU map with physical id and core id of each CPU */ 10738 /* Update CPU map with physical id and core id of each CPU */
10475 cpup = phba->sli4_hba.cpu_map; 10739 cpup = phba->sli4_hba.cpu_map;
10476 for (cpu = 0; cpu < phba->sli4_hba.num_present_cpu; cpu++) { 10740 for (cpu = 0; cpu < phba->sli4_hba.num_present_cpu; cpu++) {
@@ -10478,34 +10742,91 @@ lpfc_cpu_affinity_check(struct lpfc_hba *phba)
10478 cpuinfo = &cpu_data(cpu); 10742 cpuinfo = &cpu_data(cpu);
10479 cpup->phys_id = cpuinfo->phys_proc_id; 10743 cpup->phys_id = cpuinfo->phys_proc_id;
10480 cpup->core_id = cpuinfo->cpu_core_id; 10744 cpup->core_id = cpuinfo->cpu_core_id;
10745 cpup->hyper = lpfc_find_hyper(phba, cpu,
10746 cpup->phys_id, cpup->core_id);
10481#else 10747#else
10482 /* No distinction between CPUs for other platforms */ 10748 /* No distinction between CPUs for other platforms */
10483 cpup->phys_id = 0; 10749 cpup->phys_id = 0;
10484 cpup->core_id = 0; 10750 cpup->core_id = cpu;
10751 cpup->hyper = 0;
10485#endif 10752#endif
10753
10486 lpfc_printf_log(phba, KERN_INFO, LOG_INIT, 10754 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
10487 "3328 CPU physid %d coreid %d\n", 10755 "3328 CPU physid %d coreid %d\n",
10488 cpup->phys_id, cpup->core_id); 10756 cpup->phys_id, cpup->core_id);
10757
10758 if (cpup->phys_id > max_phys_id)
10759 max_phys_id = cpup->phys_id;
10760 if (cpup->phys_id < min_phys_id)
10761 min_phys_id = cpup->phys_id;
10762
10763 if (cpup->core_id > max_core_id)
10764 max_core_id = cpup->core_id;
10765 if (cpup->core_id < min_core_id)
10766 min_core_id = cpup->core_id;
10767
10489 cpup++; 10768 cpup++;
10490 } 10769 }
10491 10770
10492 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) { 10771 /*
10493 cpup = &phba->sli4_hba.cpu_map[idx]; 10772 * If the number of IRQ vectors == number of CPUs,
10494 cpup->irq = pci_irq_vector(phba->pcidev, idx); 10773 * mapping is pretty simple: 1 to 1.
10774 * This is the desired path if NVME is enabled.
10775 */
10776 if (vectors == phba->sli4_hba.num_present_cpu) {
10777 cpup = phba->sli4_hba.cpu_map;
10778 for (idx = 0; idx < vectors; idx++) {
10779 cpup->eq = idx;
10780 cpup->hdwq = idx;
10781 cpup->irq = pci_irq_vector(phba->pcidev, idx);
10782
10783 /* Now affinitize to the selected CPU */
10784 irq_set_affinity_hint(
10785 pci_irq_vector(phba->pcidev, idx),
10786 get_cpu_mask(idx));
10787 irq_set_status_flags(cpup->irq, IRQ_NO_BALANCING);
10495 10788
10496 /* For now assume vector N maps to CPU N */ 10789 lpfc_printf_log(phba, KERN_INFO, LOG_INIT,
10497 irq_set_affinity_hint(cpup->irq, get_cpu_mask(idx)); 10790 "3336 Set Affinity: CPU %d "
10498 cpup->hdwq = idx; 10791 "EQ %d irq %d\n",
10792 idx, cpup->eq,
10793 pci_irq_vector(phba->pcidev, idx));
10794 cpup++;
10795 }
10796 return;
10797 }
10499 10798
10500 lpfc_printf_log(phba, KERN_INFO, LOG_INIT, 10799 idx = 0;
10501 "3336 Set Affinity: CPU %d " 10800 isr_avail = 1;
10502 "hdwq %d irq %d\n", 10801 eqidx = 0;
10503 cpu, cpup->hdwq, cpup->irq); 10802 hdwqidx = 0;
10803
10804 /* Mapping is more complicated for this case. Hardware Queues are
10805 * assigned in a "ping pong" fashion, ping pong-ing between the
10806 * available phys_id's.
10807 */
10808 while (idx < phba->sli4_hba.num_present_cpu) {
10809 for (i = min_core_id; i <= max_core_id; i++) {
10810 for (j = min_phys_id; j <= max_phys_id; j++) {
10811 cpup = lpfc_find_cpu_map(phba, j, i, hdwqidx,
10812 eqidx, isr_avail);
10813 if (!cpup)
10814 continue;
10815 idx++;
10816 hdwqidx++;
10817 if (hdwqidx >= phba->cfg_hdw_queue)
10818 hdwqidx = 0;
10819 eqidx++;
10820 if (eqidx >= phba->cfg_irq_chann) {
10821 isr_avail = 0;
10822 eqidx = 0;
10823 }
10824 }
10825 }
10504 } 10826 }
10505 return; 10827 return;
10506} 10828}
10507 10829
10508
10509/** 10830/**
10510 * lpfc_sli4_enable_msix - Enable MSI-X interrupt mode to SLI-4 device 10831 * lpfc_sli4_enable_msix - Enable MSI-X interrupt mode to SLI-4 device
10511 * @phba: pointer to lpfc hba data structure. 10832 * @phba: pointer to lpfc hba data structure.
@@ -10524,7 +10845,7 @@ lpfc_sli4_enable_msix(struct lpfc_hba *phba)
10524 char *name; 10845 char *name;
10525 10846
10526 /* Set up MSI-X multi-message vectors */ 10847 /* Set up MSI-X multi-message vectors */
10527 vectors = phba->cfg_hdw_queue; 10848 vectors = phba->cfg_irq_chann;
10528 10849
10529 rc = pci_alloc_irq_vectors(phba->pcidev, 10850 rc = pci_alloc_irq_vectors(phba->pcidev,
10530 (phba->nvmet_support) ? 1 : 2, 10851 (phba->nvmet_support) ? 1 : 2,
@@ -10545,7 +10866,6 @@ lpfc_sli4_enable_msix(struct lpfc_hba *phba)
10545 10866
10546 phba->sli4_hba.hba_eq_hdl[index].idx = index; 10867 phba->sli4_hba.hba_eq_hdl[index].idx = index;
10547 phba->sli4_hba.hba_eq_hdl[index].phba = phba; 10868 phba->sli4_hba.hba_eq_hdl[index].phba = phba;
10548 atomic_set(&phba->sli4_hba.hba_eq_hdl[index].hba_eq_in_use, 1);
10549 rc = request_irq(pci_irq_vector(phba->pcidev, index), 10869 rc = request_irq(pci_irq_vector(phba->pcidev, index),
10550 &lpfc_sli4_hba_intr_handler, 0, 10870 &lpfc_sli4_hba_intr_handler, 0,
10551 name, 10871 name,
@@ -10558,17 +10878,16 @@ lpfc_sli4_enable_msix(struct lpfc_hba *phba)
10558 } 10878 }
10559 } 10879 }
10560 10880
10561 if (vectors != phba->cfg_hdw_queue) { 10881 if (vectors != phba->cfg_irq_chann) {
10562 lpfc_printf_log(phba, KERN_ERR, LOG_INIT, 10882 lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
10563 "3238 Reducing IO channels to match number of " 10883 "3238 Reducing IO channels to match number of "
10564 "MSI-X vectors, requested %d got %d\n", 10884 "MSI-X vectors, requested %d got %d\n",
10565 phba->cfg_hdw_queue, vectors); 10885 phba->cfg_irq_chann, vectors);
10566 if (phba->cfg_hdw_queue > vectors) 10886 if (phba->cfg_irq_chann > vectors)
10567 phba->cfg_hdw_queue = vectors; 10887 phba->cfg_irq_chann = vectors;
10568 if (phba->cfg_nvmet_mrq > vectors) 10888 if (phba->cfg_nvmet_mrq > vectors)
10569 phba->cfg_nvmet_mrq = vectors; 10889 phba->cfg_nvmet_mrq = vectors;
10570 } 10890 }
10571 lpfc_cpu_affinity_check(phba);
10572 10891
10573 return rc; 10892 return rc;
10574 10893
@@ -10623,7 +10942,7 @@ lpfc_sli4_enable_msi(struct lpfc_hba *phba)
10623 return rc; 10942 return rc;
10624 } 10943 }
10625 10944
10626 for (index = 0; index < phba->cfg_hdw_queue; index++) { 10945 for (index = 0; index < phba->cfg_irq_chann; index++) {
10627 phba->sli4_hba.hba_eq_hdl[index].idx = index; 10946 phba->sli4_hba.hba_eq_hdl[index].idx = index;
10628 phba->sli4_hba.hba_eq_hdl[index].phba = phba; 10947 phba->sli4_hba.hba_eq_hdl[index].phba = phba;
10629 } 10948 }
@@ -10688,11 +11007,10 @@ lpfc_sli4_enable_intr(struct lpfc_hba *phba, uint32_t cfg_mode)
10688 phba->intr_type = INTx; 11007 phba->intr_type = INTx;
10689 intr_mode = 0; 11008 intr_mode = 0;
10690 11009
10691 for (idx = 0; idx < phba->cfg_hdw_queue; idx++) { 11010 for (idx = 0; idx < phba->cfg_irq_chann; idx++) {
10692 eqhdl = &phba->sli4_hba.hba_eq_hdl[idx]; 11011 eqhdl = &phba->sli4_hba.hba_eq_hdl[idx];
10693 eqhdl->idx = idx; 11012 eqhdl->idx = idx;
10694 eqhdl->phba = phba; 11013 eqhdl->phba = phba;
10695 atomic_set(&eqhdl->hba_eq_in_use, 1);
10696 } 11014 }
10697 } 11015 }
10698 } 11016 }
@@ -10716,7 +11034,7 @@ lpfc_sli4_disable_intr(struct lpfc_hba *phba)
10716 int index; 11034 int index;
10717 11035
10718 /* Free up MSI-X multi-message vectors */ 11036 /* Free up MSI-X multi-message vectors */
10719 for (index = 0; index < phba->cfg_hdw_queue; index++) { 11037 for (index = 0; index < phba->cfg_irq_chann; index++) {
10720 irq_set_affinity_hint( 11038 irq_set_affinity_hint(
10721 pci_irq_vector(phba->pcidev, index), 11039 pci_irq_vector(phba->pcidev, index),
10722 NULL); 11040 NULL);
@@ -12092,12 +12410,13 @@ lpfc_pci_probe_one_s4(struct pci_dev *pdev, const struct pci_device_id *pid)
12092 } 12410 }
12093 /* Default to single EQ for non-MSI-X */ 12411 /* Default to single EQ for non-MSI-X */
12094 if (phba->intr_type != MSIX) { 12412 if (phba->intr_type != MSIX) {
12095 phba->cfg_hdw_queue = 1; 12413 phba->cfg_irq_chann = 1;
12096 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) { 12414 if (phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) {
12097 if (phba->nvmet_support) 12415 if (phba->nvmet_support)
12098 phba->cfg_nvmet_mrq = 1; 12416 phba->cfg_nvmet_mrq = 1;
12099 } 12417 }
12100 } 12418 }
12419 lpfc_cpu_affinity_check(phba, phba->cfg_irq_chann);
12101 12420
12102 /* Create SCSI host to the physical port */ 12421 /* Create SCSI host to the physical port */
12103 error = lpfc_create_shost(phba); 12422 error = lpfc_create_shost(phba);
diff --git a/drivers/scsi/lpfc/lpfc_nvme.c b/drivers/scsi/lpfc/lpfc_nvme.c
index c9aacd56a449..9480257c5143 100644
--- a/drivers/scsi/lpfc/lpfc_nvme.c
+++ b/drivers/scsi/lpfc/lpfc_nvme.c
@@ -239,7 +239,7 @@ lpfc_nvme_create_queue(struct nvme_fc_local_port *pnvme_lport,
239 if (qidx) { 239 if (qidx) {
240 str = "IO "; /* IO queue */ 240 str = "IO "; /* IO queue */
241 qhandle->index = ((qidx - 1) % 241 qhandle->index = ((qidx - 1) %
242 vport->phba->cfg_hdw_queue); 242 lpfc_nvme_template.max_hw_queues);
243 } else { 243 } else {
244 str = "ADM"; /* Admin queue */ 244 str = "ADM"; /* Admin queue */
245 qhandle->index = qidx; 245 qhandle->index = qidx;
@@ -1546,14 +1546,12 @@ lpfc_nvme_fcp_io_submit(struct nvme_fc_local_port *pnvme_lport,
1546 } 1546 }
1547 } 1547 }
1548 1548
1549 /* Lookup Hardware Queue index based on fcp_io_sched module parameter */
1549 if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_HDWQ) { 1550 if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_HDWQ) {
1550 idx = lpfc_queue_info->index; 1551 idx = lpfc_queue_info->index;
1551 } else { 1552 } else {
1552 cpu = smp_processor_id(); 1553 cpu = smp_processor_id();
1553 if (cpu < phba->cfg_hdw_queue) 1554 idx = phba->sli4_hba.cpu_map[cpu].hdwq;
1554 idx = cpu;
1555 else
1556 idx = cpu % phba->cfg_hdw_queue;
1557 } 1555 }
1558 1556
1559 lpfc_ncmd = lpfc_get_nvme_buf(phba, ndlp, idx, expedite); 1557 lpfc_ncmd = lpfc_get_nvme_buf(phba, ndlp, idx, expedite);
@@ -2060,7 +2058,13 @@ lpfc_nvme_create_localport(struct lpfc_vport *vport)
2060 * allocate + 3, one for cmd, one for rsp and one for this alignment 2058 * allocate + 3, one for cmd, one for rsp and one for this alignment
2061 */ 2059 */
2062 lpfc_nvme_template.max_sgl_segments = phba->cfg_nvme_seg_cnt + 1; 2060 lpfc_nvme_template.max_sgl_segments = phba->cfg_nvme_seg_cnt + 1;
2063 lpfc_nvme_template.max_hw_queues = phba->cfg_hdw_queue; 2061
2062 /* Advertise how many hw queues we support based on fcp_io_sched */
2063 if (phba->cfg_fcp_io_sched == LPFC_FCP_SCHED_BY_HDWQ)
2064 lpfc_nvme_template.max_hw_queues = phba->cfg_hdw_queue;
2065 else
2066 lpfc_nvme_template.max_hw_queues =
2067 phba->sli4_hba.num_present_cpu;
2064 2068
2065 /* localport is allocated from the stack, but the registration 2069 /* localport is allocated from the stack, but the registration
2066 * call allocates heap memory as well as the private area. 2070 * call allocates heap memory as well as the private area.
@@ -2554,6 +2558,8 @@ lpfc_nvme_wait_for_io_drain(struct lpfc_hba *phba)
2554 * WQEs have been removed from the txcmplqs. 2558 * WQEs have been removed from the txcmplqs.
2555 */ 2559 */
2556 for (i = 0; i < phba->cfg_hdw_queue; i++) { 2560 for (i = 0; i < phba->cfg_hdw_queue; i++) {
2561 if (!phba->sli4_hba.hdwq[i].nvme_wq)
2562 continue;
2557 pring = phba->sli4_hba.hdwq[i].nvme_wq->pring; 2563 pring = phba->sli4_hba.hdwq[i].nvme_wq->pring;
2558 2564
2559 if (!pring) 2565 if (!pring)
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index 7b22cc995d7f..a827520789f1 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -692,10 +692,7 @@ lpfc_get_scsi_buf_s4(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp,
692 tag = blk_mq_unique_tag(cmnd->request); 692 tag = blk_mq_unique_tag(cmnd->request);
693 idx = blk_mq_unique_tag_to_hwq(tag); 693 idx = blk_mq_unique_tag_to_hwq(tag);
694 } else { 694 } else {
695 if (cpu < phba->cfg_hdw_queue) 695 idx = phba->sli4_hba.cpu_map[cpu].hdwq;
696 idx = cpu;
697 else
698 idx = cpu % phba->cfg_hdw_queue;
699 } 696 }
700 697
701 lpfc_cmd = lpfc_get_io_buf(phba, ndlp, idx, 698 lpfc_cmd = lpfc_get_io_buf(phba, ndlp, idx,
@@ -3650,6 +3647,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
3650 struct Scsi_Host *shost; 3647 struct Scsi_Host *shost;
3651 int idx; 3648 int idx;
3652 uint32_t logit = LOG_FCP; 3649 uint32_t logit = LOG_FCP;
3650#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
3651 int cpu;
3652#endif
3653 3653
3654 /* Sanity check on return of outstanding command */ 3654 /* Sanity check on return of outstanding command */
3655 cmd = lpfc_cmd->pCmd; 3655 cmd = lpfc_cmd->pCmd;
@@ -3660,6 +3660,13 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
3660 if (phba->sli4_hba.hdwq) 3660 if (phba->sli4_hba.hdwq)
3661 phba->sli4_hba.hdwq[idx].scsi_cstat.io_cmpls++; 3661 phba->sli4_hba.hdwq[idx].scsi_cstat.io_cmpls++;
3662 3662
3663#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
3664 if (phba->cpucheck_on & LPFC_CHECK_SCSI_IO) {
3665 cpu = smp_processor_id();
3666 if (cpu < LPFC_CHECK_CPU_CNT)
3667 phba->sli4_hba.hdwq[idx].cpucheck_cmpl_io[cpu]++;
3668 }
3669#endif
3663 shost = cmd->device->host; 3670 shost = cmd->device->host;
3664 3671
3665 lpfc_cmd->result = (pIocbOut->iocb.un.ulpWord[4] & IOERR_PARAM_MASK); 3672 lpfc_cmd->result = (pIocbOut->iocb.un.ulpWord[4] & IOERR_PARAM_MASK);
@@ -4336,6 +4343,9 @@ lpfc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *cmnd)
4336 struct lpfc_io_buf *lpfc_cmd; 4343 struct lpfc_io_buf *lpfc_cmd;
4337 struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device)); 4344 struct fc_rport *rport = starget_to_rport(scsi_target(cmnd->device));
4338 int err, idx; 4345 int err, idx;
4346#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
4347 int cpu;
4348#endif
4339 4349
4340 rdata = lpfc_rport_data_from_scsi_device(cmnd->device); 4350 rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
4341 4351
@@ -4450,6 +4460,16 @@ lpfc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *cmnd)
4450 4460
4451 lpfc_scsi_prep_cmnd(vport, lpfc_cmd, ndlp); 4461 lpfc_scsi_prep_cmnd(vport, lpfc_cmd, ndlp);
4452 4462
4463#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
4464 if (phba->cpucheck_on & LPFC_CHECK_SCSI_IO) {
4465 cpu = smp_processor_id();
4466 if (cpu < LPFC_CHECK_CPU_CNT) {
4467 struct lpfc_sli4_hdw_queue *hdwq =
4468 &phba->sli4_hba.hdwq[lpfc_cmd->hdwq_no];
4469 hdwq->cpucheck_xmt_io[cpu]++;
4470 }
4471 }
4472#endif
4453 err = lpfc_sli_issue_iocb(phba, LPFC_FCP_RING, 4473 err = lpfc_sli_issue_iocb(phba, LPFC_FCP_RING,
4454 &lpfc_cmd->cur_iocbq, SLI_IOCB_RET_IOCB); 4474 &lpfc_cmd->cur_iocbq, SLI_IOCB_RET_IOCB);
4455 if (err) { 4475 if (err) {
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index c0f0adccdea7..0cc81321643d 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -5586,7 +5586,7 @@ lpfc_sli4_arm_cqeq_intr(struct lpfc_hba *phba)
5586 LPFC_QUEUE_REARM); 5586 LPFC_QUEUE_REARM);
5587 } 5587 }
5588 5588
5589 for (qidx = 0; qidx < phba->cfg_hdw_queue; qidx++) 5589 for (qidx = 0; qidx < phba->cfg_irq_chann; qidx++)
5590 sli4_hba->sli4_eq_release(qp[qidx].hba_eq, 5590 sli4_hba->sli4_eq_release(qp[qidx].hba_eq,
5591 LPFC_QUEUE_REARM); 5591 LPFC_QUEUE_REARM);
5592 } 5592 }
@@ -7878,7 +7878,7 @@ lpfc_sli4_process_missed_mbox_completions(struct lpfc_hba *phba)
7878 /* Find the eq associated with the mcq */ 7878 /* Find the eq associated with the mcq */
7879 7879
7880 if (sli4_hba->hdwq) 7880 if (sli4_hba->hdwq)
7881 for (eqidx = 0; eqidx < phba->cfg_hdw_queue; eqidx++) 7881 for (eqidx = 0; eqidx < phba->cfg_irq_chann; eqidx++)
7882 if (sli4_hba->hdwq[eqidx].hba_eq->queue_id == 7882 if (sli4_hba->hdwq[eqidx].hba_eq->queue_id ==
7883 sli4_hba->mbx_cq->assoc_qid) { 7883 sli4_hba->mbx_cq->assoc_qid) {
7884 fpeq = sli4_hba->hdwq[eqidx].hba_eq; 7884 fpeq = sli4_hba->hdwq[eqidx].hba_eq;
@@ -10058,12 +10058,9 @@ int
10058lpfc_sli_issue_iocb(struct lpfc_hba *phba, uint32_t ring_number, 10058lpfc_sli_issue_iocb(struct lpfc_hba *phba, uint32_t ring_number,
10059 struct lpfc_iocbq *piocb, uint32_t flag) 10059 struct lpfc_iocbq *piocb, uint32_t flag)
10060{ 10060{
10061 struct lpfc_hba_eq_hdl *hba_eq_hdl;
10062 struct lpfc_sli_ring *pring; 10061 struct lpfc_sli_ring *pring;
10063 struct lpfc_queue *fpeq;
10064 struct lpfc_eqe *eqe;
10065 unsigned long iflags; 10062 unsigned long iflags;
10066 int rc, idx; 10063 int rc;
10067 10064
10068 if (phba->sli_rev == LPFC_SLI_REV4) { 10065 if (phba->sli_rev == LPFC_SLI_REV4) {
10069 pring = lpfc_sli4_calc_ring(phba, piocb); 10066 pring = lpfc_sli4_calc_ring(phba, piocb);
@@ -10073,34 +10070,6 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, uint32_t ring_number,
10073 spin_lock_irqsave(&pring->ring_lock, iflags); 10070 spin_lock_irqsave(&pring->ring_lock, iflags);
10074 rc = __lpfc_sli_issue_iocb(phba, ring_number, piocb, flag); 10071 rc = __lpfc_sli_issue_iocb(phba, ring_number, piocb, flag);
10075 spin_unlock_irqrestore(&pring->ring_lock, iflags); 10072 spin_unlock_irqrestore(&pring->ring_lock, iflags);
10076
10077 if (lpfc_fcp_look_ahead && (piocb->iocb_flag & LPFC_IO_FCP)) {
10078 idx = piocb->hba_wqidx;
10079 hba_eq_hdl = &phba->sli4_hba.hba_eq_hdl[idx];
10080
10081 if (atomic_dec_and_test(&hba_eq_hdl->hba_eq_in_use)) {
10082
10083 /* Get associated EQ with this index */
10084 fpeq = phba->sli4_hba.hdwq[idx].hba_eq;
10085
10086 /* Turn off interrupts from this EQ */
10087 phba->sli4_hba.sli4_eq_clr_intr(fpeq);
10088
10089 /*
10090 * Process all the events on FCP EQ
10091 */
10092 while ((eqe = lpfc_sli4_eq_get(fpeq))) {
10093 lpfc_sli4_hba_handle_eqe(phba,
10094 eqe, idx);
10095 fpeq->EQ_processed++;
10096 }
10097
10098 /* Always clear and re-arm the EQ */
10099 phba->sli4_hba.sli4_eq_release(fpeq,
10100 LPFC_QUEUE_REARM);
10101 }
10102 atomic_inc(&hba_eq_hdl->hba_eq_in_use);
10103 }
10104 } else { 10073 } else {
10105 /* For now, SLI2/3 will still use hbalock */ 10074 /* For now, SLI2/3 will still use hbalock */
10106 spin_lock_irqsave(&phba->hbalock, iflags); 10075 spin_lock_irqsave(&phba->hbalock, iflags);
@@ -13651,7 +13620,7 @@ lpfc_sli4_sp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe,
13651 /* Save EQ associated with this CQ */ 13620 /* Save EQ associated with this CQ */
13652 cq->assoc_qp = speq; 13621 cq->assoc_qp = speq;
13653 13622
13654 if (!queue_work(phba->wq, &cq->spwork)) 13623 if (!queue_work_on(cq->chann, phba->wq, &cq->spwork))
13655 lpfc_printf_log(phba, KERN_ERR, LOG_SLI, 13624 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
13656 "0390 Cannot schedule soft IRQ " 13625 "0390 Cannot schedule soft IRQ "
13657 "for CQ eqcqid=%d, cqid=%d on CPU %d\n", 13626 "for CQ eqcqid=%d, cqid=%d on CPU %d\n",
@@ -14057,18 +14026,11 @@ lpfc_sli4_hba_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe,
14057 /* Get the reference to the corresponding CQ */ 14026 /* Get the reference to the corresponding CQ */
14058 cqid = bf_get_le32(lpfc_eqe_resource_id, eqe); 14027 cqid = bf_get_le32(lpfc_eqe_resource_id, eqe);
14059 14028
14060 /* First check for NVME/SCSI completion */ 14029 /* Use the fast lookup method first */
14061 if ((phba->cfg_enable_fc4_type & LPFC_ENABLE_NVME) && 14030 if (cqid <= phba->sli4_hba.cq_max) {
14062 (cqid == phba->sli4_hba.hdwq[qidx].nvme_cq_map)) { 14031 cq = phba->sli4_hba.cq_lookup[cqid];
14063 /* Process NVME / NVMET command completion */ 14032 if (cq)
14064 cq = phba->sli4_hba.hdwq[qidx].nvme_cq; 14033 goto work_cq;
14065 goto process_cq;
14066 }
14067
14068 if (cqid == phba->sli4_hba.hdwq[qidx].fcp_cq_map) {
14069 /* Process FCP command completion */
14070 cq = phba->sli4_hba.hdwq[qidx].fcp_cq;
14071 goto process_cq;
14072 } 14034 }
14073 14035
14074 /* Next check for NVMET completion */ 14036 /* Next check for NVMET completion */
@@ -14103,9 +14065,7 @@ process_cq:
14103 return; 14065 return;
14104 } 14066 }
14105 14067
14106 /* Save EQ associated with this CQ */ 14068work_cq:
14107 cq->assoc_qp = phba->sli4_hba.hdwq[qidx].hba_eq;
14108
14109 if (!queue_work_on(cq->chann, phba->wq, &cq->irqwork)) 14069 if (!queue_work_on(cq->chann, phba->wq, &cq->irqwork))
14110 lpfc_printf_log(phba, KERN_ERR, LOG_SLI, 14070 lpfc_printf_log(phba, KERN_ERR, LOG_SLI,
14111 "0363 Cannot schedule soft IRQ " 14071 "0363 Cannot schedule soft IRQ "
@@ -14233,15 +14193,6 @@ lpfc_sli4_hba_intr_handler(int irq, void *dev_id)
14233 if (unlikely(!fpeq)) 14193 if (unlikely(!fpeq))
14234 return IRQ_NONE; 14194 return IRQ_NONE;
14235 14195
14236 if (lpfc_fcp_look_ahead) {
14237 if (atomic_dec_and_test(&hba_eq_hdl->hba_eq_in_use))
14238 phba->sli4_hba.sli4_eq_clr_intr(fpeq);
14239 else {
14240 atomic_inc(&hba_eq_hdl->hba_eq_in_use);
14241 return IRQ_NONE;
14242 }
14243 }
14244
14245 /* Check device state for handling interrupt */ 14196 /* Check device state for handling interrupt */
14246 if (unlikely(lpfc_intr_state_check(phba))) { 14197 if (unlikely(lpfc_intr_state_check(phba))) {
14247 /* Check again for link_state with lock held */ 14198 /* Check again for link_state with lock held */
@@ -14250,8 +14201,6 @@ lpfc_sli4_hba_intr_handler(int irq, void *dev_id)
14250 /* Flush, clear interrupt, and rearm the EQ */ 14201 /* Flush, clear interrupt, and rearm the EQ */
14251 lpfc_sli4_eq_flush(phba, fpeq); 14202 lpfc_sli4_eq_flush(phba, fpeq);
14252 spin_unlock_irqrestore(&phba->hbalock, iflag); 14203 spin_unlock_irqrestore(&phba->hbalock, iflag);
14253 if (lpfc_fcp_look_ahead)
14254 atomic_inc(&hba_eq_hdl->hba_eq_in_use);
14255 return IRQ_NONE; 14204 return IRQ_NONE;
14256 } 14205 }
14257 14206
@@ -14274,12 +14223,6 @@ lpfc_sli4_hba_intr_handler(int irq, void *dev_id)
14274 14223
14275 if (unlikely(ecount == 0)) { 14224 if (unlikely(ecount == 0)) {
14276 fpeq->EQ_no_entry++; 14225 fpeq->EQ_no_entry++;
14277
14278 if (lpfc_fcp_look_ahead) {
14279 atomic_inc(&hba_eq_hdl->hba_eq_in_use);
14280 return IRQ_NONE;
14281 }
14282
14283 if (phba->intr_type == MSIX) 14226 if (phba->intr_type == MSIX)
14284 /* MSI-X treated interrupt served as no EQ share INT */ 14227 /* MSI-X treated interrupt served as no EQ share INT */
14285 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI, 14228 lpfc_printf_log(phba, KERN_WARNING, LOG_SLI,
@@ -14289,9 +14232,6 @@ lpfc_sli4_hba_intr_handler(int irq, void *dev_id)
14289 return IRQ_NONE; 14232 return IRQ_NONE;
14290 } 14233 }
14291 14234
14292 if (lpfc_fcp_look_ahead)
14293 atomic_inc(&hba_eq_hdl->hba_eq_in_use);
14294
14295 return IRQ_HANDLED; 14235 return IRQ_HANDLED;
14296} /* lpfc_sli4_fp_intr_handler */ 14236} /* lpfc_sli4_fp_intr_handler */
14297 14237
@@ -14329,7 +14269,7 @@ lpfc_sli4_intr_handler(int irq, void *dev_id)
14329 /* 14269 /*
14330 * Invoke fast-path host attention interrupt handling as appropriate. 14270 * Invoke fast-path host attention interrupt handling as appropriate.
14331 */ 14271 */
14332 for (qidx = 0; qidx < phba->cfg_hdw_queue; qidx++) { 14272 for (qidx = 0; qidx < phba->cfg_irq_chann; qidx++) {
14333 hba_irq_rc = lpfc_sli4_hba_intr_handler(irq, 14273 hba_irq_rc = lpfc_sli4_hba_intr_handler(irq,
14334 &phba->sli4_hba.hba_eq_hdl[qidx]); 14274 &phba->sli4_hba.hba_eq_hdl[qidx]);
14335 if (hba_irq_rc == IRQ_HANDLED) 14275 if (hba_irq_rc == IRQ_HANDLED)
@@ -14516,7 +14456,7 @@ lpfc_modify_hba_eq_delay(struct lpfc_hba *phba, uint32_t startq,
14516 union lpfc_sli4_cfg_shdr *shdr; 14456 union lpfc_sli4_cfg_shdr *shdr;
14517 uint16_t dmult; 14457 uint16_t dmult;
14518 14458
14519 if (startq >= phba->cfg_hdw_queue) 14459 if (startq >= phba->cfg_irq_chann)
14520 return 0; 14460 return 0;
14521 14461
14522 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); 14462 mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
@@ -14530,7 +14470,7 @@ lpfc_modify_hba_eq_delay(struct lpfc_hba *phba, uint32_t startq,
14530 eq_delay = &mbox->u.mqe.un.eq_delay; 14470 eq_delay = &mbox->u.mqe.un.eq_delay;
14531 14471
14532 /* Calculate delay multiper from maximum interrupt per second */ 14472 /* Calculate delay multiper from maximum interrupt per second */
14533 result = imax / phba->cfg_hdw_queue; 14473 result = imax / phba->cfg_irq_chann;
14534 if (result > LPFC_DMULT_CONST || result == 0) 14474 if (result > LPFC_DMULT_CONST || result == 0)
14535 dmult = 0; 14475 dmult = 0;
14536 else 14476 else
@@ -14539,7 +14479,7 @@ lpfc_modify_hba_eq_delay(struct lpfc_hba *phba, uint32_t startq,
14539 dmult = LPFC_DMULT_MAX; 14479 dmult = LPFC_DMULT_MAX;
14540 14480
14541 cnt = 0; 14481 cnt = 0;
14542 for (qidx = startq; qidx < phba->cfg_hdw_queue; qidx++) { 14482 for (qidx = startq; qidx < phba->cfg_irq_chann; qidx++) {
14543 eq = phba->sli4_hba.hdwq[qidx].hba_eq; 14483 eq = phba->sli4_hba.hdwq[qidx].hba_eq;
14544 if (!eq) 14484 if (!eq)
14545 continue; 14485 continue;
@@ -14557,7 +14497,7 @@ lpfc_modify_hba_eq_delay(struct lpfc_hba *phba, uint32_t startq,
14557 val = phba->cfg_fcp_imax; 14497 val = phba->cfg_fcp_imax;
14558 if (val) { 14498 if (val) {
14559 /* First, interrupts per sec per EQ */ 14499 /* First, interrupts per sec per EQ */
14560 val = phba->cfg_fcp_imax / phba->cfg_hdw_queue; 14500 val = phba->cfg_fcp_imax / phba->cfg_irq_chann;
14561 14501
14562 /* us delay between each interrupt */ 14502 /* us delay between each interrupt */
14563 val = LPFC_SEC_TO_USEC / val; 14503 val = LPFC_SEC_TO_USEC / val;
@@ -14852,10 +14792,13 @@ lpfc_cq_create(struct lpfc_hba *phba, struct lpfc_queue *cq,
14852 cq->subtype = subtype; 14792 cq->subtype = subtype;
14853 cq->queue_id = bf_get(lpfc_mbx_cq_create_q_id, &cq_create->u.response); 14793 cq->queue_id = bf_get(lpfc_mbx_cq_create_q_id, &cq_create->u.response);
14854 cq->assoc_qid = eq->queue_id; 14794 cq->assoc_qid = eq->queue_id;
14795 cq->assoc_qp = eq;
14855 cq->host_index = 0; 14796 cq->host_index = 0;
14856 cq->hba_index = 0; 14797 cq->hba_index = 0;
14857 cq->entry_repost = LPFC_CQ_REPOST; 14798 cq->entry_repost = LPFC_CQ_REPOST;
14858 14799
14800 if (cq->queue_id > phba->sli4_hba.cq_max)
14801 phba->sli4_hba.cq_max = cq->queue_id;
14859out: 14802out:
14860 mempool_free(mbox, phba->mbox_mem_pool); 14803 mempool_free(mbox, phba->mbox_mem_pool);
14861 return status; 14804 return status;
@@ -15061,6 +15004,7 @@ lpfc_cq_create_set(struct lpfc_hba *phba, struct lpfc_queue **cqp,
15061 cq->type = type; 15004 cq->type = type;
15062 cq->subtype = subtype; 15005 cq->subtype = subtype;
15063 cq->assoc_qid = eq->queue_id; 15006 cq->assoc_qid = eq->queue_id;
15007 cq->assoc_qp = eq;
15064 cq->host_index = 0; 15008 cq->host_index = 0;
15065 cq->hba_index = 0; 15009 cq->hba_index = 0;
15066 cq->entry_repost = LPFC_CQ_REPOST; 15010 cq->entry_repost = LPFC_CQ_REPOST;
@@ -15101,6 +15045,8 @@ lpfc_cq_create_set(struct lpfc_hba *phba, struct lpfc_queue **cqp,
15101 for (idx = 0; idx < numcq; idx++) { 15045 for (idx = 0; idx < numcq; idx++) {
15102 cq = cqp[idx]; 15046 cq = cqp[idx];
15103 cq->queue_id = rc + idx; 15047 cq->queue_id = rc + idx;
15048 if (cq->queue_id > phba->sli4_hba.cq_max)
15049 phba->sli4_hba.cq_max = cq->queue_id;
15104 } 15050 }
15105 15051
15106out: 15052out:
@@ -19664,7 +19610,8 @@ lpfc_sli4_issue_wqe(struct lpfc_hba *phba, struct lpfc_sli4_hdw_queue *qp,
19664 /* NVME_LS and NVME_LS ABTS requests. */ 19610 /* NVME_LS and NVME_LS ABTS requests. */
19665 if (pwqe->iocb_flag & LPFC_IO_NVME_LS) { 19611 if (pwqe->iocb_flag & LPFC_IO_NVME_LS) {
19666 pring = phba->sli4_hba.nvmels_wq->pring; 19612 pring = phba->sli4_hba.nvmels_wq->pring;
19667 spin_lock_irqsave(&pring->ring_lock, iflags); 19613 lpfc_qp_spin_lock_irqsave(&pring->ring_lock, iflags,
19614 qp, wq_access);
19668 sglq = __lpfc_sli_get_els_sglq(phba, pwqe); 19615 sglq = __lpfc_sli_get_els_sglq(phba, pwqe);
19669 if (!sglq) { 19616 if (!sglq) {
19670 spin_unlock_irqrestore(&pring->ring_lock, iflags); 19617 spin_unlock_irqrestore(&pring->ring_lock, iflags);
@@ -19697,7 +19644,8 @@ lpfc_sli4_issue_wqe(struct lpfc_hba *phba, struct lpfc_sli4_hdw_queue *qp,
19697 19644
19698 bf_set(wqe_cqid, &wqe->generic.wqe_com, qp->nvme_cq_map); 19645 bf_set(wqe_cqid, &wqe->generic.wqe_com, qp->nvme_cq_map);
19699 19646
19700 spin_lock_irqsave(&pring->ring_lock, iflags); 19647 lpfc_qp_spin_lock_irqsave(&pring->ring_lock, iflags,
19648 qp, wq_access);
19701 ret = lpfc_sli4_wq_put(wq, wqe); 19649 ret = lpfc_sli4_wq_put(wq, wqe);
19702 if (ret) { 19650 if (ret) {
19703 spin_unlock_irqrestore(&pring->ring_lock, iflags); 19651 spin_unlock_irqrestore(&pring->ring_lock, iflags);
@@ -19724,7 +19672,8 @@ lpfc_sli4_issue_wqe(struct lpfc_hba *phba, struct lpfc_sli4_hdw_queue *qp,
19724 pwqe->sli4_xritag); 19672 pwqe->sli4_xritag);
19725 bf_set(wqe_cqid, &wqe->generic.wqe_com, qp->nvme_cq_map); 19673 bf_set(wqe_cqid, &wqe->generic.wqe_com, qp->nvme_cq_map);
19726 19674
19727 spin_lock_irqsave(&pring->ring_lock, iflags); 19675 lpfc_qp_spin_lock_irqsave(&pring->ring_lock, iflags,
19676 qp, wq_access);
19728 ret = lpfc_sli4_wq_put(wq, wqe); 19677 ret = lpfc_sli4_wq_put(wq, wqe);
19729 if (ret) { 19678 if (ret) {
19730 spin_unlock_irqrestore(&pring->ring_lock, iflags); 19679 spin_unlock_irqrestore(&pring->ring_lock, iflags);
@@ -19872,18 +19821,20 @@ void lpfc_move_xri_pvt_to_pbl(struct lpfc_hba *phba, u32 hwqid)
19872{ 19821{
19873 struct lpfc_pbl_pool *pbl_pool; 19822 struct lpfc_pbl_pool *pbl_pool;
19874 struct lpfc_pvt_pool *pvt_pool; 19823 struct lpfc_pvt_pool *pvt_pool;
19824 struct lpfc_sli4_hdw_queue *qp;
19875 struct lpfc_io_buf *lpfc_ncmd; 19825 struct lpfc_io_buf *lpfc_ncmd;
19876 struct lpfc_io_buf *lpfc_ncmd_next; 19826 struct lpfc_io_buf *lpfc_ncmd_next;
19877 unsigned long iflag; 19827 unsigned long iflag;
19878 struct list_head tmp_list; 19828 struct list_head tmp_list;
19879 u32 tmp_count; 19829 u32 tmp_count;
19880 19830
19881 pbl_pool = &phba->sli4_hba.hdwq[hwqid].p_multixri_pool->pbl_pool; 19831 qp = &phba->sli4_hba.hdwq[hwqid];
19882 pvt_pool = &phba->sli4_hba.hdwq[hwqid].p_multixri_pool->pvt_pool; 19832 pbl_pool = &qp->p_multixri_pool->pbl_pool;
19833 pvt_pool = &qp->p_multixri_pool->pvt_pool;
19883 tmp_count = 0; 19834 tmp_count = 0;
19884 19835
19885 spin_lock_irqsave(&pbl_pool->lock, iflag); 19836 lpfc_qp_spin_lock_irqsave(&pbl_pool->lock, iflag, qp, mv_to_pub_pool);
19886 spin_lock(&pvt_pool->lock); 19837 lpfc_qp_spin_lock(&pvt_pool->lock, qp, mv_from_pvt_pool);
19887 19838
19888 if (pvt_pool->count > pvt_pool->low_watermark) { 19839 if (pvt_pool->count > pvt_pool->low_watermark) {
19889 /* Step 1: move (all - low_watermark) from pvt_pool 19840 /* Step 1: move (all - low_watermark) from pvt_pool
@@ -19936,7 +19887,8 @@ void lpfc_move_xri_pvt_to_pbl(struct lpfc_hba *phba, u32 hwqid)
19936 * false - if the specified pbl_pool is empty or locked by someone else 19887 * false - if the specified pbl_pool is empty or locked by someone else
19937 **/ 19888 **/
19938static bool 19889static bool
19939_lpfc_move_xri_pbl_to_pvt(struct lpfc_hba *phba, struct lpfc_pbl_pool *pbl_pool, 19890_lpfc_move_xri_pbl_to_pvt(struct lpfc_hba *phba, struct lpfc_sli4_hdw_queue *qp,
19891 struct lpfc_pbl_pool *pbl_pool,
19940 struct lpfc_pvt_pool *pvt_pool, u32 count) 19892 struct lpfc_pvt_pool *pvt_pool, u32 count)
19941{ 19893{
19942 struct lpfc_io_buf *lpfc_ncmd; 19894 struct lpfc_io_buf *lpfc_ncmd;
@@ -19948,7 +19900,7 @@ _lpfc_move_xri_pbl_to_pvt(struct lpfc_hba *phba, struct lpfc_pbl_pool *pbl_pool,
19948 if (ret) { 19900 if (ret) {
19949 if (pbl_pool->count) { 19901 if (pbl_pool->count) {
19950 /* Move a batch of XRIs from public to private pool */ 19902 /* Move a batch of XRIs from public to private pool */
19951 spin_lock(&pvt_pool->lock); 19903 lpfc_qp_spin_lock(&pvt_pool->lock, qp, mv_to_pvt_pool);
19952 list_for_each_entry_safe(lpfc_ncmd, 19904 list_for_each_entry_safe(lpfc_ncmd,
19953 lpfc_ncmd_next, 19905 lpfc_ncmd_next,
19954 &pbl_pool->list, 19906 &pbl_pool->list,
@@ -19990,16 +19942,18 @@ void lpfc_move_xri_pbl_to_pvt(struct lpfc_hba *phba, u32 hwqid, u32 count)
19990 struct lpfc_multixri_pool *next_multixri_pool; 19942 struct lpfc_multixri_pool *next_multixri_pool;
19991 struct lpfc_pvt_pool *pvt_pool; 19943 struct lpfc_pvt_pool *pvt_pool;
19992 struct lpfc_pbl_pool *pbl_pool; 19944 struct lpfc_pbl_pool *pbl_pool;
19945 struct lpfc_sli4_hdw_queue *qp;
19993 u32 next_hwqid; 19946 u32 next_hwqid;
19994 u32 hwq_count; 19947 u32 hwq_count;
19995 int ret; 19948 int ret;
19996 19949
19997 multixri_pool = phba->sli4_hba.hdwq[hwqid].p_multixri_pool; 19950 qp = &phba->sli4_hba.hdwq[hwqid];
19951 multixri_pool = qp->p_multixri_pool;
19998 pvt_pool = &multixri_pool->pvt_pool; 19952 pvt_pool = &multixri_pool->pvt_pool;
19999 pbl_pool = &multixri_pool->pbl_pool; 19953 pbl_pool = &multixri_pool->pbl_pool;
20000 19954
20001 /* Check if local pbl_pool is available */ 19955 /* Check if local pbl_pool is available */
20002 ret = _lpfc_move_xri_pbl_to_pvt(phba, pbl_pool, pvt_pool, count); 19956 ret = _lpfc_move_xri_pbl_to_pvt(phba, qp, pbl_pool, pvt_pool, count);
20003 if (ret) { 19957 if (ret) {
20004#ifdef LPFC_MXP_STAT 19958#ifdef LPFC_MXP_STAT
20005 multixri_pool->local_pbl_hit_count++; 19959 multixri_pool->local_pbl_hit_count++;
@@ -20022,7 +19976,7 @@ void lpfc_move_xri_pbl_to_pvt(struct lpfc_hba *phba, u32 hwqid, u32 count)
20022 19976
20023 /* Check if the public free xri pool is available */ 19977 /* Check if the public free xri pool is available */
20024 ret = _lpfc_move_xri_pbl_to_pvt( 19978 ret = _lpfc_move_xri_pbl_to_pvt(
20025 phba, pbl_pool, pvt_pool, count); 19979 phba, qp, pbl_pool, pvt_pool, count);
20026 19980
20027 /* Exit while-loop if success or all hwqid are checked */ 19981 /* Exit while-loop if success or all hwqid are checked */
20028 } while (!ret && next_hwqid != multixri_pool->rrb_next_hwqid); 19982 } while (!ret && next_hwqid != multixri_pool->rrb_next_hwqid);
@@ -20138,20 +20092,23 @@ void lpfc_release_io_buf(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_ncmd,
20138 if ((pvt_pool->count < pvt_pool->low_watermark) || 20092 if ((pvt_pool->count < pvt_pool->low_watermark) ||
20139 (xri_owned < xri_limit && 20093 (xri_owned < xri_limit &&
20140 pvt_pool->count < pvt_pool->high_watermark)) { 20094 pvt_pool->count < pvt_pool->high_watermark)) {
20141 spin_lock_irqsave(&pvt_pool->lock, iflag); 20095 lpfc_qp_spin_lock_irqsave(&pvt_pool->lock, iflag,
20096 qp, free_pvt_pool);
20142 list_add_tail(&lpfc_ncmd->list, 20097 list_add_tail(&lpfc_ncmd->list,
20143 &pvt_pool->list); 20098 &pvt_pool->list);
20144 pvt_pool->count++; 20099 pvt_pool->count++;
20145 spin_unlock_irqrestore(&pvt_pool->lock, iflag); 20100 spin_unlock_irqrestore(&pvt_pool->lock, iflag);
20146 } else { 20101 } else {
20147 spin_lock_irqsave(&pbl_pool->lock, iflag); 20102 lpfc_qp_spin_lock_irqsave(&pbl_pool->lock, iflag,
20103 qp, free_pub_pool);
20148 list_add_tail(&lpfc_ncmd->list, 20104 list_add_tail(&lpfc_ncmd->list,
20149 &pbl_pool->list); 20105 &pbl_pool->list);
20150 pbl_pool->count++; 20106 pbl_pool->count++;
20151 spin_unlock_irqrestore(&pbl_pool->lock, iflag); 20107 spin_unlock_irqrestore(&pbl_pool->lock, iflag);
20152 } 20108 }
20153 } else { 20109 } else {
20154 spin_lock_irqsave(&qp->io_buf_list_put_lock, iflag); 20110 lpfc_qp_spin_lock_irqsave(&qp->io_buf_list_put_lock, iflag,
20111 qp, free_xri);
20155 list_add_tail(&lpfc_ncmd->list, 20112 list_add_tail(&lpfc_ncmd->list,
20156 &qp->lpfc_io_buf_list_put); 20113 &qp->lpfc_io_buf_list_put);
20157 qp->put_io_bufs++; 20114 qp->put_io_bufs++;
@@ -20174,6 +20131,7 @@ void lpfc_release_io_buf(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_ncmd,
20174 **/ 20131 **/
20175static struct lpfc_io_buf * 20132static struct lpfc_io_buf *
20176lpfc_get_io_buf_from_private_pool(struct lpfc_hba *phba, 20133lpfc_get_io_buf_from_private_pool(struct lpfc_hba *phba,
20134 struct lpfc_sli4_hdw_queue *qp,
20177 struct lpfc_pvt_pool *pvt_pool, 20135 struct lpfc_pvt_pool *pvt_pool,
20178 struct lpfc_nodelist *ndlp) 20136 struct lpfc_nodelist *ndlp)
20179{ 20137{
@@ -20181,7 +20139,7 @@ lpfc_get_io_buf_from_private_pool(struct lpfc_hba *phba,
20181 struct lpfc_io_buf *lpfc_ncmd_next; 20139 struct lpfc_io_buf *lpfc_ncmd_next;
20182 unsigned long iflag; 20140 unsigned long iflag;
20183 20141
20184 spin_lock_irqsave(&pvt_pool->lock, iflag); 20142 lpfc_qp_spin_lock_irqsave(&pvt_pool->lock, iflag, qp, alloc_pvt_pool);
20185 list_for_each_entry_safe(lpfc_ncmd, lpfc_ncmd_next, 20143 list_for_each_entry_safe(lpfc_ncmd, lpfc_ncmd_next,
20186 &pvt_pool->list, list) { 20144 &pvt_pool->list, list) {
20187 if (lpfc_test_rrq_active( 20145 if (lpfc_test_rrq_active(
@@ -20276,7 +20234,7 @@ lpfc_get_io_buf_from_multixri_pools(struct lpfc_hba *phba,
20276 lpfc_move_xri_pbl_to_pvt(phba, hwqid, XRI_BATCH); 20234 lpfc_move_xri_pbl_to_pvt(phba, hwqid, XRI_BATCH);
20277 20235
20278 /* Get one XRI from private free xri pool */ 20236 /* Get one XRI from private free xri pool */
20279 lpfc_ncmd = lpfc_get_io_buf_from_private_pool(phba, pvt_pool, ndlp); 20237 lpfc_ncmd = lpfc_get_io_buf_from_private_pool(phba, qp, pvt_pool, ndlp);
20280 20238
20281 if (lpfc_ncmd) { 20239 if (lpfc_ncmd) {
20282 lpfc_ncmd->hdwq = qp; 20240 lpfc_ncmd->hdwq = qp;
@@ -20349,11 +20307,13 @@ struct lpfc_io_buf *lpfc_get_io_buf(struct lpfc_hba *phba,
20349 lpfc_cmd = lpfc_get_io_buf_from_multixri_pools( 20307 lpfc_cmd = lpfc_get_io_buf_from_multixri_pools(
20350 phba, ndlp, hwqid, expedite); 20308 phba, ndlp, hwqid, expedite);
20351 else { 20309 else {
20352 spin_lock_irqsave(&qp->io_buf_list_get_lock, iflag); 20310 lpfc_qp_spin_lock_irqsave(&qp->io_buf_list_get_lock, iflag,
20311 qp, alloc_xri_get);
20353 if (qp->get_io_bufs > LPFC_NVME_EXPEDITE_XRICNT || expedite) 20312 if (qp->get_io_bufs > LPFC_NVME_EXPEDITE_XRICNT || expedite)
20354 lpfc_cmd = lpfc_io_buf(phba, ndlp, hwqid); 20313 lpfc_cmd = lpfc_io_buf(phba, ndlp, hwqid);
20355 if (!lpfc_cmd) { 20314 if (!lpfc_cmd) {
20356 spin_lock(&qp->io_buf_list_put_lock); 20315 lpfc_qp_spin_lock(&qp->io_buf_list_put_lock,
20316 qp, alloc_xri_put);
20357 list_splice(&qp->lpfc_io_buf_list_put, 20317 list_splice(&qp->lpfc_io_buf_list_put,
20358 &qp->lpfc_io_buf_list_get); 20318 &qp->lpfc_io_buf_list_get);
20359 qp->get_io_bufs += qp->put_io_bufs; 20319 qp->get_io_bufs += qp->put_io_bufs;
diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h
index f5e58cd4c6ac..c381f2cb4909 100644
--- a/drivers/scsi/lpfc/lpfc_sli4.h
+++ b/drivers/scsi/lpfc/lpfc_sli4.h
@@ -41,7 +41,7 @@
41 41
42/* Multi-queue arrangement for FCP EQ/CQ/WQ tuples */ 42/* Multi-queue arrangement for FCP EQ/CQ/WQ tuples */
43#define LPFC_HBA_HDWQ_MIN 0 43#define LPFC_HBA_HDWQ_MIN 0
44#define LPFC_HBA_HDWQ_MAX 64 44#define LPFC_HBA_HDWQ_MAX 128
45#define LPFC_HBA_HDWQ_DEF 0 45#define LPFC_HBA_HDWQ_DEF 0
46 46
47/* Common buffer size to accomidate SCSI and NVME IO buffers */ 47/* Common buffer size to accomidate SCSI and NVME IO buffers */
@@ -166,16 +166,19 @@ struct lpfc_queue {
166 uint32_t assoc_qid; /* Queue ID associated with, for CQ/WQ/MQ */ 166 uint32_t assoc_qid; /* Queue ID associated with, for CQ/WQ/MQ */
167 uint32_t host_index; /* The host's index for putting or getting */ 167 uint32_t host_index; /* The host's index for putting or getting */
168 uint32_t hba_index; /* The last known hba index for get or put */ 168 uint32_t hba_index; /* The last known hba index for get or put */
169 uint32_t q_mode;
169 170
170 struct lpfc_sli_ring *pring; /* ptr to io ring associated with q */ 171 struct lpfc_sli_ring *pring; /* ptr to io ring associated with q */
171 struct lpfc_rqb *rqbp; /* ptr to RQ buffers */ 172 struct lpfc_rqb *rqbp; /* ptr to RQ buffers */
172 173
173 uint32_t q_mode;
174 uint16_t page_count; /* Number of pages allocated for this queue */ 174 uint16_t page_count; /* Number of pages allocated for this queue */
175 uint16_t page_size; /* size of page allocated for this queue */ 175 uint16_t page_size; /* size of page allocated for this queue */
176#define LPFC_EXPANDED_PAGE_SIZE 16384 176#define LPFC_EXPANDED_PAGE_SIZE 16384
177#define LPFC_DEFAULT_PAGE_SIZE 4096 177#define LPFC_DEFAULT_PAGE_SIZE 4096
178 uint16_t chann; /* IO channel this queue is associated with */ 178 uint16_t chann; /* Hardware Queue association WQ/CQ */
179 /* CPU affinity for EQ */
180#define LPFC_FIND_BY_EQ 0
181#define LPFC_FIND_BY_HDWQ 1
179 uint8_t db_format; 182 uint8_t db_format;
180#define LPFC_DB_RING_FORMAT 0x01 183#define LPFC_DB_RING_FORMAT 0x01
181#define LPFC_DB_LIST_FORMAT 0x02 184#define LPFC_DB_LIST_FORMAT 0x02
@@ -431,11 +434,6 @@ struct lpfc_hba_eq_hdl {
431 uint32_t idx; 434 uint32_t idx;
432 char handler_name[LPFC_SLI4_HANDLER_NAME_SZ]; 435 char handler_name[LPFC_SLI4_HANDLER_NAME_SZ];
433 struct lpfc_hba *phba; 436 struct lpfc_hba *phba;
434 atomic_t hba_eq_in_use;
435 struct cpumask *cpumask;
436 /* CPU affinitsed to or 0xffffffff if multiple */
437 uint32_t cpu;
438#define LPFC_MULTI_CPU_AFFINITY 0xffffffff
439}; 437};
440 438
441/*BB Credit recovery value*/ 439/*BB Credit recovery value*/
@@ -529,7 +527,9 @@ struct lpfc_vector_map_info {
529 uint16_t phys_id; 527 uint16_t phys_id;
530 uint16_t core_id; 528 uint16_t core_id;
531 uint16_t irq; 529 uint16_t irq;
530 uint16_t eq;
532 uint16_t hdwq; 531 uint16_t hdwq;
532 uint16_t hyper;
533}; 533};
534#define LPFC_VECTOR_MAP_EMPTY 0xffff 534#define LPFC_VECTOR_MAP_EMPTY 0xffff
535 535
@@ -593,6 +593,21 @@ struct lpfc_fc4_ctrl_stat {
593 u32 io_cmpls; 593 u32 io_cmpls;
594}; 594};
595 595
596#ifdef LPFC_HDWQ_LOCK_STAT
597struct lpfc_lock_stat {
598 uint32_t alloc_xri_get;
599 uint32_t alloc_xri_put;
600 uint32_t free_xri;
601 uint32_t wq_access;
602 uint32_t alloc_pvt_pool;
603 uint32_t mv_from_pvt_pool;
604 uint32_t mv_to_pub_pool;
605 uint32_t mv_to_pvt_pool;
606 uint32_t free_pub_pool;
607 uint32_t free_pvt_pool;
608};
609#endif
610
596/* SLI4 HBA data structure entries */ 611/* SLI4 HBA data structure entries */
597struct lpfc_sli4_hdw_queue { 612struct lpfc_sli4_hdw_queue {
598 /* Pointers to the constructed SLI4 queues */ 613 /* Pointers to the constructed SLI4 queues */
@@ -626,6 +641,9 @@ struct lpfc_sli4_hdw_queue {
626 /* FC-4 Stats counters */ 641 /* FC-4 Stats counters */
627 struct lpfc_fc4_ctrl_stat nvme_cstat; 642 struct lpfc_fc4_ctrl_stat nvme_cstat;
628 struct lpfc_fc4_ctrl_stat scsi_cstat; 643 struct lpfc_fc4_ctrl_stat scsi_cstat;
644#ifdef LPFC_HDWQ_LOCK_STAT
645 struct lpfc_lock_stat lock_conflict;
646#endif
629 647
630#ifdef CONFIG_SCSI_LPFC_DEBUG_FS 648#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
631#define LPFC_CHECK_CPU_CNT 128 649#define LPFC_CHECK_CPU_CNT 128
@@ -635,6 +653,34 @@ struct lpfc_sli4_hdw_queue {
635#endif 653#endif
636}; 654};
637 655
656#ifdef LPFC_HDWQ_LOCK_STAT
657/* compile time trylock stats */
658#define lpfc_qp_spin_lock_irqsave(lock, flag, qp, lstat) \
659 { \
660 int only_once = 1; \
661 while (spin_trylock_irqsave(lock, flag) == 0) { \
662 if (only_once) { \
663 only_once = 0; \
664 qp->lock_conflict.lstat++; \
665 } \
666 } \
667 }
668#define lpfc_qp_spin_lock(lock, qp, lstat) \
669 { \
670 int only_once = 1; \
671 while (spin_trylock(lock) == 0) { \
672 if (only_once) { \
673 only_once = 0; \
674 qp->lock_conflict.lstat++; \
675 } \
676 } \
677 }
678#else
679#define lpfc_qp_spin_lock_irqsave(lock, flag, qp, lstat) \
680 spin_lock_irqsave(lock, flag)
681#define lpfc_qp_spin_lock(lock, qp, lstat) spin_lock(lock)
682#endif
683
638struct lpfc_sli4_hba { 684struct lpfc_sli4_hba {
639 void __iomem *conf_regs_memmap_p; /* Kernel memory mapped address for 685 void __iomem *conf_regs_memmap_p; /* Kernel memory mapped address for
640 * config space registers 686 * config space registers
@@ -764,6 +810,8 @@ struct lpfc_sli4_hba {
764 uint16_t nvmet_xri_cnt; 810 uint16_t nvmet_xri_cnt;
765 uint16_t nvmet_io_wait_cnt; 811 uint16_t nvmet_io_wait_cnt;
766 uint16_t nvmet_io_wait_total; 812 uint16_t nvmet_io_wait_total;
813 uint16_t cq_max;
814 struct lpfc_queue **cq_lookup;
767 struct list_head lpfc_els_sgl_list; 815 struct list_head lpfc_els_sgl_list;
768 struct list_head lpfc_abts_els_sgl_list; 816 struct list_head lpfc_abts_els_sgl_list;
769 spinlock_t abts_scsi_buf_list_lock; /* list of aborted SCSI IOs */ 817 spinlock_t abts_scsi_buf_list_lock; /* list of aborted SCSI IOs */