From 542be8790b73817c545a19750e5621ed2f111a48 Mon Sep 17 00:00:00 2001 From: Evgeniy Kochetov Date: Mon, 18 Nov 2019 17:11:39 +0000 Subject: [PATCH] nvme/rpc: Make 'delay_cmd_submit' configurable via RPC Optional parameter 'delay_cmd_submit' has been added to 'bdev_nvme_set_options' RPC method. Signed-off-by: Evgeniy Kochetov Signed-off-by: Sasha Kotchubievsky Signed-off-by: Alexey Marchuk Change-Id: Ia09c57bbac8078ee6ab1e8f0bd279ffeb9e08cb8 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/462584 Tested-by: SPDK CI Jenkins Reviewed-by: Jim Harris Reviewed-by: Ben Walker Reviewed-by: Shuhei Matsumoto Community-CI: Broadcom SPDK FC-NVMe CI --- CHANGELOG.md | 4 ++++ doc/jsonrpc.md | 2 ++ module/bdev/nvme/bdev_nvme.c | 1 + module/bdev/nvme/bdev_nvme_rpc.c | 5 +++-- scripts/rpc.py | 6 +++++- scripts/rpc/bdev.py | 7 ++++++- 6 files changed, 21 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32bd56daf..d8fcb17a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,10 @@ has been added. The public API is available at `include/spdk/pipe.h`. `delayed_pcie_doorbell` parameter in `spdk_nvme_io_qpair_opts` was renamed to `delay_cmd_submit` to allow reuse in other transports. +### rpc + +Added optional 'delay_cmd_submit' parameter to 'bdev_nvme_set_options' RPC method. + ## v19.10: ### rpc diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index d06d7fb0e..ed7ac0c2f 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -1416,6 +1416,7 @@ high_priority_weight | Optional | number | The maximum number of comm nvme_adminq_poll_period_us | Optional | number | How often the admin queue is polled for asynchronous events in microseconds nvme_ioq_poll_period_us | Optional | number | How often I/O queues are polled for completions, in microseconds. Default: 0 (as fast as possible). io_queue_requests | Optional | number | The number of requests allocated for each NVMe I/O queue. Default: 512. +delay_cmd_submit | Optional | boolean | Enable delaying NVMe command submission to allow batching of multiple commands. Default: `true`. ### Example @@ -1434,6 +1435,7 @@ request: "timeout_us": 10000000, "action_on_timeout": "reset", "io_queue_requests" : 2048, + "delay_cmd_submit": true }, "jsonrpc": "2.0", "method": "bdev_nvme_set_options", diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index f75a67263..35ae93dbe 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -2287,6 +2287,7 @@ bdev_nvme_config_json(struct spdk_json_write_ctx *w) spdk_json_write_named_uint64(w, "nvme_adminq_poll_period_us", g_opts.nvme_adminq_poll_period_us); spdk_json_write_named_uint64(w, "nvme_ioq_poll_period_us", g_opts.nvme_ioq_poll_period_us); spdk_json_write_named_uint32(w, "io_queue_requests", g_opts.io_queue_requests); + spdk_json_write_named_bool(w, "delay_cmd_submit", g_opts.delay_cmd_submit); spdk_json_write_object_end(w); spdk_json_write_object_end(w); diff --git a/module/bdev/nvme/bdev_nvme_rpc.c b/module/bdev/nvme/bdev_nvme_rpc.c index 795dfbcfe..cc1236491 100644 --- a/module/bdev/nvme/bdev_nvme_rpc.c +++ b/module/bdev/nvme/bdev_nvme_rpc.c @@ -1,8 +1,8 @@ /*- * BSD LICENSE * - * Copyright (c) Intel Corporation. - * All rights reserved. + * Copyright (c) Intel Corporation. All rights reserved. + * Copyright (c) 2019 Mellanox Technologies LTD. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -82,6 +82,7 @@ static const struct spdk_json_object_decoder rpc_bdev_nvme_options_decoders[] = {"nvme_adminq_poll_period_us", offsetof(struct spdk_bdev_nvme_opts, nvme_adminq_poll_period_us), spdk_json_decode_uint64, true}, {"nvme_ioq_poll_period_us", offsetof(struct spdk_bdev_nvme_opts, nvme_ioq_poll_period_us), spdk_json_decode_uint64, true}, {"io_queue_requests", offsetof(struct spdk_bdev_nvme_opts, io_queue_requests), spdk_json_decode_uint32, true}, + {"delay_cmd_submit", offsetof(struct spdk_bdev_nvme_opts, delay_cmd_submit), spdk_json_decode_bool, true}, }; static void diff --git a/scripts/rpc.py b/scripts/rpc.py index 702e22078..13157d850 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -357,7 +357,8 @@ if __name__ == "__main__": high_priority_weight=args.high_priority_weight, nvme_adminq_poll_period_us=args.nvme_adminq_poll_period_us, nvme_ioq_poll_period_us=args.nvme_ioq_poll_period_us, - io_queue_requests=args.io_queue_requests) + io_queue_requests=args.io_queue_requests, + delay_cmd_submit=args.delay_cmd_submit) p = subparsers.add_parser('bdev_nvme_set_options', aliases=['set_bdev_nvme_options'], help='Set options for the bdev nvme type. This is startup command.') @@ -381,6 +382,9 @@ if __name__ == "__main__": help='How often to poll I/O queues for completions', type=int) p.add_argument('-s', '--io-queue-requests', help='The number of requests allocated for each NVMe I/O queue. Default: 512', type=int) + p.add_argument('-d', '--disable-delay-cmd-submit', + help='Disable delaying NVMe command submission, i.e. no batching of multiple commands', + action='store_false', dest='delay_cmd_submit', default=True) p.set_defaults(func=bdev_nvme_set_options) def bdev_nvme_set_hotplug(args): diff --git a/scripts/rpc/bdev.py b/scripts/rpc/bdev.py index b2c54e0be..fe33406b2 100644 --- a/scripts/rpc/bdev.py +++ b/scripts/rpc/bdev.py @@ -355,7 +355,8 @@ def bdev_uring_delete(client, name): def bdev_nvme_set_options(client, action_on_timeout=None, timeout_us=None, retry_count=None, arbitration_burst=None, low_priority_weight=None, medium_priority_weight=None, high_priority_weight=None, - nvme_adminq_poll_period_us=None, nvme_ioq_poll_period_us=None, io_queue_requests=None): + nvme_adminq_poll_period_us=None, nvme_ioq_poll_period_us=None, io_queue_requests=None, + delay_cmd_submit=None): """Set options for the bdev nvme. This is startup command. Args: @@ -369,6 +370,7 @@ def bdev_nvme_set_options(client, action_on_timeout=None, timeout_us=None, retry nvme_adminq_poll_period_us: How often the admin queue is polled for asynchronous events in microseconds (optional) nvme_ioq_poll_period_us: How often to poll I/O queues for completions in microseconds (optional) io_queue_requests: The number of requests allocated for each NVMe I/O queue. Default: 512 (optional) + delay_cmd_submit: Enable delayed NVMe command submission to allow batching of multiple commands (optional) """ params = {} @@ -402,6 +404,9 @@ def bdev_nvme_set_options(client, action_on_timeout=None, timeout_us=None, retry if io_queue_requests: params['io_queue_requests'] = io_queue_requests + if delay_cmd_submit is not None: + params['delay_cmd_submit'] = delay_cmd_submit + return client.call('bdev_nvme_set_options', params)