From d81d3fa935cd3f19717be82cbefc54869008610e Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Fri, 22 Jun 2018 13:54:04 -0700 Subject: [PATCH] nvme/rdma: factor out NVMe-oF Property Get/Set These functions are generic and may be used for other NVMe-oF transports. Change-Id: Idb3aa30d9b0b1be7b60b85ab4911b28db35977a4 Signed-off-by: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/416575 Tested-by: SPDK Automated Test System Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Ben Walker --- lib/nvme/Makefile | 2 +- lib/nvme/nvme_fabric.c | 139 +++++++++++++++++++++++++++++++++++++++ lib/nvme/nvme_internal.h | 5 ++ lib/nvme/nvme_rdma.c | 85 ++---------------------- 4 files changed, 149 insertions(+), 82 deletions(-) create mode 100644 lib/nvme/nvme_fabric.c diff --git a/lib/nvme/Makefile b/lib/nvme/Makefile index 4177d880f..1a7bb852a 100644 --- a/lib/nvme/Makefile +++ b/lib/nvme/Makefile @@ -34,7 +34,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -C_SRCS = nvme_ctrlr_cmd.c nvme_ctrlr.c nvme_ns_cmd.c nvme_ns.c nvme_pcie.c nvme_qpair.c nvme.c nvme_quirks.c nvme_transport.c nvme_uevent.c nvme_ctrlr_ocssd_cmd.c \ +C_SRCS = nvme_ctrlr_cmd.c nvme_ctrlr.c nvme_fabric.c nvme_ns_cmd.c nvme_ns.c nvme_pcie.c nvme_qpair.c nvme.c nvme_quirks.c nvme_transport.c nvme_uevent.c nvme_ctrlr_ocssd_cmd.c \ nvme_ns_ocssd_cmd.c C_SRCS-$(CONFIG_RDMA) += nvme_rdma.c LIBNAME = nvme diff --git a/lib/nvme/nvme_fabric.c b/lib/nvme/nvme_fabric.c new file mode 100644 index 000000000..b05f91ba0 --- /dev/null +++ b/lib/nvme/nvme_fabric.c @@ -0,0 +1,139 @@ +/*- + * BSD LICENSE + * + * Copyright (c) Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* + * NVMe over Fabrics transport-independent functions + */ + +#include "nvme_internal.h" + +static int +nvme_fabric_prop_set_cmd(struct spdk_nvme_ctrlr *ctrlr, + uint32_t offset, uint8_t size, uint64_t value) +{ + struct spdk_nvmf_fabric_prop_set_cmd cmd = {}; + struct nvme_completion_poll_status status; + int rc; + + assert(size == SPDK_NVMF_PROP_SIZE_4 || size == SPDK_NVMF_PROP_SIZE_8); + + cmd.opcode = SPDK_NVME_OPC_FABRIC; + cmd.fctype = SPDK_NVMF_FABRIC_COMMAND_PROPERTY_SET; + cmd.ofst = offset; + cmd.attrib.size = size; + cmd.value.u64 = value; + + rc = spdk_nvme_ctrlr_cmd_admin_raw(ctrlr, (struct spdk_nvme_cmd *)&cmd, + NULL, 0, + nvme_completion_poll_cb, &status); + if (rc < 0) { + return rc; + } + + if (spdk_nvme_wait_for_completion(ctrlr->adminq, &status)) { + SPDK_ERRLOG("Property Set failed\n"); + return -1; + } + + return 0; +} + +static int +nvme_fabric_prop_get_cmd(struct spdk_nvme_ctrlr *ctrlr, + uint32_t offset, uint8_t size, uint64_t *value) +{ + struct spdk_nvmf_fabric_prop_set_cmd cmd = {}; + struct nvme_completion_poll_status status; + struct spdk_nvmf_fabric_prop_get_rsp *response; + int rc; + + assert(size == SPDK_NVMF_PROP_SIZE_4 || size == SPDK_NVMF_PROP_SIZE_8); + + cmd.opcode = SPDK_NVME_OPC_FABRIC; + cmd.fctype = SPDK_NVMF_FABRIC_COMMAND_PROPERTY_GET; + cmd.ofst = offset; + cmd.attrib.size = size; + + rc = spdk_nvme_ctrlr_cmd_admin_raw(ctrlr, (struct spdk_nvme_cmd *)&cmd, + NULL, 0, nvme_completion_poll_cb, + &status); + if (rc < 0) { + return rc; + } + + if (spdk_nvme_wait_for_completion(ctrlr->adminq, &status)) { + SPDK_ERRLOG("Property Get failed\n"); + return -1; + } + + response = (struct spdk_nvmf_fabric_prop_get_rsp *)&status.cpl; + + if (size == SPDK_NVMF_PROP_SIZE_4) { + *value = response->value.u32.low; + } else { + *value = response->value.u64; + } + + return 0; +} + +int +nvme_fabric_ctrlr_set_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t value) +{ + return nvme_fabric_prop_set_cmd(ctrlr, offset, SPDK_NVMF_PROP_SIZE_4, value); +} + +int +nvme_fabric_ctrlr_set_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t value) +{ + return nvme_fabric_prop_set_cmd(ctrlr, offset, SPDK_NVMF_PROP_SIZE_8, value); +} + +int +nvme_fabric_ctrlr_get_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t *value) +{ + uint64_t tmp_value; + int rc; + rc = nvme_fabric_prop_get_cmd(ctrlr, offset, SPDK_NVMF_PROP_SIZE_4, &tmp_value); + + if (!rc) { + *value = (uint32_t)tmp_value; + } + return rc; +} + +int +nvme_fabric_ctrlr_get_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t *value) +{ + return nvme_fabric_prop_get_cmd(ctrlr, offset, SPDK_NVMF_PROP_SIZE_8, value); +} diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index aa88e1606..662133ff5 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -680,6 +680,11 @@ int nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id, struct spdk_nvme_ctrlr *ctrlr); void nvme_ns_destruct(struct spdk_nvme_ns *ns); +int nvme_fabric_ctrlr_set_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t value); +int nvme_fabric_ctrlr_set_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t value); +int nvme_fabric_ctrlr_get_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t *value); +int nvme_fabric_ctrlr_get_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t *value); + static inline struct nvme_request * nvme_allocate_request(struct spdk_nvme_qpair *qpair, const struct nvme_payload *payload, uint32_t payload_size, diff --git a/lib/nvme/nvme_rdma.c b/lib/nvme/nvme_rdma.c index 7fd84939c..820ebb9dd 100644 --- a/lib/nvme/nvme_rdma.c +++ b/lib/nvme/nvme_rdma.c @@ -1003,76 +1003,6 @@ nvme_rdma_req_init(struct nvme_rdma_qpair *rqpair, struct nvme_request *req, return 0; } -static int -nvme_rdma_fabric_prop_set_cmd(struct spdk_nvme_ctrlr *ctrlr, - uint32_t offset, uint8_t size, uint64_t value) -{ - struct spdk_nvmf_fabric_prop_set_cmd cmd = {}; - struct nvme_completion_poll_status status; - int rc; - - cmd.opcode = SPDK_NVME_OPC_FABRIC; - cmd.fctype = SPDK_NVMF_FABRIC_COMMAND_PROPERTY_SET; - cmd.ofst = offset; - cmd.attrib.size = size; - cmd.value.u64 = value; - - rc = spdk_nvme_ctrlr_cmd_admin_raw(ctrlr, (struct spdk_nvme_cmd *)&cmd, - NULL, 0, - nvme_completion_poll_cb, &status); - - if (rc < 0) { - SPDK_ERRLOG("failed to send nvmf_fabric_prop_set_cmd\n"); - return -1; - } - - if (spdk_nvme_wait_for_completion(ctrlr->adminq, &status)) { - SPDK_ERRLOG("nvme_rdma_fabric_prop_get_cmd failed\n"); - return -1; - } - - return 0; -} - -static int -nvme_rdma_fabric_prop_get_cmd(struct spdk_nvme_ctrlr *ctrlr, - uint32_t offset, uint8_t size, uint64_t *value) -{ - struct spdk_nvmf_fabric_prop_set_cmd cmd = {}; - struct nvme_completion_poll_status status; - struct spdk_nvmf_fabric_prop_get_rsp *response; - int rc; - - cmd.opcode = SPDK_NVME_OPC_FABRIC; - cmd.fctype = SPDK_NVMF_FABRIC_COMMAND_PROPERTY_GET; - cmd.ofst = offset; - cmd.attrib.size = size; - - rc = spdk_nvme_ctrlr_cmd_admin_raw(ctrlr, (struct spdk_nvme_cmd *)&cmd, - NULL, 0, nvme_completion_poll_cb, - &status); - - if (rc < 0) { - SPDK_ERRLOG("failed to send nvme_rdma_fabric_prop_get_cmd\n"); - return -1; - } - - if (spdk_nvme_wait_for_completion(ctrlr->adminq, &status)) { - SPDK_ERRLOG("nvme_rdma_fabric_prop_get_cmd failed\n"); - return -1; - } - - response = (struct spdk_nvmf_fabric_prop_get_rsp *)&status.cpl; - - if (!size) { - *value = response->value.u32.low; - } else { - *value = response->value.u64; - } - - return 0; -} - static struct spdk_nvme_qpair * nvme_rdma_ctrlr_create_qpair(struct spdk_nvme_ctrlr *ctrlr, uint16_t qid, uint32_t qsize, @@ -1424,32 +1354,25 @@ nvme_rdma_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr) int nvme_rdma_ctrlr_set_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t value) { - return nvme_rdma_fabric_prop_set_cmd(ctrlr, offset, SPDK_NVMF_PROP_SIZE_4, value); + return nvme_fabric_ctrlr_set_reg_4(ctrlr, offset, value); } int nvme_rdma_ctrlr_set_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t value) { - return nvme_rdma_fabric_prop_set_cmd(ctrlr, offset, SPDK_NVMF_PROP_SIZE_8, value); + return nvme_fabric_ctrlr_set_reg_8(ctrlr, offset, value); } int nvme_rdma_ctrlr_get_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t *value) { - uint64_t tmp_value; - int rc; - rc = nvme_rdma_fabric_prop_get_cmd(ctrlr, offset, SPDK_NVMF_PROP_SIZE_4, &tmp_value); - - if (!rc) { - *value = (uint32_t)tmp_value; - } - return rc; + return nvme_fabric_ctrlr_get_reg_4(ctrlr, offset, value); } int nvme_rdma_ctrlr_get_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t *value) { - return nvme_rdma_fabric_prop_get_cmd(ctrlr, offset, SPDK_NVMF_PROP_SIZE_8, value); + return nvme_fabric_ctrlr_get_reg_8(ctrlr, offset, value); } int