nvmf/tcp: Use generic transport options structure

Remove the unnessary fields in spdk_nvmf_tcp_transport

Change-Id: I632608ba654b30f3511f5e1d925c6743c9100365
Signed-off-by: Ziye Yang <optimistyzy@gmail.com>
Reviewed-on: https://review.gerrithub.io/437271
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
Ziye Yang 2018-12-14 22:49:44 +08:00 committed by Changpeng Liu
parent c14dd64467
commit 04d09f9207
2 changed files with 46 additions and 39 deletions

View File

@ -299,11 +299,6 @@ struct spdk_nvmf_tcp_transport {
struct spdk_mempool *data_buf_pool; struct spdk_mempool *data_buf_pool;
uint16_t max_queue_depth;
uint32_t max_io_size;
uint32_t io_unit_size;
uint32_t in_capsule_data_size;
TAILQ_HEAD(, spdk_nvmf_tcp_port) ports; TAILQ_HEAD(, spdk_nvmf_tcp_port) ports;
}; };
@ -535,7 +530,7 @@ static struct spdk_nvmf_transport *
spdk_nvmf_tcp_create(struct spdk_nvmf_transport_opts *opts) spdk_nvmf_tcp_create(struct spdk_nvmf_transport_opts *opts)
{ {
struct spdk_nvmf_tcp_transport *ttransport; struct spdk_nvmf_tcp_transport *ttransport;
uint32_t sge_count; uint32_t sge_count;
ttransport = calloc(1, sizeof(*ttransport)); ttransport = calloc(1, sizeof(*ttransport));
if (!ttransport) { if (!ttransport) {
@ -548,26 +543,32 @@ spdk_nvmf_tcp_create(struct spdk_nvmf_transport_opts *opts)
SPDK_NOTICELOG("*** TCP Transport Init ***\n"); SPDK_NOTICELOG("*** TCP Transport Init ***\n");
ttransport->max_queue_depth = opts->max_queue_depth; SPDK_INFOLOG(SPDK_LOG_NVMF_TCP, "*** TCP Transport Init ***\n"
ttransport->max_io_size = opts->max_io_size; " Transport opts: max_ioq_depth=%d, max_io_size=%d,\n"
ttransport->in_capsule_data_size = opts->in_capsule_data_size; " max_qpairs_per_ctrlr=%d, io_unit_size=%d,\n"
ttransport->io_unit_size = opts->io_unit_size; " in_capsule_data_size=%d, max_aq_depth=%d\n",
opts->max_queue_depth,
opts->max_io_size,
opts->max_qpairs_per_ctrlr,
opts->io_unit_size,
opts->in_capsule_data_size,
opts->max_aq_depth);
/* I/O unit size cannot be larger than max I/O size */ /* I/O unit size cannot be larger than max I/O size */
if (ttransport->io_unit_size > ttransport->max_io_size) { if (opts->io_unit_size > opts->max_io_size) {
ttransport->io_unit_size = ttransport->max_io_size; opts->io_unit_size = opts->max_io_size;
} }
sge_count = ttransport->max_io_size / ttransport->io_unit_size; sge_count = opts->max_io_size / opts->io_unit_size;
if (sge_count > SPDK_NVMF_MAX_SGL_ENTRIES) { if (sge_count > SPDK_NVMF_MAX_SGL_ENTRIES) {
SPDK_ERRLOG("Unsupported IO Unit size specified, %d bytes\n", ttransport->io_unit_size); SPDK_ERRLOG("Unsupported IO Unit size specified, %d bytes\n", opts->io_unit_size);
free(ttransport); free(ttransport);
return NULL; return NULL;
} }
ttransport->data_buf_pool = spdk_mempool_create("spdk_nvmf_tcp_data", ttransport->data_buf_pool = spdk_mempool_create("spdk_nvmf_tcp_data",
ttransport->max_queue_depth * 4, /* The 4 is arbitrarily chosen. Needs to be configurable. */ opts->max_queue_depth * 4, /* The 4 is arbitrarily chosen. Needs to be configurable. */
ttransport->max_io_size + NVMF_DATA_BUFFER_ALIGNMENT, opts->max_io_size + NVMF_DATA_BUFFER_ALIGNMENT,
SPDK_MEMPOOL_DEFAULT_CACHE_SIZE, SPDK_MEMPOOL_DEFAULT_CACHE_SIZE,
SPDK_ENV_SOCKET_ID_ANY); SPDK_ENV_SOCKET_ID_ANY);
@ -594,10 +595,10 @@ spdk_nvmf_tcp_destroy(struct spdk_nvmf_transport *transport)
assert(transport != NULL); assert(transport != NULL);
ttransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_tcp_transport, transport); ttransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_tcp_transport, transport);
if (spdk_mempool_count(ttransport->data_buf_pool) != (ttransport->max_queue_depth * 4)) { if (spdk_mempool_count(ttransport->data_buf_pool) != (transport->opts.max_queue_depth * 4)) {
SPDK_ERRLOG("transport buffer pool count is %zu but should be %u\n", SPDK_ERRLOG("transport buffer pool count is %zu but should be %u\n",
spdk_mempool_count(ttransport->data_buf_pool), spdk_mempool_count(ttransport->data_buf_pool),
ttransport->max_queue_depth * 4); transport->opts.max_queue_depth * 4);
} }
spdk_mempool_free(ttransport->data_buf_pool); spdk_mempool_free(ttransport->data_buf_pool);
@ -972,8 +973,9 @@ spdk_nvmf_tcp_qpair_init_mem_resource(struct nvme_tcp_qpair *tqpair, uint16_t si
{ {
int i; int i;
struct nvme_tcp_req *tcp_req; struct nvme_tcp_req *tcp_req;
struct spdk_nvmf_transport *transport = tqpair->qpair.transport;
struct spdk_nvmf_tcp_transport *ttransport; struct spdk_nvmf_tcp_transport *ttransport;
ttransport = SPDK_CONTAINEROF(tqpair->qpair.transport, struct spdk_nvmf_tcp_transport, transport); ttransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_tcp_transport, transport);
if (!tqpair->qpair.sq_head_max) { if (!tqpair->qpair.sq_head_max) {
tqpair->req = calloc(1, sizeof(*tqpair->req)); tqpair->req = calloc(1, sizeof(*tqpair->req));
@ -982,8 +984,8 @@ spdk_nvmf_tcp_qpair_init_mem_resource(struct nvme_tcp_qpair *tqpair, uint16_t si
return -1; return -1;
} }
if (ttransport->in_capsule_data_size) { if (transport->opts.in_capsule_data_size) {
tqpair->buf = spdk_dma_zmalloc(ttransport->in_capsule_data_size, 0x1000, NULL); tqpair->buf = spdk_dma_zmalloc(ttransport->transport.opts.in_capsule_data_size, 0x1000, NULL);
if (!tqpair->buf) { if (!tqpair->buf) {
SPDK_ERRLOG("Unable to allocate buf on tqpair=%p.\n", tqpair); SPDK_ERRLOG("Unable to allocate buf on tqpair=%p.\n", tqpair);
return -1; return -1;
@ -1024,8 +1026,8 @@ spdk_nvmf_tcp_qpair_init_mem_resource(struct nvme_tcp_qpair *tqpair, uint16_t si
return -1; return -1;
} }
if (ttransport->in_capsule_data_size) { if (transport->opts.in_capsule_data_size) {
tqpair->bufs = spdk_dma_zmalloc(size * ttransport->in_capsule_data_size, tqpair->bufs = spdk_dma_zmalloc(size * transport->opts.in_capsule_data_size,
0x1000, NULL); 0x1000, NULL);
if (!tqpair->bufs) { if (!tqpair->bufs) {
SPDK_ERRLOG("Unable to allocate bufs on tqpair=%p.\n", tqpair); SPDK_ERRLOG("Unable to allocate bufs on tqpair=%p.\n", tqpair);
@ -1041,7 +1043,7 @@ spdk_nvmf_tcp_qpair_init_mem_resource(struct nvme_tcp_qpair *tqpair, uint16_t si
/* Set up memory to receive commands */ /* Set up memory to receive commands */
if (tqpair->bufs) { if (tqpair->bufs) {
tcp_req->buf = (void *)((uintptr_t)tqpair->bufs + (i * ttransport->in_capsule_data_size)); tcp_req->buf = (void *)((uintptr_t)tqpair->bufs + (i * transport->opts.in_capsule_data_size));
} }
/* Set the cmdn and rsp */ /* Set the cmdn and rsp */
@ -1437,9 +1439,9 @@ spdk_nvmf_tcp_h2c_data_hdr_handle(struct spdk_nvmf_tcp_transport *ttransport,
pdu->tcp_req = tcp_req; pdu->tcp_req = tcp_req;
pdu->data_len = h2c_data->datal; pdu->data_len = h2c_data->datal;
iov_index = pdu->hdr.h2c_data.datao / ttransport->io_unit_size; iov_index = pdu->hdr.h2c_data.datao / ttransport->transport.opts.io_unit_size;
pdu->data = tcp_req->req.iov[iov_index].iov_base + (pdu->hdr.h2c_data.datao % pdu->data = tcp_req->req.iov[iov_index].iov_base + (pdu->hdr.h2c_data.datao %
ttransport->io_unit_size); ttransport->transport.opts.io_unit_size);
spdk_nvmf_tcp_qpair_set_recv_state(tqpair, NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PAYLOAD); spdk_nvmf_tcp_qpair_set_recv_state(tqpair, NVME_TCP_PDU_RECV_STATE_AWAIT_PDU_PAYLOAD);
return; return;
@ -1731,7 +1733,8 @@ spdk_nvmf_tcp_icreq_handle(struct spdk_nvmf_tcp_transport *ttransport,
ic_resp->common.hlen = ic_resp->common.plen = sizeof(*ic_resp); ic_resp->common.hlen = ic_resp->common.plen = sizeof(*ic_resp);
ic_resp->pfv = 0; ic_resp->pfv = 0;
ic_resp->cpda = tqpair->cpda; ic_resp->cpda = tqpair->cpda;
tqpair->maxh2cdata = spdk_min(NVMF_TCP_PDU_MAX_H2C_DATA_SIZE, ttransport->io_unit_size); tqpair->maxh2cdata = spdk_min(NVMF_TCP_PDU_MAX_H2C_DATA_SIZE,
ttransport->transport.opts.io_unit_size);
ic_resp->maxh2cdata = tqpair->maxh2cdata; ic_resp->maxh2cdata = tqpair->maxh2cdata;
ic_resp->dgst.bits.hdgst_enable = tqpair->host_hdgst_enable ? 1 : 0; ic_resp->dgst.bits.hdgst_enable = tqpair->host_hdgst_enable ? 1 : 0;
ic_resp->dgst.bits.ddgst_enable = tqpair->host_ddgst_enable ? 1 : 0; ic_resp->dgst.bits.ddgst_enable = tqpair->host_ddgst_enable ? 1 : 0;
@ -2109,7 +2112,7 @@ spdk_nvmf_tcp_req_fill_iovs(struct spdk_nvmf_tcp_transport *ttransport,
tcp_req->req.iov[i].iov_base = (void *)((uintptr_t)(buf + NVMF_DATA_BUFFER_MASK) & tcp_req->req.iov[i].iov_base = (void *)((uintptr_t)(buf + NVMF_DATA_BUFFER_MASK) &
~NVMF_DATA_BUFFER_MASK); ~NVMF_DATA_BUFFER_MASK);
tcp_req->req.iov[i].iov_len = spdk_min(length, ttransport->io_unit_size); tcp_req->req.iov[i].iov_len = spdk_min(length, ttransport->transport.opts.io_unit_size);
tcp_req->req.iovcnt++; tcp_req->req.iovcnt++;
tcp_req->buffers[i] = buf; tcp_req->buffers[i] = buf;
length -= tcp_req->req.iov[i].iov_len; length -= tcp_req->req.iov[i].iov_len;
@ -2146,9 +2149,9 @@ spdk_nvmf_tcp_req_parse_sgl(struct spdk_nvmf_tcp_transport *ttransport,
if (sgl->generic.type == SPDK_NVME_SGL_TYPE_TRANSPORT_DATA_BLOCK && if (sgl->generic.type == SPDK_NVME_SGL_TYPE_TRANSPORT_DATA_BLOCK &&
sgl->unkeyed.subtype == SPDK_NVME_SGL_SUBTYPE_TRANSPORT) { sgl->unkeyed.subtype == SPDK_NVME_SGL_SUBTYPE_TRANSPORT) {
if (sgl->unkeyed.length > ttransport->max_io_size) { if (sgl->unkeyed.length > ttransport->transport.opts.max_io_size) {
SPDK_ERRLOG("SGL length 0x%x exceeds max io size 0x%x\n", SPDK_ERRLOG("SGL length 0x%x exceeds max io size 0x%x\n",
sgl->unkeyed.length, ttransport->max_io_size); sgl->unkeyed.length, ttransport->transport.opts.max_io_size);
rsp->status.sc = SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID; rsp->status.sc = SPDK_NVME_SC_DATA_SGL_LENGTH_INVALID;
return -1; return -1;
} }
@ -2177,7 +2180,7 @@ spdk_nvmf_tcp_req_parse_sgl(struct spdk_nvmf_tcp_transport *ttransport,
} else if (sgl->generic.type == SPDK_NVME_SGL_TYPE_DATA_BLOCK && } else if (sgl->generic.type == SPDK_NVME_SGL_TYPE_DATA_BLOCK &&
sgl->unkeyed.subtype == SPDK_NVME_SGL_SUBTYPE_OFFSET) { sgl->unkeyed.subtype == SPDK_NVME_SGL_SUBTYPE_OFFSET) {
uint64_t offset = sgl->address; uint64_t offset = sgl->address;
uint32_t max_len = ttransport->in_capsule_data_size; uint32_t max_len = ttransport->transport.opts.in_capsule_data_size;
SPDK_DEBUGLOG(SPDK_LOG_NVMF_TCP, "In-capsule data: offset 0x%" PRIx64 ", length 0x%x\n", SPDK_DEBUGLOG(SPDK_LOG_NVMF_TCP, "In-capsule data: offset 0x%" PRIx64 ", length 0x%x\n",
offset, sgl->unkeyed.length); offset, sgl->unkeyed.length);

View File

@ -221,10 +221,11 @@ test_nvmf_tcp_create(void)
CU_ASSERT_PTR_NOT_NULL(transport); CU_ASSERT_PTR_NOT_NULL(transport);
ttransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_tcp_transport, transport); ttransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_tcp_transport, transport);
SPDK_CU_ASSERT_FATAL(ttransport != NULL); SPDK_CU_ASSERT_FATAL(ttransport != NULL);
CU_ASSERT(ttransport->max_queue_depth == UT_MAX_QUEUE_DEPTH); transport->opts = opts;
CU_ASSERT(ttransport->max_io_size == UT_MAX_IO_SIZE); CU_ASSERT(transport->opts.max_queue_depth == UT_MAX_QUEUE_DEPTH);
CU_ASSERT(ttransport->in_capsule_data_size == UT_IN_CAPSULE_DATA_SIZE); CU_ASSERT(transport->opts.max_io_size == UT_MAX_IO_SIZE);
CU_ASSERT(ttransport->io_unit_size == UT_IO_UNIT_SIZE); CU_ASSERT(transport->opts.in_capsule_data_size == UT_IN_CAPSULE_DATA_SIZE);
CU_ASSERT(transport->opts.io_unit_size == UT_IO_UNIT_SIZE);
/* destroy transport */ /* destroy transport */
spdk_mempool_free(ttransport->data_buf_pool); spdk_mempool_free(ttransport->data_buf_pool);
spdk_io_device_unregister(ttransport, NULL); spdk_io_device_unregister(ttransport, NULL);
@ -240,12 +241,14 @@ test_nvmf_tcp_create(void)
opts.max_aq_depth = UT_MAX_AQ_DEPTH; opts.max_aq_depth = UT_MAX_AQ_DEPTH;
/* expect success */ /* expect success */
transport = spdk_nvmf_tcp_create(&opts); transport = spdk_nvmf_tcp_create(&opts);
CU_ASSERT_PTR_NOT_NULL(transport);
ttransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_tcp_transport, transport); ttransport = SPDK_CONTAINEROF(transport, struct spdk_nvmf_tcp_transport, transport);
SPDK_CU_ASSERT_FATAL(ttransport != NULL); SPDK_CU_ASSERT_FATAL(ttransport != NULL);
CU_ASSERT(ttransport->max_queue_depth == UT_MAX_QUEUE_DEPTH); transport->opts = opts;
CU_ASSERT(ttransport->max_io_size == UT_MAX_IO_SIZE); CU_ASSERT(transport->opts.max_queue_depth == UT_MAX_QUEUE_DEPTH);
CU_ASSERT(ttransport->in_capsule_data_size == UT_IN_CAPSULE_DATA_SIZE); CU_ASSERT(transport->opts.max_io_size == UT_MAX_IO_SIZE);
CU_ASSERT(ttransport->io_unit_size == UT_MAX_IO_SIZE); CU_ASSERT(transport->opts.in_capsule_data_size == UT_IN_CAPSULE_DATA_SIZE);
CU_ASSERT(transport->opts.io_unit_size == UT_MAX_IO_SIZE);
/* destroy transport */ /* destroy transport */
spdk_mempool_free(ttransport->data_buf_pool); spdk_mempool_free(ttransport->data_buf_pool);
spdk_io_device_unregister(ttransport, NULL); spdk_io_device_unregister(ttransport, NULL);
@ -287,6 +290,7 @@ test_nvmf_tcp_destroy(void)
opts.max_aq_depth = UT_MAX_AQ_DEPTH; opts.max_aq_depth = UT_MAX_AQ_DEPTH;
transport = spdk_nvmf_tcp_create(&opts); transport = spdk_nvmf_tcp_create(&opts);
CU_ASSERT_PTR_NOT_NULL(transport); CU_ASSERT_PTR_NOT_NULL(transport);
transport->opts = opts;
/* destroy transport */ /* destroy transport */
CU_ASSERT(spdk_nvmf_tcp_destroy(transport) == 0); CU_ASSERT(spdk_nvmf_tcp_destroy(transport) == 0);