nvmet: add get_max_queue_size op for controllers
authorMax Gurtovoy <mgurtovoy@nvidia.com>
Wed, 22 Sep 2021 21:55:36 +0000 (00:55 +0300)
committerChristoph Hellwig <hch@lst.de>
Wed, 20 Oct 2021 17:16:01 +0000 (19:16 +0200)
Some transports, such as RDMA, would like to set the queue size
according to device/port/ctrl characteristics. Add a new nvmet transport
op that is called during ctrl initialization. This will not effect
transports that don't implement this option.

Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/core.c
drivers/nvme/target/nvmet.h

index b8425fa..93107af 100644 (file)
@@ -1205,7 +1205,10 @@ static void nvmet_init_cap(struct nvmet_ctrl *ctrl)
        /* CC.EN timeout in 500msec units: */
        ctrl->cap |= (15ULL << 24);
        /* maximum queue entries supported: */
-       ctrl->cap |= NVMET_QUEUE_SIZE - 1;
+       if (ctrl->ops->get_max_queue_size)
+               ctrl->cap |= ctrl->ops->get_max_queue_size(ctrl) - 1;
+       else
+               ctrl->cap |= NVMET_QUEUE_SIZE - 1;
 
        if (nvmet_is_passthru_subsys(ctrl->subsys))
                nvmet_passthrough_override_cap(ctrl);
@@ -1367,6 +1370,7 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
        mutex_init(&ctrl->lock);
 
        ctrl->port = req->port;
+       ctrl->ops = req->ops;
 
        INIT_WORK(&ctrl->async_event_work, nvmet_async_event_work);
        INIT_LIST_HEAD(&ctrl->async_events);
@@ -1405,8 +1409,6 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
        }
        ctrl->cntlid = ret;
 
-       ctrl->ops = req->ops;
-
        /*
         * Discovery controllers may use some arbitrary high value
         * in order to cleanup stale discovery sessions
index 7143c7f..f8e0ee1 100644 (file)
@@ -309,6 +309,7 @@ struct nvmet_fabrics_ops {
        u16 (*install_queue)(struct nvmet_sq *nvme_sq);
        void (*discovery_chg)(struct nvmet_port *port);
        u8 (*get_mdts)(const struct nvmet_ctrl *ctrl);
+       u16 (*get_max_queue_size)(const struct nvmet_ctrl *ctrl);
 };
 
 #define NVMET_MAX_INLINE_BIOVEC        8