linux-block.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 1/4] add io_uring with IOPOLL support in scsi layer
       [not found] <20201203034100.29716-1-kashyap.desai@broadcom.com>
@ 2020-12-03  3:40 ` Kashyap Desai
  2020-12-03 12:51   ` Hannes Reinecke
  2020-12-04  8:53   ` John Garry
  2020-12-03  3:40 ` [PATCH v2 2/4] megaraid_sas: iouring iopoll support Kashyap Desai
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 13+ messages in thread
From: Kashyap Desai @ 2020-12-03  3:40 UTC (permalink / raw)
  To: linux-scsi; +Cc: Kashyap Desai, sumit.saxena, chandrakanth.patil, linux-block

[-- Attachment #1: Type: text/plain, Size: 3332 bytes --]

io_uring with IOPOLL is not currently supported in scsi mid layer.
Outside of that everything else should work and no extra support
in the driver is needed.

Currently io_uring with IOPOLL support is only available in block layer.
This patch is to extend support of mq_poll in scsi layer.

Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Cc: sumit.saxena@broadcom.com
Cc: chandrakanth.patil@broadcom.com
Cc: linux-block@vger.kernel.org

---
 drivers/scsi/scsi_lib.c  | 16 ++++++++++++++++
 include/scsi/scsi_cmnd.h |  1 +
 include/scsi/scsi_host.h | 11 +++++++++++
 3 files changed, 28 insertions(+)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index b7ac14571415..8675900ccc27 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1786,6 +1786,19 @@ static void scsi_mq_exit_request(struct blk_mq_tag_set *set, struct request *rq,
 			       cmd->sense_buffer);
 }
 
+
+static int scsi_mq_poll(struct blk_mq_hw_ctx *hctx)
+{
+	struct request_queue *q = hctx->queue;
+	struct scsi_device *sdev = q->queuedata;
+	struct Scsi_Host *shost = sdev->host;
+
+	if (shost->hostt->mq_poll)
+		return shost->hostt->mq_poll(shost, hctx->queue_num);
+
+	return 0;
+}
+
 static int scsi_map_queues(struct blk_mq_tag_set *set)
 {
 	struct Scsi_Host *shost = container_of(set, struct Scsi_Host, tag_set);
@@ -1853,6 +1866,7 @@ static const struct blk_mq_ops scsi_mq_ops_no_commit = {
 	.cleanup_rq	= scsi_cleanup_rq,
 	.busy		= scsi_mq_lld_busy,
 	.map_queues	= scsi_map_queues,
+	.poll		= scsi_mq_poll,
 };
 
 
@@ -1881,6 +1895,7 @@ static const struct blk_mq_ops scsi_mq_ops = {
 	.cleanup_rq	= scsi_cleanup_rq,
 	.busy		= scsi_mq_lld_busy,
 	.map_queues	= scsi_map_queues,
+	.poll		= scsi_mq_poll,
 };
 
 struct request_queue *scsi_mq_alloc_queue(struct scsi_device *sdev)
@@ -1913,6 +1928,7 @@ int scsi_mq_setup_tags(struct Scsi_Host *shost)
 	else
 		tag_set->ops = &scsi_mq_ops_no_commit;
 	tag_set->nr_hw_queues = shost->nr_hw_queues ? : 1;
+	tag_set->nr_maps = shost->nr_maps ? : 1;
 	tag_set->queue_depth = shost->can_queue;
 	tag_set->cmd_size = cmd_size;
 	tag_set->numa_node = NUMA_NO_NODE;
diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
index 69ade4fb71aa..3f5b5b7a556f 100644
--- a/include/scsi/scsi_cmnd.h
+++ b/include/scsi/scsi_cmnd.h
@@ -10,6 +10,7 @@
 #include <linux/timer.h>
 #include <linux/scatterlist.h>
 #include <scsi/scsi_device.h>
+#include <scsi/scsi_host.h>
 #include <scsi/scsi_request.h>
 
 struct Scsi_Host;
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index 701f178b20ae..a0cda0f66b84 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -270,6 +270,16 @@ struct scsi_host_template {
 	 */
 	int (* map_queues)(struct Scsi_Host *shost);
 
+	/*
+	 * SCSI interface of blk_poll - poll for IO completions.
+	 * Possible interface only if scsi LLD expose multiple h/w queues.
+	 *
+	 * Return value: Number of completed entries found.
+	 *
+	 * Status: OPTIONAL
+	 */
+	int (* mq_poll)(struct Scsi_Host *shost, unsigned int queue_num);
+
 	/*
 	 * Check if scatterlists need to be padded for DMA draining.
 	 *
@@ -610,6 +620,7 @@ struct Scsi_Host {
 	 * the total queue depth is can_queue.
 	 */
 	unsigned nr_hw_queues;
+	unsigned nr_maps;
 	unsigned active_mode:2;
 	unsigned unchecked_isa_dma:1;
 
-- 
2.18.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4169 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 2/4] megaraid_sas: iouring iopoll support
       [not found] <20201203034100.29716-1-kashyap.desai@broadcom.com>
  2020-12-03  3:40 ` [PATCH v2 1/4] add io_uring with IOPOLL support in scsi layer Kashyap Desai
@ 2020-12-03  3:40 ` Kashyap Desai
  2020-12-03 12:57   ` Hannes Reinecke
  2020-12-03 13:23   ` kernel test robot
  2020-12-03  3:40 ` [PATCH v2 3/4] scsi_debug : " Kashyap Desai
       [not found] ` <20201203034100.29716-5-kashyap.desai@broadcom.com>
  3 siblings, 2 replies; 13+ messages in thread
From: Kashyap Desai @ 2020-12-03  3:40 UTC (permalink / raw)
  To: linux-scsi; +Cc: Kashyap Desai, sumit.saxena, chandrakanth.patil, linux-block

[-- Attachment #1: Type: text/plain, Size: 12392 bytes --]

Add support of iouring iopoll interface. This feature requires shared
hosttag support in kernel and driver.

Driver will work in non-IRQ mode = There will not be any msix vector
associated for poll_queues and h/w can still work in this mode.
MegaRaid h/w is single submission queue and multiple reply queue, but
using shared host tagset support it will enable simulated multiple hw queue.

Driver allocates some extra reply queues and it will be marked as poll_queue.
These poll_queues will not have associated msix vectors. All the IO
completion on this queue will be done from IOPOLL interface.

megaraid_sas driver having 8 poll_queues and using io_uring hiprio=1 settings,
It can reach 3.2M IOPs and there is zero interrupt generated by h/w.

This feature can be enabled using module parameter poll_queues.

Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Cc: sumit.saxena@broadcom.com
Cc: chandrakanth.patil@broadcom.com
Cc: linux-block@vger.kernel.org
---
 drivers/scsi/megaraid/megaraid_sas.h        |  2 +
 drivers/scsi/megaraid/megaraid_sas_base.c   | 90 ++++++++++++++++++---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 43 +++++++++-
 drivers/scsi/megaraid/megaraid_sas_fusion.h |  3 +
 4 files changed, 127 insertions(+), 11 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h
index 0f808d63580e..0d58b123f0d0 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2212,6 +2212,7 @@ struct megasas_irq_context {
 	struct irq_poll irqpoll;
 	bool irq_poll_scheduled;
 	bool irq_line_enable;
+	atomic_t   in_used;
 };
 
 struct MR_DRV_SYSTEM_INFO {
@@ -2446,6 +2447,7 @@ struct megasas_instance {
 	bool support_pci_lane_margining;
 	u8  low_latency_index_start;
 	int perf_mode;
+	int iopoll_q_count;
 };
 
 struct MR_LD_VF_MAP {
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index af192096a82b..c9987411d215 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -114,6 +114,15 @@ unsigned int enable_sdev_max_qd;
 module_param(enable_sdev_max_qd, int, 0444);
 MODULE_PARM_DESC(enable_sdev_max_qd, "Enable sdev max qd as can_queue. Default: 0");
 
+int poll_queues;
+module_param(poll_queues, int, 0444);
+MODULE_PARM_DESC(poll_queues, "Number of queues to be use for io_uring poll mode.\n\t\t"
+		"This parameter is effective only if host_tagset_enable=1 &\n\t\t"
+		"It is not applicable for MFI_SERIES. &\n\t\t"
+		"Driver will work in latency mode. &\n\t\t"
+		"High iops queues are not allocated &\n\t\t"
+		);
+
 int host_tagset_enable = 1;
 module_param(host_tagset_enable, int, 0444);
 MODULE_PARM_DESC(host_tagset_enable, "Shared host tagset enable/disable Default: enable(1)");
@@ -207,6 +216,7 @@ static bool support_pci_lane_margining;
 static spinlock_t poll_aen_lock;
 
 extern struct dentry *megasas_debugfs_root;
+extern int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num);
 
 void
 megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
@@ -3127,14 +3137,45 @@ megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev,
 static int megasas_map_queues(struct Scsi_Host *shost)
 {
 	struct megasas_instance *instance;
+	int i, qoff, offset;
 
 	instance = (struct megasas_instance *)shost->hostdata;
 
 	if (shost->nr_hw_queues == 1)
 		return 0;
 
-	return blk_mq_pci_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT],
-			instance->pdev, instance->low_latency_index_start);
+	offset = instance->low_latency_index_start;
+
+	for (i = 0, qoff = 0; i < HCTX_MAX_TYPES; i++) {
+		struct blk_mq_queue_map *map = &shost->tag_set.map[i];
+
+		map->nr_queues  = 0;
+
+		if (i == HCTX_TYPE_DEFAULT)
+			map->nr_queues = instance->msix_vectors - offset;
+		else if (i == HCTX_TYPE_POLL)
+			map->nr_queues = instance->iopoll_q_count;
+
+		if (!map->nr_queues) {
+			BUG_ON(i == HCTX_TYPE_DEFAULT);
+			continue;
+		}
+
+		/*
+		 * The poll queue(s) doesn't have an IRQ (and hence IRQ
+		 * affinity), so use the regular blk-mq cpu mapping
+		 */
+		map->queue_offset = qoff;
+		if (i != HCTX_TYPE_POLL)
+			blk_mq_pci_map_queues(map, instance->pdev, offset);
+		else
+			blk_mq_map_queues(map);
+
+		qoff += map->nr_queues;
+		offset += map->nr_queues;
+	}
+
+	return 0;
 }
 
 static void megasas_aen_polling(struct work_struct *work);
@@ -3446,6 +3487,7 @@ static struct scsi_host_template megasas_template = {
 	.shost_attrs = megaraid_host_attrs,
 	.bios_param = megasas_bios_param,
 	.map_queues = megasas_map_queues,
+	.mq_poll = megasas_blk_mq_poll,
 	.change_queue_depth = scsi_change_queue_depth,
 	.max_segment_size = 0xffffffff,
 };
@@ -5834,13 +5876,16 @@ __megasas_alloc_irq_vectors(struct megasas_instance *instance)
 	irq_flags = PCI_IRQ_MSIX;
 
 	if (instance->smp_affinity_enable)
-		irq_flags |= PCI_IRQ_AFFINITY;
+		irq_flags |= PCI_IRQ_AFFINITY | PCI_IRQ_ALL_TYPES;
 	else
 		descp = NULL;
 
+	/* Do not allocate msix vectors for poll_queues.
+	 * msix_vectors is always within a range of FW supported reply queue.
+	 */
 	i = pci_alloc_irq_vectors_affinity(instance->pdev,
 		instance->low_latency_index_start,
-		instance->msix_vectors, irq_flags, descp);
+		instance->msix_vectors - instance->iopoll_q_count, irq_flags, descp);
 
 	return i;
 }
@@ -5856,10 +5901,25 @@ megasas_alloc_irq_vectors(struct megasas_instance *instance)
 	int i;
 	unsigned int num_msix_req;
 
+	instance->iopoll_q_count = 0;
+	if ((instance->adapter_type != MFI_SERIES) &&
+		poll_queues) {
+
+		instance->perf_mode = MR_LATENCY_PERF_MODE;
+		instance->low_latency_index_start = 1;
+
+		/* reserve for default and non-mananged pre-vector. */
+		if (instance->msix_vectors > (instance->iopoll_q_count + 2))
+			instance->iopoll_q_count = poll_queues;
+		else
+			instance->iopoll_q_count = 0;
+	}
+
 	i = __megasas_alloc_irq_vectors(instance);
 
-	if ((instance->perf_mode == MR_BALANCED_PERF_MODE) &&
-	    (i != instance->msix_vectors)) {
+	if (((instance->perf_mode == MR_BALANCED_PERF_MODE)
+		|| instance->iopoll_q_count) &&
+	    (i != (instance->msix_vectors - instance->iopoll_q_count))) {
 		if (instance->msix_vectors)
 			pci_free_irq_vectors(instance->pdev);
 		/* Disable Balanced IOPS mode and try realloc vectors */
@@ -5870,12 +5930,15 @@ megasas_alloc_irq_vectors(struct megasas_instance *instance)
 		instance->msix_vectors = min(num_msix_req,
 				instance->msix_vectors);
 
+		instance->iopoll_q_count = 0;
 		i = __megasas_alloc_irq_vectors(instance);
 
 	}
 
 	dev_info(&instance->pdev->dev,
-		"requested/available msix %d/%d\n", instance->msix_vectors, i);
+		"requested/available msix %d/%d poll_queue %d\n",
+			instance->msix_vectors - instance->iopoll_q_count,
+			i, instance->iopoll_q_count);
 
 	if (i > 0)
 		instance->msix_vectors = i;
@@ -6841,12 +6904,18 @@ static int megasas_io_attach(struct megasas_instance *instance)
 		instance->smp_affinity_enable) {
 		host->host_tagset = 1;
 		host->nr_hw_queues = instance->msix_vectors -
-			instance->low_latency_index_start;
+			instance->low_latency_index_start + instance->iopoll_q_count;
+		if (instance->iopoll_q_count)
+			host->nr_maps = 3;
+	} else {
+		instance->iopoll_q_count = 0;
 	}
 
 	dev_info(&instance->pdev->dev,
-		"Max firmware commands: %d shared with nr_hw_queues = %d\n",
-		instance->max_fw_cmds, host->nr_hw_queues);
+		"Max firmware commands: %d shared with default "
+		"hw_queues = %d poll_queues %d\n", instance->max_fw_cmds,
+		host->nr_hw_queues - instance->iopoll_q_count,
+		instance->iopoll_q_count);
 	/*
 	 * Notify the mid-layer about the new controller
 	 */
@@ -8861,6 +8930,7 @@ static int __init megasas_init(void)
 		msix_vectors = 1;
 		rdpq_enable = 0;
 		dual_qdepth_disable = 1;
+		poll_queues = 0;
 	}
 
 	/*
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index fd607287608e..49c8cc3507e0 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -685,6 +685,8 @@ megasas_alloc_reply_fusion(struct megasas_instance *instance)
 	fusion = instance->ctrl_context;
 
 	count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
+	count += instance->iopoll_q_count;
+
 	fusion->reply_frames_desc_pool =
 			dma_pool_create("mr_reply", &instance->pdev->dev,
 				fusion->reply_alloc_sz * count, 16, 0);
@@ -779,6 +781,7 @@ megasas_alloc_rdpq_fusion(struct megasas_instance *instance)
 	}
 
 	msix_count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
+	msix_count += instance->iopoll_q_count;
 
 	fusion->reply_frames_desc_pool = dma_pool_create("mr_rdpq",
 							 &instance->pdev->dev,
@@ -1129,7 +1132,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
 			MPI2_IOCINIT_MSGFLAG_RDPQ_ARRAY_MODE : 0;
 	IOCInitMessage->SystemRequestFrameBaseAddress = cpu_to_le64(fusion->io_request_frames_phys);
 	IOCInitMessage->SenseBufferAddressHigh = cpu_to_le32(upper_32_bits(fusion->sense_phys_addr));
-	IOCInitMessage->HostMSIxVectors = instance->msix_vectors;
+	IOCInitMessage->HostMSIxVectors = instance->msix_vectors + instance->iopoll_q_count;
 	IOCInitMessage->HostPageSize = MR_DEFAULT_NVME_PAGE_SHIFT;
 
 	time = ktime_get_real();
@@ -1823,6 +1826,8 @@ megasas_init_adapter_fusion(struct megasas_instance *instance)
 		 sizeof(union MPI2_SGE_IO_UNION))/16;
 
 	count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
+	count += instance->iopoll_q_count;
+
 	for (i = 0 ; i < count; i++)
 		fusion->last_reply_idx[i] = 0;
 
@@ -1835,6 +1840,9 @@ megasas_init_adapter_fusion(struct megasas_instance *instance)
 				MEGASAS_FUSION_IOCTL_CMDS);
 	sema_init(&instance->ioctl_sem, MEGASAS_FUSION_IOCTL_CMDS);
 
+	for (i = 0; i < MAX_MSIX_QUEUES_FUSION; i++)
+		atomic_set(&fusion->busy_mq_poll[i], 0);
+
 	if (megasas_alloc_ioc_init_frame(instance))
 		return 1;
 
@@ -3500,6 +3508,9 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex,
 	if (reply_descript_type == MPI2_RPY_DESCRIPT_FLAGS_UNUSED)
 		return IRQ_NONE;
 
+	if (irq_context && !atomic_add_unless(&irq_context->in_used, 1, 1))
+		return 0;
+
 	num_completed = 0;
 
 	while (d_val.u.low != cpu_to_le32(UINT_MAX) &&
@@ -3613,6 +3624,7 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex,
 					irq_context->irq_line_enable = true;
 					irq_poll_sched(&irq_context->irqpoll);
 				}
+				atomic_dec(&irq_context->in_used);
 				return num_completed;
 			}
 		}
@@ -3630,9 +3642,36 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex,
 				instance->reply_post_host_index_addr[0]);
 		megasas_check_and_restore_queue_depth(instance);
 	}
+
+	if (irq_context)
+		atomic_dec(&irq_context->in_used);
+
 	return num_completed;
 }
 
+int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
+{
+
+	struct megasas_instance *instance;
+	int num_entries = 0;
+	struct fusion_context *fusion;
+
+	instance = (struct megasas_instance *)shost->hostdata;
+
+	fusion = instance->ctrl_context;
+
+	queue_num = queue_num + instance->low_latency_index_start;
+
+	if (!atomic_add_unless(&fusion->busy_mq_poll[queue_num], 1, 1))
+		return 0;
+
+	num_entries = complete_cmd_fusion(instance, queue_num, NULL);
+	atomic_dec(&fusion->busy_mq_poll[queue_num]);
+
+	return num_entries;
+}
+
+
 /**
  * megasas_enable_irq_poll() - enable irqpoll
  * @instance:			Adapter soft state
@@ -4164,6 +4203,8 @@ void  megasas_reset_reply_desc(struct megasas_instance *instance)
 
 	fusion = instance->ctrl_context;
 	count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
+	count += instance->iopoll_q_count;
+
 	for (i = 0 ; i < count ; i++) {
 		fusion->last_reply_idx[i] = 0;
 		reply_desc = fusion->reply_frames_desc[i];
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.h b/drivers/scsi/megaraid/megaraid_sas_fusion.h
index 30de4b01f703..242ff58a3404 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.h
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h
@@ -1303,6 +1303,9 @@ struct fusion_context {
 	u8 *sense;
 	dma_addr_t sense_phys_addr;
 
+	atomic_t   busy_mq_poll[MAX_MSIX_QUEUES_FUSION];
+
+
 	dma_addr_t reply_frames_desc_phys[MAX_MSIX_QUEUES_FUSION];
 	union MPI2_REPLY_DESCRIPTORS_UNION *reply_frames_desc[MAX_MSIX_QUEUES_FUSION];
 	struct rdpq_alloc_detail rdpq_tracker[RDPQ_MAX_CHUNK_COUNT];
-- 
2.18.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4169 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 3/4] scsi_debug : iouring iopoll support
       [not found] <20201203034100.29716-1-kashyap.desai@broadcom.com>
  2020-12-03  3:40 ` [PATCH v2 1/4] add io_uring with IOPOLL support in scsi layer Kashyap Desai
  2020-12-03  3:40 ` [PATCH v2 2/4] megaraid_sas: iouring iopoll support Kashyap Desai
@ 2020-12-03  3:40 ` Kashyap Desai
  2020-12-03 12:58   ` Hannes Reinecke
  2020-12-03 19:09   ` Douglas Gilbert
       [not found] ` <20201203034100.29716-5-kashyap.desai@broadcom.com>
  3 siblings, 2 replies; 13+ messages in thread
From: Kashyap Desai @ 2020-12-03  3:40 UTC (permalink / raw)
  To: linux-scsi; +Cc: Kashyap Desai, dgilbert, linux-block

[-- Attachment #1: Type: text/plain, Size: 6794 bytes --]

Add support of iouring iopoll interface in scsi_debug.
This feature requires shared hosttag support in kernel and driver.

Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
Acked-by: Douglas Gilbert <dgilbert@interlog.com>
Tested-by: Douglas Gilbert <dgilbert@interlog.com>

Cc: dgilbert@interlog.com
Cc: linux-block@vger.kernel.org
---
 drivers/scsi/scsi_debug.c | 130 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 130 insertions(+)

diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 24c0f7ec0351..4ced913f2b39 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -829,6 +829,7 @@ static int sdeb_zbc_max_open = DEF_ZBC_MAX_OPEN_ZONES;
 static int sdeb_zbc_nr_conv = DEF_ZBC_NR_CONV_ZONES;
 
 static int submit_queues = DEF_SUBMIT_QUEUES;  /* > 1 for multi-queue (mq) */
+static int poll_queues; /* iouring iopoll interface.*/
 static struct sdebug_queue *sdebug_q_arr;  /* ptr to array of submit queues */
 
 static DEFINE_RWLOCK(atomic_rw);
@@ -5432,6 +5433,14 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
 	cmnd->host_scribble = (unsigned char *)sqcp;
 	sd_dp = sqcp->sd_dp;
 	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
+
+	/* Do not complete IO from default completion path.
+	 * Let it to be on queue.
+	 * Completion should happen from mq_poll interface.
+	 */
+	if ((sqp - sdebug_q_arr) >= (submit_queues - poll_queues))
+		return 0;
+
 	if (!sd_dp) {
 		sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
 		if (!sd_dp) {
@@ -5615,6 +5624,7 @@ module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
 module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
 module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
 module_param_named(submit_queues, submit_queues, int, S_IRUGO);
+module_param_named(poll_queues, poll_queues, int, S_IRUGO);
 module_param_named(tur_ms_to_ready, sdeb_tur_ms_to_ready, int, S_IRUGO);
 module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
 module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
@@ -5677,6 +5687,7 @@ MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent
 MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
 MODULE_PARM_DESC(per_host_store, "If set, next positive add_host will get new store (def=0)");
 MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
+MODULE_PARM_DESC(poll_queues, "support for iouring iopoll queues (1 to max(submit_queues - 1)");
 MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
 MODULE_PARM_DESC(random, "If set, uniformly randomize command duration between 0 and delay_in_ns");
 MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
@@ -7200,6 +7211,104 @@ static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
 	return check_condition_result;
 }
 
+static int sdebug_map_queues(struct Scsi_Host *shost)
+{
+	int i, qoff;
+
+	if (shost->nr_hw_queues == 1)
+		return 0;
+
+	for (i = 0, qoff = 0; i < HCTX_MAX_TYPES; i++) {
+		struct blk_mq_queue_map *map = &shost->tag_set.map[i];
+
+		map->nr_queues  = 0;
+
+		if (i == HCTX_TYPE_DEFAULT)
+			map->nr_queues = submit_queues - poll_queues;
+		else if (i == HCTX_TYPE_POLL)
+			map->nr_queues = poll_queues;
+
+		if (!map->nr_queues) {
+			BUG_ON(i == HCTX_TYPE_DEFAULT);
+			continue;
+		}
+
+		map->queue_offset = qoff;
+		blk_mq_map_queues(map);
+
+		qoff += map->nr_queues;
+	}
+
+	return 0;
+
+}
+
+static int sdebug_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
+{
+	int qc_idx;
+	int retiring = 0;
+	unsigned long iflags;
+	struct sdebug_queue *sqp;
+	struct sdebug_queued_cmd *sqcp;
+	struct scsi_cmnd *scp;
+	struct sdebug_dev_info *devip;
+	int num_entries = 0;
+
+	sqp = sdebug_q_arr + queue_num;
+
+	do {
+		spin_lock_irqsave(&sqp->qc_lock, iflags);
+		qc_idx = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
+		if (unlikely((qc_idx < 0) || (qc_idx >= sdebug_max_queue)))
+			goto out;
+
+		sqcp = &sqp->qc_arr[qc_idx];
+		scp = sqcp->a_cmnd;
+		if (unlikely(scp == NULL)) {
+			pr_err("scp is NULL, queue_num=%d, qc_idx=%d from %s\n",
+			       queue_num, qc_idx, __func__);
+			goto out;
+		}
+		devip = (struct sdebug_dev_info *)scp->device->hostdata;
+		if (likely(devip))
+			atomic_dec(&devip->num_in_q);
+		else
+			pr_err("devip=NULL from %s\n", __func__);
+		if (unlikely(atomic_read(&retired_max_queue) > 0))
+			retiring = 1;
+
+		sqcp->a_cmnd = NULL;
+		if (unlikely(!test_and_clear_bit(qc_idx, sqp->in_use_bm))) {
+			pr_err("Unexpected completion sqp %p queue_num=%d qc_idx=%d from %s\n",
+				sqp, queue_num, qc_idx, __func__);
+			goto out;
+		}
+
+		if (unlikely(retiring)) {	/* user has reduced max_queue */
+			int k, retval;
+
+			retval = atomic_read(&retired_max_queue);
+			if (qc_idx >= retval) {
+				pr_err("index %d too large\n", retval);
+				goto out;
+			}
+			k = find_last_bit(sqp->in_use_bm, retval);
+			if ((k < sdebug_max_queue) || (k == retval))
+				atomic_set(&retired_max_queue, 0);
+			else
+				atomic_set(&retired_max_queue, k + 1);
+		}
+		spin_unlock_irqrestore(&sqp->qc_lock, iflags);
+		scp->scsi_done(scp); /* callback to mid level */
+		num_entries++;
+	} while (1);
+
+out:
+	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
+	return num_entries;
+}
+
+
 static int scsi_debug_queuecommand(struct Scsi_Host *shost,
 				   struct scsi_cmnd *scp)
 {
@@ -7379,6 +7488,8 @@ static struct scsi_host_template sdebug_driver_template = {
 	.ioctl =		scsi_debug_ioctl,
 	.queuecommand =		scsi_debug_queuecommand,
 	.change_queue_depth =	sdebug_change_qdepth,
+	.map_queues =		sdebug_map_queues,
+	.mq_poll =		sdebug_blk_mq_poll,
 	.eh_abort_handler =	scsi_debug_abort,
 	.eh_device_reset_handler = scsi_debug_device_reset,
 	.eh_target_reset_handler = scsi_debug_target_reset,
@@ -7426,6 +7537,25 @@ static int sdebug_driver_probe(struct device *dev)
 	if (sdebug_host_max_queue)
 		hpnt->host_tagset = 1;
 
+	/* poll queues are possible for nr_hw_queues > 1 */
+	if (hpnt->nr_hw_queues == 1 || (poll_queues < 1)) {
+		pr_warn("%s: trim poll_queues to 0. poll_q/nr_hw = (%d/%d)\n",
+			 my_name, poll_queues, hpnt->nr_hw_queues);
+		poll_queues = 0;
+	}
+
+	/*
+	 * Poll queues don't need interrupts, but we need at least one I/O queue
+	 * left over for non-polled I/O.
+	 * If condition not met, trim poll_queues to 1 (just for simplicity).
+	 */
+	if (poll_queues >= submit_queues) {
+		pr_warn("%s: trim poll_queues to 1\n", my_name);
+		poll_queues = 1;
+	}
+	if (poll_queues)
+		hpnt->nr_maps = 3;
+
 	sdbg_host->shost = hpnt;
 	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
 	if ((hpnt->this_id >= 0) && (sdebug_num_tgts > hpnt->this_id))
-- 
2.18.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4169 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 1/4] add io_uring with IOPOLL support in scsi layer
  2020-12-03  3:40 ` [PATCH v2 1/4] add io_uring with IOPOLL support in scsi layer Kashyap Desai
@ 2020-12-03 12:51   ` Hannes Reinecke
  2020-12-04  8:53   ` John Garry
  1 sibling, 0 replies; 13+ messages in thread
From: Hannes Reinecke @ 2020-12-03 12:51 UTC (permalink / raw)
  To: Kashyap Desai, linux-scsi; +Cc: sumit.saxena, chandrakanth.patil, linux-block

On 12/3/20 4:40 AM, Kashyap Desai wrote:
> io_uring with IOPOLL is not currently supported in scsi mid layer.
> Outside of that everything else should work and no extra support
> in the driver is needed.
> 
> Currently io_uring with IOPOLL support is only available in block layer.
> This patch is to extend support of mq_poll in scsi layer.
> 
> Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
> Cc: sumit.saxena@broadcom.com
> Cc: chandrakanth.patil@broadcom.com
> Cc: linux-block@vger.kernel.org
> 
> ---
>   drivers/scsi/scsi_lib.c  | 16 ++++++++++++++++
>   include/scsi/scsi_cmnd.h |  1 +
>   include/scsi/scsi_host.h | 11 +++++++++++
>   3 files changed, 28 insertions(+)
> 
Reviewed-by: Hannes Reinecke <hare@suse.de>

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                Kernel Storage Architect
hare@suse.de                              +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 2/4] megaraid_sas: iouring iopoll support
  2020-12-03  3:40 ` [PATCH v2 2/4] megaraid_sas: iouring iopoll support Kashyap Desai
@ 2020-12-03 12:57   ` Hannes Reinecke
  2021-02-01 13:55     ` Kashyap Desai
  2020-12-03 13:23   ` kernel test robot
  1 sibling, 1 reply; 13+ messages in thread
From: Hannes Reinecke @ 2020-12-03 12:57 UTC (permalink / raw)
  To: Kashyap Desai, linux-scsi; +Cc: sumit.saxena, chandrakanth.patil, linux-block

On 12/3/20 4:40 AM, Kashyap Desai wrote:
> Add support of iouring iopoll interface. This feature requires shared
> hosttag support in kernel and driver.
> 
> Driver will work in non-IRQ mode = There will not be any msix vector
> associated for poll_queues and h/w can still work in this mode.
> MegaRaid h/w is single submission queue and multiple reply queue, but
> using shared host tagset support it will enable simulated multiple hw queue.
> 
> Driver allocates some extra reply queues and it will be marked as poll_queue.
> These poll_queues will not have associated msix vectors. All the IO
> completion on this queue will be done from IOPOLL interface.
> 
> megaraid_sas driver having 8 poll_queues and using io_uring hiprio=1 settings,
> It can reach 3.2M IOPs and there is zero interrupt generated by h/w.
> 
> This feature can be enabled using module parameter poll_queues.
> 
> Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
> Cc: sumit.saxena@broadcom.com
> Cc: chandrakanth.patil@broadcom.com
> Cc: linux-block@vger.kernel.org
> ---
>   drivers/scsi/megaraid/megaraid_sas.h        |  2 +
>   drivers/scsi/megaraid/megaraid_sas_base.c   | 90 ++++++++++++++++++---
>   drivers/scsi/megaraid/megaraid_sas_fusion.c | 43 +++++++++-
>   drivers/scsi/megaraid/megaraid_sas_fusion.h |  3 +
>   4 files changed, 127 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h
> index 0f808d63580e..0d58b123f0d0 100644
> --- a/drivers/scsi/megaraid/megaraid_sas.h
> +++ b/drivers/scsi/megaraid/megaraid_sas.h
> @@ -2212,6 +2212,7 @@ struct megasas_irq_context {
>   	struct irq_poll irqpoll;
>   	bool irq_poll_scheduled;
>   	bool irq_line_enable;
> +	atomic_t   in_used;
>   };
>   
>   struct MR_DRV_SYSTEM_INFO {
> @@ -2446,6 +2447,7 @@ struct megasas_instance {
>   	bool support_pci_lane_margining;
>   	u8  low_latency_index_start;
>   	int perf_mode;
> +	int iopoll_q_count;
>   };
>   
>   struct MR_LD_VF_MAP {
> diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
> index af192096a82b..c9987411d215 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_base.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_base.c
> @@ -114,6 +114,15 @@ unsigned int enable_sdev_max_qd;
>   module_param(enable_sdev_max_qd, int, 0444);
>   MODULE_PARM_DESC(enable_sdev_max_qd, "Enable sdev max qd as can_queue. Default: 0");
>   
> +int poll_queues;
> +module_param(poll_queues, int, 0444);
> +MODULE_PARM_DESC(poll_queues, "Number of queues to be use for io_uring poll mode.\n\t\t"
> +		"This parameter is effective only if host_tagset_enable=1 &\n\t\t"
> +		"It is not applicable for MFI_SERIES. &\n\t\t"
> +		"Driver will work in latency mode. &\n\t\t"
> +		"High iops queues are not allocated &\n\t\t"
> +		);
> +
>   int host_tagset_enable = 1;
>   module_param(host_tagset_enable, int, 0444);
>   MODULE_PARM_DESC(host_tagset_enable, "Shared host tagset enable/disable Default: enable(1)");
> @@ -207,6 +216,7 @@ static bool support_pci_lane_margining;
>   static spinlock_t poll_aen_lock;
>   
>   extern struct dentry *megasas_debugfs_root;
> +extern int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num);
>   
>   void
>   megasas_complete_cmd(struct megasas_instance *instance, struct megasas_cmd *cmd,
> @@ -3127,14 +3137,45 @@ megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev,
>   static int megasas_map_queues(struct Scsi_Host *shost)
>   {
>   	struct megasas_instance *instance;
> +	int i, qoff, offset;
>   
>   	instance = (struct megasas_instance *)shost->hostdata;
>   
>   	if (shost->nr_hw_queues == 1)
>   		return 0;
>   
> -	return blk_mq_pci_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT],
> -			instance->pdev, instance->low_latency_index_start);
> +	offset = instance->low_latency_index_start;
> +
> +	for (i = 0, qoff = 0; i < HCTX_MAX_TYPES; i++) {
> +		struct blk_mq_queue_map *map = &shost->tag_set.map[i];
> +
> +		map->nr_queues  = 0;
> +
> +		if (i == HCTX_TYPE_DEFAULT)
> +			map->nr_queues = instance->msix_vectors - offset;
> +		else if (i == HCTX_TYPE_POLL)
> +			map->nr_queues = instance->iopoll_q_count;
> +
> +		if (!map->nr_queues) {
> +			BUG_ON(i == HCTX_TYPE_DEFAULT);
> +			continue;
> +		}
> +
> +		/*
> +		 * The poll queue(s) doesn't have an IRQ (and hence IRQ
> +		 * affinity), so use the regular blk-mq cpu mapping
> +		 */
> +		map->queue_offset = qoff;
> +		if (i != HCTX_TYPE_POLL)
> +			blk_mq_pci_map_queues(map, instance->pdev, offset);
> +		else
> +			blk_mq_map_queues(map);
> +
> +		qoff += map->nr_queues;
> +		offset += map->nr_queues;
> +	}
> +
Seeing that you only ever use HCTX_TYPE_DEFAULT and HCTX_TYPE_POLL that 
loop is a bit non-obvious; maybe it's better to unroll it and assigne 
the values manually.

> +	return 0;
>   }
>   
>   static void megasas_aen_polling(struct work_struct *work);
> @@ -3446,6 +3487,7 @@ static struct scsi_host_template megasas_template = {
>   	.shost_attrs = megaraid_host_attrs,
>   	.bios_param = megasas_bios_param,
>   	.map_queues = megasas_map_queues,
> +	.mq_poll = megasas_blk_mq_poll,
>   	.change_queue_depth = scsi_change_queue_depth,
>   	.max_segment_size = 0xffffffff,
>   };
> @@ -5834,13 +5876,16 @@ __megasas_alloc_irq_vectors(struct megasas_instance *instance)
>   	irq_flags = PCI_IRQ_MSIX;
>   
>   	if (instance->smp_affinity_enable)
> -		irq_flags |= PCI_IRQ_AFFINITY;
> +		irq_flags |= PCI_IRQ_AFFINITY | PCI_IRQ_ALL_TYPES;
>   	else
>   		descp = NULL;
>   
> +	/* Do not allocate msix vectors for poll_queues.
> +	 * msix_vectors is always within a range of FW supported reply queue.
> +	 */
>   	i = pci_alloc_irq_vectors_affinity(instance->pdev,
>   		instance->low_latency_index_start,
> -		instance->msix_vectors, irq_flags, descp);
> +		instance->msix_vectors - instance->iopoll_q_count, irq_flags, descp);
>   
>   	return i;
>   }
> @@ -5856,10 +5901,25 @@ megasas_alloc_irq_vectors(struct megasas_instance *instance)
>   	int i;
>   	unsigned int num_msix_req;
>   
> +	instance->iopoll_q_count = 0;
> +	if ((instance->adapter_type != MFI_SERIES) &&
> +		poll_queues) {
> +
> +		instance->perf_mode = MR_LATENCY_PERF_MODE;
> +		instance->low_latency_index_start = 1;
> +
> +		/* reserve for default and non-mananged pre-vector. */
> +		if (instance->msix_vectors > (instance->iopoll_q_count + 2))
> +			instance->iopoll_q_count = poll_queues;
> +		else
> +			instance->iopoll_q_count = 0;
> +	}
> +
>   	i = __megasas_alloc_irq_vectors(instance);
>   
> -	if ((instance->perf_mode == MR_BALANCED_PERF_MODE) &&
> -	    (i != instance->msix_vectors)) {
> +	if (((instance->perf_mode == MR_BALANCED_PERF_MODE)
> +		|| instance->iopoll_q_count) &&
> +	    (i != (instance->msix_vectors - instance->iopoll_q_count))) {
>   		if (instance->msix_vectors)
>   			pci_free_irq_vectors(instance->pdev);
>   		/* Disable Balanced IOPS mode and try realloc vectors */
> @@ -5870,12 +5930,15 @@ megasas_alloc_irq_vectors(struct megasas_instance *instance)
>   		instance->msix_vectors = min(num_msix_req,
>   				instance->msix_vectors);
>   
> +		instance->iopoll_q_count = 0;
>   		i = __megasas_alloc_irq_vectors(instance);
>   
>   	}
>   
>   	dev_info(&instance->pdev->dev,
> -		"requested/available msix %d/%d\n", instance->msix_vectors, i);
> +		"requested/available msix %d/%d poll_queue %d\n",
> +			instance->msix_vectors - instance->iopoll_q_count,
> +			i, instance->iopoll_q_count);
>   
>   	if (i > 0)
>   		instance->msix_vectors = i;
> @@ -6841,12 +6904,18 @@ static int megasas_io_attach(struct megasas_instance *instance)
>   		instance->smp_affinity_enable) {
>   		host->host_tagset = 1;
>   		host->nr_hw_queues = instance->msix_vectors -
> -			instance->low_latency_index_start;
> +			instance->low_latency_index_start + instance->iopoll_q_count;
> +		if (instance->iopoll_q_count)
> +			host->nr_maps = 3;
> +	} else {
> +		instance->iopoll_q_count = 0;
>   	}
>   
>   	dev_info(&instance->pdev->dev,
> -		"Max firmware commands: %d shared with nr_hw_queues = %d\n",
> -		instance->max_fw_cmds, host->nr_hw_queues);
> +		"Max firmware commands: %d shared with default "
> +		"hw_queues = %d poll_queues %d\n", instance->max_fw_cmds,
> +		host->nr_hw_queues - instance->iopoll_q_count,
> +		instance->iopoll_q_count);
>   	/*
>   	 * Notify the mid-layer about the new controller
>   	 */
> @@ -8861,6 +8930,7 @@ static int __init megasas_init(void)
>   		msix_vectors = 1;
>   		rdpq_enable = 0;
>   		dual_qdepth_disable = 1;
> +		poll_queues = 0;
>   	}
>   
>   	/*
> diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> index fd607287608e..49c8cc3507e0 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
> +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
> @@ -685,6 +685,8 @@ megasas_alloc_reply_fusion(struct megasas_instance *instance)
>   	fusion = instance->ctrl_context;
>   
>   	count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
> +	count += instance->iopoll_q_count;
> +
>   	fusion->reply_frames_desc_pool =
>   			dma_pool_create("mr_reply", &instance->pdev->dev,
>   				fusion->reply_alloc_sz * count, 16, 0);
> @@ -779,6 +781,7 @@ megasas_alloc_rdpq_fusion(struct megasas_instance *instance)
>   	}
>   
>   	msix_count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
> +	msix_count += instance->iopoll_q_count;
>   
>   	fusion->reply_frames_desc_pool = dma_pool_create("mr_rdpq",
>   							 &instance->pdev->dev,
> @@ -1129,7 +1132,7 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
>   			MPI2_IOCINIT_MSGFLAG_RDPQ_ARRAY_MODE : 0;
>   	IOCInitMessage->SystemRequestFrameBaseAddress = cpu_to_le64(fusion->io_request_frames_phys);
>   	IOCInitMessage->SenseBufferAddressHigh = cpu_to_le32(upper_32_bits(fusion->sense_phys_addr));
> -	IOCInitMessage->HostMSIxVectors = instance->msix_vectors;
> +	IOCInitMessage->HostMSIxVectors = instance->msix_vectors + instance->iopoll_q_count;
>   	IOCInitMessage->HostPageSize = MR_DEFAULT_NVME_PAGE_SHIFT;
>   
>   	time = ktime_get_real();
> @@ -1823,6 +1826,8 @@ megasas_init_adapter_fusion(struct megasas_instance *instance)
>   		 sizeof(union MPI2_SGE_IO_UNION))/16;
>   
>   	count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
> +	count += instance->iopoll_q_count;
> +
>   	for (i = 0 ; i < count; i++)
>   		fusion->last_reply_idx[i] = 0;
>   
> @@ -1835,6 +1840,9 @@ megasas_init_adapter_fusion(struct megasas_instance *instance)
>   				MEGASAS_FUSION_IOCTL_CMDS);
>   	sema_init(&instance->ioctl_sem, MEGASAS_FUSION_IOCTL_CMDS);
>   
> +	for (i = 0; i < MAX_MSIX_QUEUES_FUSION; i++)
> +		atomic_set(&fusion->busy_mq_poll[i], 0);
> +
>   	if (megasas_alloc_ioc_init_frame(instance))
>   		return 1;
>   
> @@ -3500,6 +3508,9 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex,
>   	if (reply_descript_type == MPI2_RPY_DESCRIPT_FLAGS_UNUSED)
>   		return IRQ_NONE;
>   
> +	if (irq_context && !atomic_add_unless(&irq_context->in_used, 1, 1))
> +		return 0;
> +
>   	num_completed = 0;
>   
>   	while (d_val.u.low != cpu_to_le32(UINT_MAX) &&
> @@ -3613,6 +3624,7 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex,
>   					irq_context->irq_line_enable = true;
>   					irq_poll_sched(&irq_context->irqpoll);
>   				}
> +				atomic_dec(&irq_context->in_used);
>   				return num_completed;
>   			}
>   		}
> @@ -3630,9 +3642,36 @@ complete_cmd_fusion(struct megasas_instance *instance, u32 MSIxIndex,
>   				instance->reply_post_host_index_addr[0]);
>   		megasas_check_and_restore_queue_depth(instance);
>   	}
> +
> +	if (irq_context)
> +		atomic_dec(&irq_context->in_used);
> +
>   	return num_completed;
>   }
>   
> +int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
> +{
> +
> +	struct megasas_instance *instance;
> +	int num_entries = 0;
> +	struct fusion_context *fusion;
> +
> +	instance = (struct megasas_instance *)shost->hostdata;
> +
> +	fusion = instance->ctrl_context;
> +
> +	queue_num = queue_num + instance->low_latency_index_start;
> +
> +	if (!atomic_add_unless(&fusion->busy_mq_poll[queue_num], 1, 1))
> +		return 0;
> +
> +	num_entries = complete_cmd_fusion(instance, queue_num, NULL);
> +	atomic_dec(&fusion->busy_mq_poll[queue_num]);
> +
> +	return num_entries;
> +}
> +
> +
>   /**
>    * megasas_enable_irq_poll() - enable irqpoll
>    * @instance:			Adapter soft state

Double newline

> @@ -4164,6 +4203,8 @@ void  megasas_reset_reply_desc(struct megasas_instance *instance)
>   
>   	fusion = instance->ctrl_context;
>   	count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
> +	count += instance->iopoll_q_count;
> +
>   	for (i = 0 ; i < count ; i++) {
>   		fusion->last_reply_idx[i] = 0;
>   		reply_desc = fusion->reply_frames_desc[i];
> diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.h b/drivers/scsi/megaraid/megaraid_sas_fusion.h
> index 30de4b01f703..242ff58a3404 100644
> --- a/drivers/scsi/megaraid/megaraid_sas_fusion.h
> +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h
> @@ -1303,6 +1303,9 @@ struct fusion_context {
>   	u8 *sense;
>   	dma_addr_t sense_phys_addr;
>   
> +	atomic_t   busy_mq_poll[MAX_MSIX_QUEUES_FUSION];
> +
> +
>   	dma_addr_t reply_frames_desc_phys[MAX_MSIX_QUEUES_FUSION];
>   	union MPI2_REPLY_DESCRIPTORS_UNION *reply_frames_desc[MAX_MSIX_QUEUES_FUSION];
>   	struct rdpq_alloc_detail rdpq_tracker[RDPQ_MAX_CHUNK_COUNT];
> 
Same here.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                Kernel Storage Architect
hare@suse.de                              +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 3/4] scsi_debug : iouring iopoll support
  2020-12-03  3:40 ` [PATCH v2 3/4] scsi_debug : " Kashyap Desai
@ 2020-12-03 12:58   ` Hannes Reinecke
  2020-12-03 19:09   ` Douglas Gilbert
  1 sibling, 0 replies; 13+ messages in thread
From: Hannes Reinecke @ 2020-12-03 12:58 UTC (permalink / raw)
  To: Kashyap Desai, linux-scsi; +Cc: dgilbert, linux-block

On 12/3/20 4:40 AM, Kashyap Desai wrote:
> Add support of iouring iopoll interface in scsi_debug.
> This feature requires shared hosttag support in kernel and driver.
> 
> Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
> Acked-by: Douglas Gilbert <dgilbert@interlog.com>
> Tested-by: Douglas Gilbert <dgilbert@interlog.com>
> 
> Cc: dgilbert@interlog.com
> Cc: linux-block@vger.kernel.org
> ---
>   drivers/scsi/scsi_debug.c | 130 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 130 insertions(+)
> 
Reviewed-by: Hannes Reinecke <hare@suse.de>

Cheers,

Hannes
-- 
Dr. Hannes Reinecke                Kernel Storage Architect
hare@suse.de                              +49 911 74053 688
SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg
HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 2/4] megaraid_sas: iouring iopoll support
  2020-12-03  3:40 ` [PATCH v2 2/4] megaraid_sas: iouring iopoll support Kashyap Desai
  2020-12-03 12:57   ` Hannes Reinecke
@ 2020-12-03 13:23   ` kernel test robot
  1 sibling, 0 replies; 13+ messages in thread
From: kernel test robot @ 2020-12-03 13:23 UTC (permalink / raw)
  To: Kashyap Desai, linux-scsi
  Cc: kbuild-all, Kashyap Desai, sumit.saxena, chandrakanth.patil, linux-block

[-- Attachment #1: Type: text/plain, Size: 2238 bytes --]

Hi Kashyap,

I love your patch! Perhaps something to improve:

[auto build test WARNING on 0eedceafd3a63fd082743c914853ef4b9247dbe6]

url:    https://github.com/0day-ci/linux/commits/Kashyap-Desai/io_uring-iopoll-in-scsi-layer/20201203-194918
base:    0eedceafd3a63fd082743c914853ef4b9247dbe6
config: i386-randconfig-s001-20201203 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.3-179-ga00755aa-dirty
        # https://github.com/0day-ci/linux/commit/f2b4b005fc618696e1b343f91cf9907427e0df91
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Kashyap-Desai/io_uring-iopoll-in-scsi-layer/20201203-194918
        git checkout f2b4b005fc618696e1b343f91cf9907427e0df91
        # save the attached .config to linux build tree
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/scsi/megaraid/megaraid_sas_fusion.c:3652:5: warning: no previous prototype for 'megasas_blk_mq_poll' [-Wmissing-prototypes]
    3652 | int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
         |     ^~~~~~~~~~~~~~~~~~~

vim +/megasas_blk_mq_poll +3652 drivers/scsi/megaraid/megaraid_sas_fusion.c

  3651	
> 3652	int megasas_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
  3653	{
  3654	
  3655		struct megasas_instance *instance;
  3656		int num_entries = 0;
  3657		struct fusion_context *fusion;
  3658	
  3659		instance = (struct megasas_instance *)shost->hostdata;
  3660	
  3661		fusion = instance->ctrl_context;
  3662	
  3663		queue_num = queue_num + instance->low_latency_index_start;
  3664	
  3665		if (!atomic_add_unless(&fusion->busy_mq_poll[queue_num], 1, 1))
  3666			return 0;
  3667	
  3668		num_entries = complete_cmd_fusion(instance, queue_num, NULL);
  3669		atomic_dec(&fusion->busy_mq_poll[queue_num]);
  3670	
  3671		return num_entries;
  3672	}
  3673	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 32099 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 4/4] scsi: set shost as hctx driver_data
       [not found] ` <20201203034100.29716-5-kashyap.desai@broadcom.com>
@ 2020-12-03 13:26   ` John Garry
  2020-12-03 13:30     ` Kashyap Desai
  0 siblings, 1 reply; 13+ messages in thread
From: John Garry @ 2020-12-03 13:26 UTC (permalink / raw)
  To: Kashyap Desai, linux-scsi, linux-block

On 03/12/2020 03:41, Kashyap Desai wrote:
> hctx->driver_data is not set for SCSI currently.
> Separately set hctx->driver_data = shost.

nit: this looks ok to me, but I would have made as an earlier patch so 
that you don't add code and then remove it:

 >   static int scsi_mq_poll(struct blk_mq_hw_ctx *hctx)
 >   {
 > -	struct request_queue *q = hctx->queue;
 > -	struct scsi_device *sdev = q->queuedata;
 > -	struct Scsi_Host *shost = sdev->host;

Thanks,
John

> 
> Suggested-by: John Garry <john.garry@huawei.com>
> Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
> ---
>   drivers/scsi/scsi_lib.c | 19 +++++++++++++------
>   1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
> index 8675900ccc27..892315c21b70 100644
> --- a/drivers/scsi/scsi_lib.c
> +++ b/drivers/scsi/scsi_lib.c
> @@ -1789,9 +1789,7 @@ static void scsi_mq_exit_request(struct blk_mq_tag_set *set, struct request *rq,
>   
>   static int scsi_mq_poll(struct blk_mq_hw_ctx *hctx)
>   {
> -	struct request_queue *q = hctx->queue;
> -	struct scsi_device *sdev = q->queuedata;
> -	struct Scsi_Host *shost = sdev->host;
> +	struct Scsi_Host *shost = hctx->driver_data;
>   
>   	if (shost->hostt->mq_poll)
>   		return shost->hostt->mq_poll(shost, hctx->queue_num);
> @@ -1799,6 +1797,15 @@ static int scsi_mq_poll(struct blk_mq_hw_ctx *hctx)
>   	return 0;
>   }
>   
> +static int scsi_init_hctx(struct blk_mq_hw_ctx *hctx, void *data,
> +			  unsigned int hctx_idx)
> +{
> +	struct Scsi_Host *shost = data;
> +
> +	hctx->driver_data = shost;
> +	return 0;
> +}
> +
>   static int scsi_map_queues(struct blk_mq_tag_set *set)
>   {
>   	struct Scsi_Host *shost = container_of(set, struct Scsi_Host, tag_set);
> @@ -1866,15 +1873,14 @@ static const struct blk_mq_ops scsi_mq_ops_no_commit = {
>   	.cleanup_rq	= scsi_cleanup_rq,
>   	.busy		= scsi_mq_lld_busy,
>   	.map_queues	= scsi_map_queues,
> +	.init_hctx	= scsi_init_hctx,
>   	.poll		= scsi_mq_poll,
>   };
>   
>   
>   static void scsi_commit_rqs(struct blk_mq_hw_ctx *hctx)
>   {
> -	struct request_queue *q = hctx->queue;
> -	struct scsi_device *sdev = q->queuedata;
> -	struct Scsi_Host *shost = sdev->host;
> +	struct Scsi_Host *shost = hctx->driver_data;
>   
>   	shost->hostt->commit_rqs(shost, hctx->queue_num);
>   }
> @@ -1895,6 +1901,7 @@ static const struct blk_mq_ops scsi_mq_ops = {
>   	.cleanup_rq	= scsi_cleanup_rq,
>   	.busy		= scsi_mq_lld_busy,
>   	.map_queues	= scsi_map_queues,
> +	.init_hctx	= scsi_init_hctx,
>   	.poll		= scsi_mq_poll,
>   };
>   
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: [PATCH v2 4/4] scsi: set shost as hctx driver_data
  2020-12-03 13:26   ` [PATCH v2 4/4] scsi: set shost as hctx driver_data John Garry
@ 2020-12-03 13:30     ` Kashyap Desai
  2020-12-04  9:00       ` John Garry
  0 siblings, 1 reply; 13+ messages in thread
From: Kashyap Desai @ 2020-12-03 13:30 UTC (permalink / raw)
  To: John Garry, linux-scsi, linux-block

[-- Attachment #1: Type: text/plain, Size: 976 bytes --]

> -----Original Message-----
> From: John Garry [mailto:john.garry@huawei.com]
> Sent: Thursday, December 3, 2020 6:57 PM
> To: Kashyap Desai <kashyap.desai@broadcom.com>; linux-
> scsi@vger.kernel.org; linux-block@vger.kernel.org
> Subject: Re: [PATCH v2 4/4] scsi: set shost as hctx driver_data
>
> On 03/12/2020 03:41, Kashyap Desai wrote:
> > hctx->driver_data is not set for SCSI currently.
> > Separately set hctx->driver_data = shost.
>
> nit: this looks ok to me, but I would have made as an earlier patch so
> that you
> don't add code and then remove it:

I added later - Just in case someone report issue in " scsi_commit_rqs" due
to this patch, we can revert back easily.
I tested scsi_mq_poll but not scsi_commit_rqs part.

Kashyap

>
>  >   static int scsi_mq_poll(struct blk_mq_hw_ctx *hctx)
>  >   {
>  > -	struct request_queue *q = hctx->queue;
>  > -	struct scsi_device *sdev = q->queuedata;
>  > -	struct Scsi_Host *shost = sdev->host;
>
> Thanks,
> John
>

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4169 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 3/4] scsi_debug : iouring iopoll support
  2020-12-03  3:40 ` [PATCH v2 3/4] scsi_debug : " Kashyap Desai
  2020-12-03 12:58   ` Hannes Reinecke
@ 2020-12-03 19:09   ` Douglas Gilbert
  1 sibling, 0 replies; 13+ messages in thread
From: Douglas Gilbert @ 2020-12-03 19:09 UTC (permalink / raw)
  To: Kashyap Desai, linux-scsi; +Cc: linux-block

See my comment further down.

On 2020-12-02 10:40 p.m., Kashyap Desai wrote:
> Add support of iouring iopoll interface in scsi_debug.
> This feature requires shared hosttag support in kernel and driver.
> 
> Signed-off-by: Kashyap Desai <kashyap.desai@broadcom.com>
> Acked-by: Douglas Gilbert <dgilbert@interlog.com>
> Tested-by: Douglas Gilbert <dgilbert@interlog.com>
> 
> Cc: dgilbert@interlog.com
> Cc: linux-block@vger.kernel.org
> ---
>   drivers/scsi/scsi_debug.c | 130 ++++++++++++++++++++++++++++++++++++++
>   1 file changed, 130 insertions(+)
> 
> diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
> index 24c0f7ec0351..4ced913f2b39 100644
> --- a/drivers/scsi/scsi_debug.c
> +++ b/drivers/scsi/scsi_debug.c
> @@ -829,6 +829,7 @@ static int sdeb_zbc_max_open = DEF_ZBC_MAX_OPEN_ZONES;
>   static int sdeb_zbc_nr_conv = DEF_ZBC_NR_CONV_ZONES;
>   
>   static int submit_queues = DEF_SUBMIT_QUEUES;  /* > 1 for multi-queue (mq) */
> +static int poll_queues; /* iouring iopoll interface.*/
>   static struct sdebug_queue *sdebug_q_arr;  /* ptr to array of submit queues */
>   
>   static DEFINE_RWLOCK(atomic_rw);
> @@ -5432,6 +5433,14 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
>   	cmnd->host_scribble = (unsigned char *)sqcp;
>   	sd_dp = sqcp->sd_dp;
>   	spin_unlock_irqrestore(&sqp->qc_lock, iflags);
> +
> +	/* Do not complete IO from default completion path.
> +	 * Let it to be on queue.
> +	 * Completion should happen from mq_poll interface.
> +	 */
> +	if ((sqp - sdebug_q_arr) >= (submit_queues - poll_queues))
> +		return 0;
> +
>   	if (!sd_dp) {
>   		sd_dp = kzalloc(sizeof(*sd_dp), GFP_ATOMIC);
>   		if (!sd_dp) {
> @@ -5615,6 +5624,7 @@ module_param_named(sector_size, sdebug_sector_size, int, S_IRUGO);
>   module_param_named(statistics, sdebug_statistics, bool, S_IRUGO | S_IWUSR);
>   module_param_named(strict, sdebug_strict, bool, S_IRUGO | S_IWUSR);
>   module_param_named(submit_queues, submit_queues, int, S_IRUGO);
> +module_param_named(poll_queues, poll_queues, int, S_IRUGO);
>   module_param_named(tur_ms_to_ready, sdeb_tur_ms_to_ready, int, S_IRUGO);
>   module_param_named(unmap_alignment, sdebug_unmap_alignment, int, S_IRUGO);
>   module_param_named(unmap_granularity, sdebug_unmap_granularity, int, S_IRUGO);
> @@ -5677,6 +5687,7 @@ MODULE_PARM_DESC(opt_xferlen_exp, "optimal transfer length granularity exponent
>   MODULE_PARM_DESC(opts, "1->noise, 2->medium_err, 4->timeout, 8->recovered_err... (def=0)");
>   MODULE_PARM_DESC(per_host_store, "If set, next positive add_host will get new store (def=0)");
>   MODULE_PARM_DESC(physblk_exp, "physical block exponent (def=0)");
> +MODULE_PARM_DESC(poll_queues, "support for iouring iopoll queues (1 to max(submit_queues - 1)");
>   MODULE_PARM_DESC(ptype, "SCSI peripheral type(def=0[disk])");
>   MODULE_PARM_DESC(random, "If set, uniformly randomize command duration between 0 and delay_in_ns");
>   MODULE_PARM_DESC(removable, "claim to have removable media (def=0)");
> @@ -7200,6 +7211,104 @@ static int resp_not_ready(struct scsi_cmnd *scp, struct sdebug_dev_info *devip)
>   	return check_condition_result;
>   }
>   
> +static int sdebug_map_queues(struct Scsi_Host *shost)
> +{
> +	int i, qoff;
> +
> +	if (shost->nr_hw_queues == 1)
> +		return 0;
> +
> +	for (i = 0, qoff = 0; i < HCTX_MAX_TYPES; i++) {
> +		struct blk_mq_queue_map *map = &shost->tag_set.map[i];
> +
> +		map->nr_queues  = 0;
> +
> +		if (i == HCTX_TYPE_DEFAULT)
> +			map->nr_queues = submit_queues - poll_queues;
> +		else if (i == HCTX_TYPE_POLL)
> +			map->nr_queues = poll_queues;
> +
> +		if (!map->nr_queues) {
> +			BUG_ON(i == HCTX_TYPE_DEFAULT);
> +			continue;
> +		}
> +
> +		map->queue_offset = qoff;
> +		blk_mq_map_queues(map);
> +
> +		qoff += map->nr_queues;
> +	}
> +
> +	return 0;
> +
> +}
> +
> +static int sdebug_blk_mq_poll(struct Scsi_Host *shost, unsigned int queue_num)
> +{
> +	int qc_idx;
> +	int retiring = 0;
> +	unsigned long iflags;
> +	struct sdebug_queue *sqp;
> +	struct sdebug_queued_cmd *sqcp;
> +	struct scsi_cmnd *scp;
> +	struct sdebug_dev_info *devip;
> +	int num_entries = 0;
> +
> +	sqp = sdebug_q_arr + queue_num;
> +
> +	do {
> +		spin_lock_irqsave(&sqp->qc_lock, iflags);
> +		qc_idx = find_first_bit(sqp->in_use_bm, sdebug_max_queue);
> +		if (unlikely((qc_idx < 0) || (qc_idx >= sdebug_max_queue)))
> +			goto out;

If you are rolling this patchset again, perhaps you could change the "if"
above to:
		if (likely(qc_idx >= sdebug_max_queue))

since find_first_bit() returns unsigned long. Also, if we are polling,
unless the storage is extremely fast, we should see find_first_bit()
not finding any bits set most of the time. In that case it will return 
sdebug_max_queue, so flag it as (more) likely. That should also indicate
to someone reading the code that the "goto out" in this case is _not_
an error path and may well be the fast path.

Doug Gilbert

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 1/4] add io_uring with IOPOLL support in scsi layer
  2020-12-03  3:40 ` [PATCH v2 1/4] add io_uring with IOPOLL support in scsi layer Kashyap Desai
  2020-12-03 12:51   ` Hannes Reinecke
@ 2020-12-04  8:53   ` John Garry
  1 sibling, 0 replies; 13+ messages in thread
From: John Garry @ 2020-12-04  8:53 UTC (permalink / raw)
  To: Kashyap Desai, linux-scsi; +Cc: sumit.saxena, chandrakanth.patil, linux-block

On 03/12/2020 03:40, Kashyap Desai wrote:
> io_uring with IOPOLL is not currently supported in scsi mid layer.
> Outside of that everything else should work and no extra support
> in the driver is needed.
> 
> Currently io_uring with IOPOLL support is only available in block layer.
> This patch is to extend support of mq_poll in scsi layer.
> 
> Signed-off-by: Kashyap Desai<kashyap.desai@broadcom.com>
> Cc:sumit.saxena@broadcom.com
> Cc:chandrakanth.patil@broadcom.com
> Cc:linux-block@vger.kernel.org
Reviewed-by: John Garry <john.garry@huawei.com>

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v2 4/4] scsi: set shost as hctx driver_data
  2020-12-03 13:30     ` Kashyap Desai
@ 2020-12-04  9:00       ` John Garry
  0 siblings, 0 replies; 13+ messages in thread
From: John Garry @ 2020-12-04  9:00 UTC (permalink / raw)
  To: Kashyap Desai, linux-scsi, linux-block

On 03/12/2020 13:30, Kashyap Desai wrote:
>> -----Original Message-----
>> From: John Garry [mailto:john.garry@huawei.com]
>> Sent: Thursday, December 3, 2020 6:57 PM
>> To: Kashyap Desai <kashyap.desai@broadcom.com>; linux-
>> scsi@vger.kernel.org; linux-block@vger.kernel.org
>> Subject: Re: [PATCH v2 4/4] scsi: set shost as hctx driver_data
>>
>> On 03/12/2020 03:41, Kashyap Desai wrote:
>>> hctx->driver_data is not set for SCSI currently.
>>> Separately set hctx->driver_data = shost.
>>
>> nit: this looks ok to me, but I would have made as an earlier patch so
>> that you
>> don't add code and then remove it:
> 
> I added later - Just in case someone report issue in " scsi_commit_rqs" due
> to this patch, we can revert back easily.
> I tested scsi_mq_poll but not scsi_commit_rqs part.
> 

We should be a bit more confident in the patch :)

anyway,

Reviewed-by: John Garry <john.garry@huawei.com>

> 
>>
>>   >   static int scsi_mq_poll(struct blk_mq_hw_ctx *hctx)
>>   >   {
>>   > -	struct request_queue *q = hctx->queue;
>>   > -	struct scsi_device *sdev = q->queuedata;
>>   > -	struct Scsi_Host *shost = sdev->host;
>>
>> Thanks,
>> John
>>


^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: [PATCH v2 2/4] megaraid_sas: iouring iopoll support
  2020-12-03 12:57   ` Hannes Reinecke
@ 2021-02-01 13:55     ` Kashyap Desai
  0 siblings, 0 replies; 13+ messages in thread
From: Kashyap Desai @ 2021-02-01 13:55 UTC (permalink / raw)
  To: Hannes Reinecke, linux-scsi; +Cc: Sumit Saxena, Chandrakanth Patil, linux-block

[-- Attachment #1: Type: text/plain, Size: 3147 bytes --]

> >   static int megasas_map_queues(struct Scsi_Host *shost)
> >   {
> >   	struct megasas_instance *instance;
> > +	int i, qoff, offset;
> >
> >   	instance = (struct megasas_instance *)shost->hostdata;
> >
> >   	if (shost->nr_hw_queues == 1)
> >   		return 0;
> >
> > -	return blk_mq_pci_map_queues(&shost-
> >tag_set.map[HCTX_TYPE_DEFAULT],
> > -			instance->pdev, instance->low_latency_index_start);
> > +	offset = instance->low_latency_index_start;
> > +
> > +	for (i = 0, qoff = 0; i < HCTX_MAX_TYPES; i++) {
> > +		struct blk_mq_queue_map *map = &shost->tag_set.map[i];
> > +
> > +		map->nr_queues  = 0;
> > +
> > +		if (i == HCTX_TYPE_DEFAULT)
> > +			map->nr_queues = instance->msix_vectors - offset;
> > +		else if (i == HCTX_TYPE_POLL)
> > +			map->nr_queues = instance->iopoll_q_count;
> > +
> > +		if (!map->nr_queues) {
> > +			BUG_ON(i == HCTX_TYPE_DEFAULT);
> > +			continue;
> > +		}
> > +
> > +		/*
> > +		 * The poll queue(s) doesn't have an IRQ (and hence IRQ
> > +		 * affinity), so use the regular blk-mq cpu mapping
> > +		 */
> > +		map->queue_offset = qoff;
> > +		if (i != HCTX_TYPE_POLL)
> > +			blk_mq_pci_map_queues(map, instance->pdev,
> offset);
> > +		else
> > +			blk_mq_map_queues(map);
> > +
> > +		qoff += map->nr_queues;
> > +		offset += map->nr_queues;
> > +	}
> > +
> Seeing that you only ever use HCTX_TYPE_DEFAULT and HCTX_TYPE_POLL
> that loop is a bit non-obvious; maybe it's better to unroll it and assigne
> the
> values manually.

Hannes- I have taken care this in V3 series. Please review.

> >   /**
> >    * megasas_enable_irq_poll() - enable irqpoll
> >    * @instance:			Adapter soft state
>
> Double newline

Taken care in V3.

>
> > @@ -4164,6 +4203,8 @@ void  megasas_reset_reply_desc(struct
> > megasas_instance *instance)
> >
> >   	fusion = instance->ctrl_context;
> >   	count = instance->msix_vectors > 0 ? instance->msix_vectors : 1;
> > +	count += instance->iopoll_q_count;
> > +
> >   	for (i = 0 ; i < count ; i++) {
> >   		fusion->last_reply_idx[i] = 0;
> >   		reply_desc = fusion->reply_frames_desc[i]; diff --git
> > a/drivers/scsi/megaraid/megaraid_sas_fusion.h
> > b/drivers/scsi/megaraid/megaraid_sas_fusion.h
> > index 30de4b01f703..242ff58a3404 100644
> > --- a/drivers/scsi/megaraid/megaraid_sas_fusion.h
> > +++ b/drivers/scsi/megaraid/megaraid_sas_fusion.h
> > @@ -1303,6 +1303,9 @@ struct fusion_context {
> >   	u8 *sense;
> >   	dma_addr_t sense_phys_addr;
> >
> > +	atomic_t   busy_mq_poll[MAX_MSIX_QUEUES_FUSION];
> > +
> > +
> >   	dma_addr_t reply_frames_desc_phys[MAX_MSIX_QUEUES_FUSION];
> >   	union MPI2_REPLY_DESCRIPTORS_UNION
> *reply_frames_desc[MAX_MSIX_QUEUES_FUSION];
> >   	struct rdpq_alloc_detail rdpq_tracker[RDPQ_MAX_CHUNK_COUNT];
> >
> Same here.

Taken care in V3.
>
> Cheers,
>
> Hannes
> --
> Dr. Hannes Reinecke                Kernel Storage Architect
> hare@suse.de                              +49 911 74053 688
> SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg HRB 36809
> (AG Nürnberg), Geschäftsführer: Felix Imendörffer

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4169 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2021-02-01 13:56 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20201203034100.29716-1-kashyap.desai@broadcom.com>
2020-12-03  3:40 ` [PATCH v2 1/4] add io_uring with IOPOLL support in scsi layer Kashyap Desai
2020-12-03 12:51   ` Hannes Reinecke
2020-12-04  8:53   ` John Garry
2020-12-03  3:40 ` [PATCH v2 2/4] megaraid_sas: iouring iopoll support Kashyap Desai
2020-12-03 12:57   ` Hannes Reinecke
2021-02-01 13:55     ` Kashyap Desai
2020-12-03 13:23   ` kernel test robot
2020-12-03  3:40 ` [PATCH v2 3/4] scsi_debug : " Kashyap Desai
2020-12-03 12:58   ` Hannes Reinecke
2020-12-03 19:09   ` Douglas Gilbert
     [not found] ` <20201203034100.29716-5-kashyap.desai@broadcom.com>
2020-12-03 13:26   ` [PATCH v2 4/4] scsi: set shost as hctx driver_data John Garry
2020-12-03 13:30     ` Kashyap Desai
2020-12-04  9:00       ` John Garry

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).