Commit 01d83816 authored by Saurav Kashyap's avatar Saurav Kashyap Committed by Christoph Hellwig
Browse files

nvme-fc: add support for ->map_queues



NVMe FC don't have support for map queues, unlike the PCI, RDMA and TCP
transports.  Add a ->map_queues callout for the LLDDs to provide such
functionality.

Signed-off-by: default avatarSaurav Kashyap <skashyap@marvell.com>
Signed-off-by: default avatarNilesh Javali <njavali@marvell.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent f6f09c15
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include <linux/nvme-fc.h>
#include "fc.h"
#include <scsi/scsi_transport_fc.h>
#include <linux/blk-mq-pci.h>

/* *************************** Data Structures/Defines ****************** */

@@ -2841,6 +2842,28 @@ nvme_fc_complete_rq(struct request *rq)
	nvme_fc_ctrl_put(ctrl);
}

static int nvme_fc_map_queues(struct blk_mq_tag_set *set)
{
	struct nvme_fc_ctrl *ctrl = set->driver_data;
	int i;

	for (i = 0; i < set->nr_maps; i++) {
		struct blk_mq_queue_map *map = &set->map[i];

		if (!map->nr_queues) {
			WARN_ON(i == HCTX_TYPE_DEFAULT);
			continue;
		}

		/* Call LLDD map queue functionality if defined */
		if (ctrl->lport->ops->map_queues)
			ctrl->lport->ops->map_queues(&ctrl->lport->localport,
						     map);
		else
			blk_mq_map_queues(map);
	}
	return 0;
}

static const struct blk_mq_ops nvme_fc_mq_ops = {
	.queue_rq	= nvme_fc_queue_rq,
@@ -2849,6 +2872,7 @@ static const struct blk_mq_ops nvme_fc_mq_ops = {
	.exit_request	= nvme_fc_exit_request,
	.init_hctx	= nvme_fc_init_hctx,
	.timeout	= nvme_fc_timeout,
	.map_queues	= nvme_fc_map_queues,
};

static int
+7 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#define _NVME_FC_DRIVER_H 1

#include <linux/scatterlist.h>
#include <linux/blk-mq.h>


/*
@@ -497,6 +498,8 @@ struct nvme_fc_port_template {
	int	(*xmt_ls_rsp)(struct nvme_fc_local_port *localport,
				struct nvme_fc_remote_port *rport,
				struct nvmefc_ls_rsp *ls_rsp);
	void	(*map_queues)(struct nvme_fc_local_port *localport,
			      struct blk_mq_queue_map *map);

	u32	max_hw_queues;
	u16	max_sgl_segments;
@@ -779,6 +782,10 @@ struct nvmet_fc_target_port {
 *       LS received.
 *       Entrypoint is Mandatory.
 *
 * @map_queues: This functions lets the driver expose the queue mapping
 *	 to the block layer.
 *       Entrypoint is Optional.
 *
 * @fcp_op:  Called to perform a data transfer or transmit a response.
 *       The nvmefc_tgt_fcp_req structure is the same LLDD-supplied
 *       exchange structure specified in the nvmet_fc_rcv_fcp_req() call