]> www.infradead.org Git - users/hch/block.git/commitdiff
nvme-rdma: send cntlid in the RDMA_CM_REQUEST Private Data
authorNiklas Cassel <cassel@kernel.org>
Thu, 15 Aug 2024 20:11:31 +0000 (22:11 +0200)
committerKeith Busch <kbusch@kernel.org>
Mon, 26 Aug 2024 15:11:19 +0000 (08:11 -0700)
When sending a RDMA_CM_REQUEST, the NVMe RDMA Transport Specification
allows you to populate the cntlid field in the RDMA_CM_REQUEST Private
Data.

The cntlid is returned by the target on completion of the first
RDMA_CM_REQUEST command (which creates the admin queue).

The cntlid field can then be populated by the host when the I/O queues
are created (using additional RDMA_CM_REQUEST commands), such that the
target can perform extra validation for additional RDMA_CM_REQUEST
commands.

This additional error code and error message is also added, such that
nvme_rdma_cm_msg() will display the proper error message if the target
fails the RDMA_CM_REQUEST command because of this extra validation.

Signed-off-by: Niklas Cassel <cassel@kernel.org>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/rdma.c
include/linux/nvme-rdma.h

index 2eb33842f9711a997123cb24c14fd2e7d1cffd02..e3520a91147b1027c2940dc3224316c186a7416f 100644 (file)
@@ -1876,6 +1876,8 @@ static int nvme_rdma_route_resolved(struct nvme_rdma_queue *queue)
                 */
                priv.hrqsize = cpu_to_le16(queue->queue_size);
                priv.hsqsize = cpu_to_le16(queue->ctrl->ctrl.sqsize);
+               /* cntlid should only be set when creating an I/O queue */
+               priv.cntlid = cpu_to_le16(ctrl->ctrl.cntlid);
        }
 
        ret = rdma_connect_locked(queue->cm_id, &param);
index eb2f04d636c89866167021019049fb979006c81e..97c5f00b9aa316a5893b21afc10c889e39b907c4 100644 (file)
@@ -25,6 +25,7 @@ enum nvme_rdma_cm_status {
        NVME_RDMA_CM_NO_RSC             = 0x06,
        NVME_RDMA_CM_INVALID_IRD        = 0x07,
        NVME_RDMA_CM_INVALID_ORD        = 0x08,
+       NVME_RDMA_CM_INVALID_CNTLID     = 0x09,
 };
 
 static inline const char *nvme_rdma_cm_msg(enum nvme_rdma_cm_status status)
@@ -46,6 +47,8 @@ static inline const char *nvme_rdma_cm_msg(enum nvme_rdma_cm_status status)
                return "invalid IRD";
        case NVME_RDMA_CM_INVALID_ORD:
                return "Invalid ORD";
+       case NVME_RDMA_CM_INVALID_CNTLID:
+               return "invalid controller ID";
        default:
                return "unrecognized reason";
        }
@@ -64,7 +67,8 @@ struct nvme_rdma_cm_req {
        __le16          qid;
        __le16          hrqsize;
        __le16          hsqsize;
-       u8              rsvd[24];
+       __le16          cntlid;
+       u8              rsvd[22];
 };
 
 /**