From 990cd38a8c3bf7a00beee980b604783d63cbdaa5 Mon Sep 17 00:00:00 2001 From: Michael Haeuptle Date: Wed, 14 Dec 2022 20:24:27 +0000 Subject: [PATCH] bdev_nvme: Support for transport_tos in RPC Added transport_tos parameter to bdev_nvme_set_options and corresponding rpc.py command line. Signed-off-by: Michael Haeuptle Change-Id: If95eafbd9963fee8d7b230e91ec84dae8713df23 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15949 Tested-by: SPDK CI Jenkins Community-CI: Mellanox Build Bot Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk Reviewed-by: Jim Harris --- CHANGELOG.md | 4 ++++ module/bdev/nvme/bdev_nvme.c | 3 +++ module/bdev/nvme/bdev_nvme.h | 2 ++ module/bdev/nvme/bdev_nvme_rpc.c | 1 + python/spdk/rpc/bdev.py | 8 +++++++- scripts/rpc.py | 6 +++++- 6 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bd955bf6..2924487f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -115,6 +115,10 @@ tag that was logged at least once. Added `transport_tos` to `spdk_nvme_ctrlr_opts` to support setting of the "type of service" value in the IPv4 header. Only RDMA is supported at this time. +### bdev_nvme + +Updated `bdev_nvme_set_options` RPC (and rpc.py) to support the new `transport_tos` parameter. + ## v22.09 ### accel diff --git a/module/bdev/nvme/bdev_nvme.c b/module/bdev/nvme/bdev_nvme.c index 1dad8760e..1a133116d 100644 --- a/module/bdev/nvme/bdev_nvme.c +++ b/module/bdev/nvme/bdev_nvme.c @@ -123,6 +123,7 @@ static struct spdk_bdev_nvme_opts g_opts = { .fast_io_fail_timeout_sec = 0, .disable_auto_failback = false, .generate_uuids = false, + .transport_tos = 0, }; #define NVME_HOTPLUG_POLL_PERIOD_MAX 10000000ULL @@ -4892,6 +4893,7 @@ bdev_nvme_create(struct spdk_nvme_transport_id *trid, ctx->drv_opts.transport_ack_timeout = g_opts.transport_ack_timeout; ctx->drv_opts.keep_alive_timeout_ms = g_opts.keep_alive_timeout_ms; ctx->drv_opts.disable_read_ana_log_page = true; + ctx->drv_opts.transport_tos = g_opts.transport_tos; if (nvme_bdev_ctrlr_get_by_name(base_name) == NULL || multipath) { attach_cb = connect_attach_cb; @@ -6706,6 +6708,7 @@ bdev_nvme_opts_config_json(struct spdk_json_write_ctx *w) spdk_json_write_named_uint32(w, "reconnect_delay_sec", g_opts.reconnect_delay_sec); spdk_json_write_named_uint32(w, "fast_io_fail_timeout_sec", g_opts.fast_io_fail_timeout_sec); spdk_json_write_named_bool(w, "generate_uuids", g_opts.generate_uuids); + spdk_json_write_named_uint8(w, "transport_tos", g_opts.transport_tos); spdk_json_write_object_end(w); spdk_json_write_object_end(w); diff --git a/module/bdev/nvme/bdev_nvme.h b/module/bdev/nvme/bdev_nvme.h index 614a82139..631c63ded 100644 --- a/module/bdev/nvme/bdev_nvme.h +++ b/module/bdev/nvme/bdev_nvme.h @@ -252,6 +252,8 @@ struct spdk_bdev_nvme_opts { uint32_t fast_io_fail_timeout_sec; bool disable_auto_failback; bool generate_uuids; + /* Type of Service - RDMA only */ + uint8_t transport_tos; }; struct spdk_nvme_qpair *bdev_nvme_get_io_qpair(struct spdk_io_channel *ctrlr_io_ch); diff --git a/module/bdev/nvme/bdev_nvme_rpc.c b/module/bdev/nvme/bdev_nvme_rpc.c index 47ab131df..6ecda6723 100644 --- a/module/bdev/nvme/bdev_nvme_rpc.c +++ b/module/bdev/nvme/bdev_nvme_rpc.c @@ -69,6 +69,7 @@ static const struct spdk_json_object_decoder rpc_bdev_nvme_options_decoders[] = {"fast_io_fail_timeout_sec", offsetof(struct spdk_bdev_nvme_opts, fast_io_fail_timeout_sec), spdk_json_decode_uint32, true}, {"disable_auto_failback", offsetof(struct spdk_bdev_nvme_opts, disable_auto_failback), spdk_json_decode_bool, true}, {"generate_uuids", offsetof(struct spdk_bdev_nvme_opts, generate_uuids), spdk_json_decode_bool, true}, + {"transport_tos", offsetof(struct spdk_bdev_nvme_opts, transport_tos), spdk_json_decode_uint8, true}, }; static void diff --git a/python/spdk/rpc/bdev.py b/python/spdk/rpc/bdev.py index d2d58303f..2ddad0ded 100644 --- a/python/spdk/rpc/bdev.py +++ b/python/spdk/rpc/bdev.py @@ -531,7 +531,8 @@ def bdev_nvme_set_options(client, action_on_timeout=None, timeout_us=None, timeo nvme_adminq_poll_period_us=None, nvme_ioq_poll_period_us=None, io_queue_requests=None, delay_cmd_submit=None, transport_retry_count=None, bdev_retry_count=None, transport_ack_timeout=None, ctrlr_loss_timeout_sec=None, reconnect_delay_sec=None, - fast_io_fail_timeout_sec=None, disable_auto_failback=None, generate_uuids=None): + fast_io_fail_timeout_sec=None, disable_auto_failback=None, generate_uuids=None, + transport_tos=None): """Set options for the bdev nvme. This is startup command. Args: @@ -571,6 +572,8 @@ def bdev_nvme_set_options(client, action_on_timeout=None, timeout_us=None, timeo By default, immediately failback to the preferred I/O path if it is restored. (optional) generate_uuids: Enable generation of unique identifiers for NVMe bdevs only if they do not provide UUID themselves. These strings are based on device serial number and namespace ID and will always be the same for that device. + transport_tos: IPv4 Type of Service value. Only applicable for RDMA transports. + The default is 0 which means no TOS is applied. (optional) """ params = {} @@ -639,6 +642,9 @@ def bdev_nvme_set_options(client, action_on_timeout=None, timeout_us=None, timeo if generate_uuids is not None: params['generate_uuids'] = generate_uuids + if transport_tos is not None: + params['transport_tos'] = transport_tos + return client.call('bdev_nvme_set_options', params) diff --git a/scripts/rpc.py b/scripts/rpc.py index a3f3fc962..8494efdef 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -558,7 +558,8 @@ if __name__ == "__main__": reconnect_delay_sec=args.reconnect_delay_sec, fast_io_fail_timeout_sec=args.fast_io_fail_timeout_sec, disable_auto_failback=args.disable_auto_failback, - generate_uuids=args.generate_uuids) + generate_uuids=args.generate_uuids, + transport_tos=args.transport_tos) p = subparsers.add_parser('bdev_nvme_set_options', help='Set options for the bdev nvme type. This is startup command.') @@ -627,6 +628,9 @@ if __name__ == "__main__": help="""Enable generation of unique identifiers for NVMe bdevs only if they do not provide UUID themselves. These strings are based on device serial number and namespace ID and will always be the same for that device.""", action='store_true') + p.add_argument('--transport-tos', + help="""IPv4 Type of Service value. Only applicable for RDMA transports. + The default is 0 which means no TOS is applied.""", type=int) p.set_defaults(func=bdev_nvme_set_options)