diff mbox series

[v2,17/18] megaraid_sas: Introduce various Aero performance modes

Message ID 20190620105208.15011-18-chandrakanth.patil@broadcom.com (mailing list archive)
State Superseded
Headers show
Series megaraid_sas: driver updates to 07.710.06.00-rc1 | expand

Commit Message

Chandrakanth patil June 20, 2019, 10:52 a.m. UTC
For Aero adapters, driver provides three different  performance modes controlled
through module parameter named- 'perf_mode'. Below are those performance modes:

 0: Balanced - Additional high IOPs reply queues will be enabled along with
    low latency queues. Interrupt coalescing will be enabled only for these
    high IOPs reply queues.

 1: IOPs - No additional high IOPs queues are enabled. Interrupt coalescing will be
    enabled on all reply queues.

 2: Latency - No additional high IOPs queues are enabled. Interrupt coalescing will be
    disabled on all reply queues. This is a legacy behavior similar to Ventura & Invader
    Series.

Default performance mode settings:
-Performance mode set to 'Balanced', if Aero controller is working in 16GT/s PCIe speed.
-Performance mode will be set to 'Latency' mode for all other cases.

Through module parameter- 'perf_mode', user can override default performance mode to
desired one.

Captured below some performance numbers with these performance modes.
4k Random Read IO performance numbers on 24 SAS SSD drives for above three
permormance modes. Performance data is from Intel Skylake and HGST SS300
(drive model SDLL1DLR400GCCA1).

IOPs:
 -----------------------------------------------------------------------
  |perf_mode    | qd = 1 | qd = 64 |   note                             |
  |-------------|--------|---------|-------------------------------------
  |balanced     |  259K  |  3061k  | Provides max performance numbers   |
  |             |        |         | both on lower QD workload &        |
  |             |        |         | also on higher QD workload         |
  |-------------|--------|---------|-------------------------------------
  |iops         |  220K  |  3100k  | Provides max performance numbers   |
  |             |        |         | only on higher QD workload.        |
  |-------------|--------|---------|-------------------------------------
  |latency      |  246k  |  2226k  | Provides good performance numbers  |
  |             |        |         | only on lower QD worklaod.         |
  -----------------------------------------------------------------------

Average Latency:
  -----------------------------------------------------
  |perf_mode    |  qd = 1      |    qd = 64           |
  |-------------|--------------|----------------------|
  |balanced     |  92.05 usec  |    501.12 usec       |
  |-------------|--------------|----------------------|
  |iops         |  108.40 usec |    498.10 usec       |
  |-------------|--------------|----------------------|
  |latency      |  97.10 usec  |    689.26 usec       |
  -----------------------------------------------------

Signed-off-by: Sumit Saxena <sumit.saxena@broadcom.com>
Signed-off-by: Chandrakanth Patil <chandrakanth.patil@broadcom.com>
---
 drivers/scsi/megaraid/megaraid_sas.h        | 14 ++++++-
 drivers/scsi/megaraid/megaraid_sas_base.c   | 60 +++++++++++++++++++++++++----
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 22 +++++++----
 3 files changed, 81 insertions(+), 15 deletions(-)

Comments

Dan Carpenter June 24, 2019, 9:05 a.m. UTC | #1
Hi Chandrakanth,

url:    https://github.com/0day-ci/linux/commits/Chandrakanth-Patil/megaraid_sas-driver-updates-to-07-710-06-00-rc1/20190621-003611
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
drivers/scsi/megaraid/megaraid_sas_base.c:6031 megasas_init_fw() warn: curly braces intended?

Old smatch warnings:
drivers/scsi/megaraid/megaraid_sas_base.c:1883 megasas_set_dynamic_target_properties() warn: if statement not indented
drivers/scsi/megaraid/megaraid_sas_base.c:3445 megasas_complete_cmd() error: we previously assumed 'cmd->scmd' could be null (see line 3412)
drivers/scsi/megaraid/megaraid_sas_base.c:6015 megasas_init_fw() error: we previously assumed 'fusion' could be null (see line 5914)

# https://github.com/0day-ci/linux/commit/0020c0465179c06d4dac82747eeffccc59b9a6e4
git remote add linux-review https://github.com/0day-ci/linux
git remote update linux-review
git checkout 0020c0465179c06d4dac82747eeffccc59b9a6e4
vim +6031 drivers/scsi/megaraid/megaraid_sas_base.c

0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6018  			/*
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6019  			 * Performance mode settings provided through module parameter-perf_mode will
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6020  			 * take affect only for:
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6021  			 * 1. Aero family of adapters.
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6022  			 * 2. When user sets module parameter- perf_mode in range of 0-2.
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6023  			 */
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6024  			if ((perf_mode >= MR_BALANCED_PERF_MODE) &&
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6025  				(perf_mode <= MR_LATENCY_PERF_MODE))
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6026  				instance->perf_mode = perf_mode;
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6027  			/*
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6028  			 * If intr coalescing is not supported by controller FW, then IOPs
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6029  			 * and Balanced modes are not feasible.
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6030  			 */
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20 @6031  				if (!intr_coalescing)

This if statement is indented as if it's part of the earlier condition
but the comments aren't so it's not clear what was intended.

0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6032  					instance->perf_mode = MR_LATENCY_PERF_MODE;
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6033  
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6034  		}
ea76a259b5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6035  
0020c04651 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6036  		if (instance->perf_mode == MR_BALANCED_PERF_MODE)
ea76a259b5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6037  			instance->low_latency_index_start =
ea76a259b5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6038  				MR_HIGH_IOPS_QUEUE_COUNT;
ea76a259b5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6039  		else
ea76a259b5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6040  			instance->low_latency_index_start = 1;
ea76a259b5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6041  
ea76a259b5 drivers/scsi/megaraid/megaraid_sas_base.c Chandrakanth Patil         2019-06-20  6042  		num_msix_req = num_online_cpus() + instance->low_latency_index_start;

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox series

Patch

diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h
index 3f4cb52..0b38691 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2256,6 +2256,18 @@  enum MR_PD_TYPE {
 #define MR_DEVICE_HIGH_IOPS_DEPTH	8
 #define MR_HIGH_IOPS_BATCH_COUNT	16
 
+enum MR_PERF_MODE {
+	MR_BALANCED_PERF_MODE		= 0,
+	MR_IOPS_PERF_MODE		= 1,
+	MR_LATENCY_PERF_MODE		= 2,
+};
+
+#define MEGASAS_PERF_MODE_2STR(mode) \
+		((mode) == MR_BALANCED_PERF_MODE ? "Balanced" : \
+		 (mode) == MR_IOPS_PERF_MODE ? "IOPs" : \
+		 (mode) == MR_LATENCY_PERF_MODE ? "Latency" : \
+		 "Unknown")
+
 struct megasas_instance {
 
 	unsigned int *reply_map;
@@ -2441,7 +2453,7 @@  struct megasas_instance {
 	bool support_seqnum_jbod_fp;
 	bool support_pci_lane_margining;
 	u8  low_latency_index_start;
-	bool balanced_mode;
+	int perf_mode;
 };
 
 struct MR_LD_VF_MAP {
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index fec3e57..9233b22 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -105,6 +105,18 @@  unsigned int scmd_timeout = MEGASAS_DEFAULT_CMD_TIMEOUT;
 module_param(scmd_timeout, int, 0444);
 MODULE_PARM_DESC(scmd_timeout, "scsi command timeout (10-90s), default 90s. See megasas_reset_timer.");
 
+int perf_mode = -1;
+module_param(perf_mode, int, 0444);
+MODULE_PARM_DESC(perf_mode, "Performance mode (only for Aero adapters), options:\n\t\t"
+		"0 - balanced: High iops and low latency queues are allocated &\n\t\t"
+		"interrupt coalescing is enabled only on high iops queues\n\t\t"
+		"1 - iops: High iops queues are not allocated &\n\t\t"
+		"interrupt coalescing is enabled on all queues\n\t\t"
+		"2 - latency: High iops queues are not allocated &\n\t\t"
+		"interrupt coalescing is disabled on all queues\n\t\t"
+		"default mode is 'balanced'"
+		);
+
 MODULE_LICENSE("GPL");
 MODULE_VERSION(MEGASAS_VERSION);
 MODULE_AUTHOR("megaraidlinux.pdl@broadcom.com");
@@ -5472,7 +5484,7 @@  megasas_setup_irqs_ioapic(struct megasas_instance *instance)
 				__func__, __LINE__);
 		return -1;
 	}
-	instance->balanced_mode = false;
+	instance->perf_mode = MR_LATENCY_PERF_MODE;
 	instance->low_latency_index_start = 0;
 	return 0;
 }
@@ -5683,7 +5695,7 @@  megasas_set_high_iops_queue_affinity_hint(struct megasas_instance *instance)
 	int i;
 	int local_numa_node;
 
-	if (instance->balanced_mode) {
+	if (instance->perf_mode == MR_BALANCED_PERF_MODE) {
 		local_numa_node = dev_to_node(&instance->pdev->dev);
 
 		for (i = 0; i < instance->low_latency_index_start; i++)
@@ -5726,11 +5738,12 @@  megasas_alloc_irq_vectors(struct megasas_instance *instance)
 
 	i = __megasas_alloc_irq_vectors(instance);
 
-	if (instance->balanced_mode && (i != instance->msix_vectors)) {
+	if ((instance->perf_mode == MR_BALANCED_PERF_MODE) &&
+		(i != instance->msix_vectors)) {
 		if (instance->msix_vectors)
 			pci_free_irq_vectors(instance->pdev);
 		/*Disable Balanced IOPs mode and try realloc vectors*/
-		instance->balanced_mode = false;
+		instance->perf_mode = MR_LATENCY_PERF_MODE;
 		instance->low_latency_index_start = 1;
 		num_msix_req = num_online_cpus() + instance->low_latency_index_start;
 
@@ -5774,6 +5787,7 @@  static int megasas_init_fw(struct megasas_instance *instance)
 	struct fusion_context *fusion;
 	bool intr_coalescing;
 	unsigned int num_msix_req;
+	u16 lnksta, speed;
 
 	fusion = instance->ctrl_context;
 
@@ -5983,11 +5997,43 @@  static int megasas_init_fw(struct megasas_instance *instance)
 		if (intr_coalescing &&
 			(num_online_cpus() >= MR_HIGH_IOPS_QUEUE_COUNT) &&
 			(instance->msix_vectors == MEGASAS_MAX_MSIX_QUEUES))
-			instance->balanced_mode = true;
+			instance->perf_mode = MR_BALANCED_PERF_MODE;
 		else
-			instance->balanced_mode = false;
+			instance->perf_mode = MR_LATENCY_PERF_MODE;
+
+
+		if (instance->adapter_type == AERO_SERIES) {
+			pcie_capability_read_word(instance->pdev, PCI_EXP_LNKSTA, &lnksta);
+			speed = lnksta & PCI_EXP_LNKSTA_CLS;
+
+			/*
+			 * For Aero, if PCIe link speed is <16 GT/s, then driver should operate
+			 * in latency perf mode and enable R1 PCI bandwidth algorithm
+			 */
+			if (speed < 0x4) {
+				instance->perf_mode = MR_LATENCY_PERF_MODE;
+				fusion->pcie_bw_limitation = true;
+			}
+
+			/*
+			 * Performance mode settings provided through module parameter-perf_mode will
+			 * take affect only for:
+			 * 1. Aero family of adapters.
+			 * 2. When user sets module parameter- perf_mode in range of 0-2.
+			 */
+			if ((perf_mode >= MR_BALANCED_PERF_MODE) &&
+				(perf_mode <= MR_LATENCY_PERF_MODE))
+				instance->perf_mode = perf_mode;
+			/*
+			 * If intr coalescing is not supported by controller FW, then IOPs
+			 * and Balanced modes are not feasible.
+			 */
+				if (!intr_coalescing)
+					instance->perf_mode = MR_LATENCY_PERF_MODE;
+
+		}
 
-		if (instance->balanced_mode)
+		if (instance->perf_mode == MR_BALANCED_PERF_MODE)
 			instance->low_latency_index_start =
 				MR_HIGH_IOPS_QUEUE_COUNT;
 		else
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 90dced4..8a3e255 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1097,10 +1097,10 @@  megasas_ioc_init_fusion(struct megasas_instance *instance)
 
 	if ((instance->low_latency_index_start ==
 		MR_HIGH_IOPS_QUEUE_COUNT) && cur_intr_coalescing)
-		instance->balanced_mode = true;
+		instance->perf_mode = MR_BALANCED_PERF_MODE;
 
-	dev_info(&instance->pdev->dev, "Balanced mode :%s\n",
-		instance->balanced_mode ? "Yes" : "No");
+	dev_info(&instance->pdev->dev, "Performance mode :%s\n",
+		MEGASAS_PERF_MODE_2STR(instance->perf_mode));
 
 	instance->fw_sync_cache_support = (scratch_pad_1 &
 		MR_CAN_HANDLE_SYNC_CACHE_OFFSET) ? 1 : 0;
@@ -1190,9 +1190,17 @@  megasas_ioc_init_fusion(struct megasas_instance *instance)
 	 * Each bit in replyqueue_mask represents one group of MSI-x vectors
 	 * (each group has 8 vectors)
 	 */
-	if (instance->balanced_mode)
+	switch (instance->perf_mode) {
+	case MR_BALANCED_PERF_MODE:
 		init_frame->replyqueue_mask =
-		       cpu_to_le16(~(~0 << instance->low_latency_index_start / 8));
+		       cpu_to_le16(~(~0 << instance->low_latency_index_start/8));
+		break;
+	case MR_IOPS_PERF_MODE:
+		init_frame->replyqueue_mask =
+		       cpu_to_le16(~(~0 << instance->msix_vectors/8));
+		break;
+	}
+
 
 	req_desc.u.low = cpu_to_le32(lower_32_bits(cmd->frame_phys_addr));
 	req_desc.u.high = cpu_to_le32(upper_32_bits(cmd->frame_phys_addr));
@@ -2831,7 +2839,7 @@  megasas_build_ldio_fusion(struct megasas_instance *instance,
 			fp_possible = (io_info.fpOkForIo > 0) ? true : false;
 	}
 
-	if (instance->balanced_mode &&
+	if ((instance->perf_mode == MR_BALANCED_PERF_MODE) &&
 		atomic_read(&scp->device->device_busy) >
 		(io_info.data_arms * MR_DEVICE_HIGH_IOPS_DEPTH))
 		cmd->request_desc->SCSIIO.MSIxIndex =
@@ -3164,7 +3172,7 @@  megasas_build_syspd_fusion(struct megasas_instance *instance,
 
 	cmd->request_desc->SCSIIO.DevHandle = io_request->DevHandle;
 
-	if (instance->balanced_mode &&
+	if ((instance->perf_mode == MR_BALANCED_PERF_MODE) &&
 		atomic_read(&scmd->device->device_busy) > MR_DEVICE_HIGH_IOPS_DEPTH)
 		cmd->request_desc->SCSIIO.MSIxIndex =
 			mega_mod64((atomic64_add_return(1, &instance->high_iops_outstanding) /