]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
nvme: add capability to connect to an administrative controller
authorKamaljit Singh <kamaljit.singh1@wdc.com>
Mon, 21 Jul 2025 17:36:59 +0000 (10:36 -0700)
committerChristoph Hellwig <hch@lst.de>
Thu, 31 Jul 2025 13:35:44 +0000 (06:35 -0700)
Add capability to connect to an administrative controller by
preventing ioq creation for admin-controllers.

Add a nvme_admin_ctrl() to check if a controller's CNTRLTYPE indicates
that it is an administrative controller and override ctrl->queue_count to
1 for admin controllers, so that only the admin queue and no I/O queues
are created for an administrative controller.  This override is done in
nvme_init_ctrl_finish() after ctrl->cntrltype has been initialized in
nvme_init_identify() so nvme_admin_ctrl() will work correctly.
Doing this override in generic code (nvme_init_ctrl_finish) makes it
transport agnostic and will work properly for nvme/tcp as well as for
nvme/rdma.

Suggested-by: Niklas Cassel <cassel@kernel.org>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Niklas Cassel <cassel@kernel.org>
Signed-off-by: Kamaljit Singh <kamaljit.singh1@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/core.c

index 9d988f4cb87a541b13c47c4f3272245086ee0220..812c1565114fde21000c80ae8968c4346179133d 100644 (file)
@@ -3158,6 +3158,11 @@ static inline bool nvme_discovery_ctrl(struct nvme_ctrl *ctrl)
        return ctrl->opts && ctrl->opts->discovery_nqn;
 }
 
+static inline bool nvme_admin_ctrl(struct nvme_ctrl *ctrl)
+{
+       return ctrl->cntrltype == NVME_CTRL_ADMIN;
+}
+
 static bool nvme_validate_cntlid(struct nvme_subsystem *subsys,
                struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id)
 {
@@ -3670,6 +3675,17 @@ int nvme_init_ctrl_finish(struct nvme_ctrl *ctrl, bool was_suspended)
        if (ret)
                return ret;
 
+       if (nvme_admin_ctrl(ctrl)) {
+               /*
+                * An admin controller has one admin queue, but no I/O queues.
+                * Override queue_count so it only creates an admin queue.
+                */
+               dev_dbg(ctrl->device,
+                       "Subsystem %s is an administrative controller",
+                       ctrl->subsys->subnqn);
+               ctrl->queue_count = 1;
+       }
+
        ret = nvme_configure_apst(ctrl);
        if (ret < 0)
                return ret;