examples/perf: set the number of IO requests for each queue pair

Low level NVMe driver will set the hardware IO queue size
based on MQES and users' input, perf tool has requested
maximum IO queue size when started, but for the number
of IO requests, it uses the default value.  While here,
set the number of IO requests to a higher value, so that
for high queue depth tests, the perf tool will not fail.

Fix the issue #256.

Change-Id: I6d11ec65e0f3b246b824875fa17d74a31fd2702b
Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.gerrithub.io/403256
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Changpeng Liu 2018-04-19 01:19:24 -04:00 committed by Daniel Verkamp
parent 8fdc3c0424
commit 23d7be9433

View File

@ -77,6 +77,7 @@ struct ns_entry {
struct ns_entry *next;
uint32_t io_size_blocks;
uint32_t num_io_requests;
uint64_t size_in_ios;
uint32_t io_flags;
uint16_t apptag_mask;
@ -233,10 +234,9 @@ register_ns(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns *ns)
if ((g_queue_depth * entries) > opts.io_queue_size) {
printf("controller IO queue size %u less than required\n",
opts.io_queue_size);
printf("configure an IO queue depth and IO size such that "
"the product is less than or equal to %u\n", opts.io_queue_size);
printf("Consider using lower queue depth or small IO size because "
"IO requests may be queued at the NVMe driver.\n");
g_warn = true;
return;
}
entry = calloc(1, sizeof(struct ns_entry));
@ -248,6 +248,7 @@ register_ns(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns *ns)
entry->type = ENTRY_TYPE_NVME_NS;
entry->u.nvme.ctrlr = ctrlr;
entry->u.nvme.ns = ns;
entry->num_io_requests = entries;
entry->size_in_ios = spdk_nvme_ns_get_size(ns) /
g_io_size_bytes;
@ -805,7 +806,15 @@ init_ns_worker_ctx(struct ns_worker_ctx *ns_ctx)
* TODO: If a controller has multiple namespaces, they could all use the same queue.
* For now, give each namespace/thread combination its own queue.
*/
ns_ctx->u.nvme.qpair = spdk_nvme_ctrlr_alloc_io_qpair(ns_ctx->entry->u.nvme.ctrlr, NULL, 0);
struct spdk_nvme_io_qpair_opts opts;
spdk_nvme_ctrlr_get_default_io_qpair_opts(ns_ctx->entry->u.nvme.ctrlr, &opts, sizeof(opts));
if (opts.io_queue_requests < ns_ctx->entry->num_io_requests) {
opts.io_queue_requests = ns_ctx->entry->num_io_requests;
}
ns_ctx->u.nvme.qpair = spdk_nvme_ctrlr_alloc_io_qpair(ns_ctx->entry->u.nvme.ctrlr, &opts,
sizeof(opts));
if (!ns_ctx->u.nvme.qpair) {
printf("ERROR: spdk_nvme_ctrlr_alloc_io_qpair failed\n");
return -1;