Commit 7dab13c0 authored by Alexey Marchuk's avatar Alexey Marchuk Committed by Tomasz Zawadzki
Browse files

nvmf/rdma: Add data_wr_pool_size configuration



RDMA transport uses a pool of WRs to handle multi SGL
payload. This pool is common for the entire transport,
but its size is quite small. In multithread config
the default size might not be enough, this patch gives
the user possibility to change the size.
Default value of the pool size is changed to 4095

Signed-off-by: default avatarAlexey Marchuk <alexeymar@nvidia.com>
Signed-off-by: default avatarAllen Zhu <allenzhu@nvidia.com>
Change-Id: I0d5e4d20dc2b57f548c53967c61a738b36c72cd7
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/22833


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 70683284
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -8013,6 +8013,7 @@ disable_adaptive_irq | Optional | boolean | Disable adaptive interrupt fe
disable_shadow_doorbells    | Optional | boolean | disable shadow doorbell support (VFIO-USER only)
zcopy                       | Optional | boolean | Use zero-copy operations if the underlying bdev supports them
ack_timeout                 | Optional | number  | ACK timeout in milliseconds
data_wr_pool_size           | Optional | number  | RDMA data WR pool size (RDMA only)

#### Example

+3 −1
Original line number Diff line number Diff line
@@ -104,8 +104,10 @@ struct spdk_nvmf_transport_opts {
	uint8_t reserved61[3];
	/* ACK timeout in milliseconds */
	uint32_t ack_timeout;
	/* Size of RDMA data WR pool */
	uint32_t data_wr_pool_size;
} __attribute__((packed));
SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_transport_opts) == 68, "Incorrect size");
SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_transport_opts) == 72, "Incorrect size");

struct spdk_nvmf_listen_opts {
	/**
+4 −0
Original line number Diff line number Diff line
@@ -2331,6 +2331,10 @@ static const struct spdk_json_object_decoder nvmf_rpc_create_transport_decoder[]
	{
		"ack_timeout", offsetof(struct nvmf_rpc_create_transport_ctx, opts.ack_timeout),
		spdk_json_decode_uint32, true
	},
	{
		"data_wr_pool_size", offsetof(struct nvmf_rpc_create_transport_ctx, opts.data_wr_pool_size),
		spdk_json_decode_uint32, true
	}
};

+11 −4
Original line number Diff line number Diff line
@@ -2445,6 +2445,7 @@ nvmf_rdma_request_process(struct spdk_nvmf_rdma_transport *rtransport,
#define SPDK_NVMF_RDMA_ACCEPTOR_BACKLOG 100
#define SPDK_NVMF_RDMA_DEFAULT_ABORT_TIMEOUT_SEC 1
#define SPDK_NVMF_RDMA_DEFAULT_NO_WR_BATCHING false
#define SPDK_NVMF_RDMA_DEFAULT_DATA_WR_POOL_SIZE 4095

static void
nvmf_rdma_opts_init(struct spdk_nvmf_transport_opts *opts)
@@ -2460,6 +2461,7 @@ nvmf_rdma_opts_init(struct spdk_nvmf_transport_opts *opts)
	opts->dif_insert_or_strip =	SPDK_NVMF_RDMA_DIF_INSERT_OR_STRIP;
	opts->abort_timeout_sec =	SPDK_NVMF_RDMA_DEFAULT_ABORT_TIMEOUT_SEC;
	opts->transport_specific =      NULL;
	opts->data_wr_pool_size	=	SPDK_NVMF_RDMA_DEFAULT_DATA_WR_POOL_SIZE;
}

static int nvmf_rdma_destroy(struct spdk_nvmf_transport *transport,
@@ -2613,6 +2615,7 @@ nvmf_rdma_create(struct spdk_nvmf_transport_opts *opts)
	struct spdk_nvmf_rdma_transport *rtransport;
	struct spdk_nvmf_rdma_device	*device;
	struct ibv_context		**contexts;
	size_t				data_wr_pool_size;
	uint32_t			i;
	int				flag;
	uint32_t			sge_count;
@@ -2726,10 +2729,14 @@ nvmf_rdma_create(struct spdk_nvmf_transport_opts *opts)
		return NULL;
	}

	rtransport->data_wr_pool = spdk_mempool_create("spdk_nvmf_rdma_wr_data",
				   opts->max_queue_depth * SPDK_NVMF_MAX_SGL_ENTRIES,
				   sizeof(struct spdk_nvmf_rdma_request_data),
				   SPDK_MEMPOOL_DEFAULT_CACHE_SIZE,
	data_wr_pool_size = opts->data_wr_pool_size;
	if (data_wr_pool_size < SPDK_NVMF_MAX_SGL_ENTRIES * 2 * spdk_env_get_core_count()) {
		data_wr_pool_size = SPDK_NVMF_MAX_SGL_ENTRIES * 2 * spdk_env_get_core_count();
		SPDK_NOTICELOG("data_wr_pool_size is changed to %zu to guarantee enough cache for handling "
			       "at least one IO in each core\n", data_wr_pool_size);
	}
	rtransport->data_wr_pool = spdk_mempool_create("spdk_nvmf_rdma_wr_data", data_wr_pool_size,
				   sizeof(struct spdk_nvmf_rdma_request_data), SPDK_MEMPOOL_DEFAULT_CACHE_SIZE,
				   SPDK_ENV_SOCKET_ID_ANY);
	if (!rtransport->data_wr_pool) {
		if (spdk_mempool_lookup("spdk_nvmf_rdma_wr_data") != NULL) {
+3 −1
Original line number Diff line number Diff line
@@ -94,6 +94,7 @@ nvmf_transport_dump_opts(struct spdk_nvmf_transport *transport, struct spdk_json

	spdk_json_write_named_uint32(w, "abort_timeout_sec", opts->abort_timeout_sec);
	spdk_json_write_named_uint32(w, "ack_timeout", opts->ack_timeout);
	spdk_json_write_named_uint32(w, "data_wr_pool_size", opts->data_wr_pool_size);
	spdk_json_write_object_end(w);
}

@@ -151,10 +152,11 @@ nvmf_transport_opts_copy(struct spdk_nvmf_transport_opts *opts,
	SET_FIELD(acceptor_poll_rate);
	SET_FIELD(zcopy);
	SET_FIELD(ack_timeout);
	SET_FIELD(data_wr_pool_size);

	/* Do not remove this statement, you should always update this statement when you adding a new field,
	 * and do not forget to add the SET_FIELD statement for your added field. */
	SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_transport_opts) == 68, "Incorrect size");
	SPDK_STATIC_ASSERT(sizeof(struct spdk_nvmf_transport_opts) == 72, "Incorrect size");

#undef SET_FIELD
#undef FILED_CHECK
Loading