From 35429c9b5d36cf427613c214cf3676b63767b0de Mon Sep 17 00:00:00 2001 From: Evgeniy Kochetov Date: Tue, 28 Jan 2020 22:18:16 +0000 Subject: [PATCH] sock: Save socket subsystem configuration in JSON format Signed-off-by: Evgeniy Kochetov Change-Id: I32c25e6410c418ffa00a76559aa7b6999e2269ba Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/617 Tested-by: SPDK CI Jenkins Community-CI: Broadcom CI Community-CI: Mellanox Build Bot Reviewed-by: Shuhei Matsumoto Reviewed-by: Tomasz Zawadzki --- include/spdk/sock.h | 8 +++++++ lib/sock/sock.c | 34 +++++++++++++++++++++++++++++ lib/sock/spdk_sock.map | 1 + mk/spdk.lib_deps.mk | 2 +- module/event/subsystems/sock/sock.c | 7 ++++++ test/json_config/clear_config.py | 4 ++++ test/json_config/config_filter.py | 1 + 7 files changed, 56 insertions(+), 1 deletion(-) diff --git a/include/spdk/sock.h b/include/spdk/sock.h index 0acdd4f59..3111f2ba3 100644 --- a/include/spdk/sock.h +++ b/include/spdk/sock.h @@ -41,6 +41,7 @@ #include "spdk/stdinc.h" #include "spdk/queue.h" +#include "spdk/json.h" #ifdef __cplusplus extern "C" { @@ -450,6 +451,13 @@ int spdk_sock_impl_get_opts(const char *impl_name, struct spdk_sock_impl_opts *o int spdk_sock_impl_set_opts(const char *impl_name, const struct spdk_sock_impl_opts *opts, size_t len); +/** + * Write socket subsystem configuration into provided JSON context. + * + * \param w JSON write context + */ +void spdk_sock_write_config_json(struct spdk_json_write_ctx *w); + #ifdef __cplusplus } #endif diff --git a/lib/sock/sock.c b/lib/sock/sock.c index 096cefd9a..2551202f3 100644 --- a/lib/sock/sock.c +++ b/lib/sock/sock.c @@ -751,6 +751,40 @@ spdk_sock_impl_set_opts(const char *impl_name, const struct spdk_sock_impl_opts return impl->set_opts(opts, len); } +void +spdk_sock_write_config_json(struct spdk_json_write_ctx *w) +{ + struct spdk_net_impl *impl; + struct spdk_sock_impl_opts opts; + size_t len; + + assert(w != NULL); + + spdk_json_write_array_begin(w); + + STAILQ_FOREACH(impl, &g_net_impls, link) { + if (!impl->get_opts) { + continue; + } + + len = sizeof(opts); + if (impl->get_opts(&opts, &len) == 0) { + spdk_json_write_object_begin(w); + spdk_json_write_named_string(w, "method", "sock_impl_set_options"); + spdk_json_write_named_object_begin(w, "params"); + spdk_json_write_named_string(w, "impl_name", impl->name); + spdk_json_write_named_uint32(w, "recv_buf_size", opts.recv_buf_size); + spdk_json_write_named_uint32(w, "send_buf_size", opts.send_buf_size); + spdk_json_write_object_end(w); + spdk_json_write_object_end(w); + } else { + SPDK_ERRLOG("Failed to get socket options for socket implementation %s\n", impl->name); + } + } + + spdk_json_write_array_end(w); +} + void spdk_net_impl_register(struct spdk_net_impl *impl, int priority) { diff --git a/lib/sock/spdk_sock.map b/lib/sock/spdk_sock.map index 20d6fd93b..e3fb44281 100644 --- a/lib/sock/spdk_sock.map +++ b/lib/sock/spdk_sock.map @@ -31,6 +31,7 @@ spdk_sock_get_optimal_sock_group; spdk_sock_impl_get_opts; spdk_sock_impl_set_opts; + spdk_sock_write_config_json; # public functions in spdk/net.h spdk_net_framework_register; diff --git a/mk/spdk.lib_deps.mk b/mk/spdk.lib_deps.mk index ef77a6ab5..d9bcaff6e 100644 --- a/mk/spdk.lib_deps.mk +++ b/mk/spdk.lib_deps.mk @@ -171,4 +171,4 @@ DEPDIRS-event_scsi := event scsi event_bdev DEPDIRS-event_iscsi := event iscsi event_scsi event_sock DEPDIRS-event_vhost := event vhost event_scsi -DEPDIRS-event_sock := event +DEPDIRS-event_sock := event sock diff --git a/module/event/subsystems/sock/sock.c b/module/event/subsystems/sock/sock.c index 516122369..fdcb2160a 100644 --- a/module/event/subsystems/sock/sock.c +++ b/module/event/subsystems/sock/sock.c @@ -46,10 +46,17 @@ sock_subsystem_fini(void) spdk_subsystem_fini_next(); } +static void +sock_subsystem_write_config_json(struct spdk_json_write_ctx *w) +{ + spdk_sock_write_config_json(w); +} + static struct spdk_subsystem g_spdk_subsystem_sock = { .name = "sock", .init = sock_subsystem_init, .fini = sock_subsystem_fini, + .write_config_json = sock_subsystem_write_config_json, }; SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_sock); diff --git a/test/json_config/clear_config.py b/test/json_config/clear_config.py index 332e9466e..bac1beebb 100755 --- a/test/json_config/clear_config.py +++ b/test/json_config/clear_config.py @@ -157,6 +157,10 @@ def clear_vmd_subsystem(args, vmd_config): pass +def clear_sock_subsystem(args, sock_config): + pass + + def call_test_cmd(func): def rpc_test_cmd(*args, **kwargs): try: diff --git a/test/json_config/config_filter.py b/test/json_config/config_filter.py index 7a5cb4e80..cde2e24f9 100755 --- a/test/json_config/config_filter.py +++ b/test/json_config/config_filter.py @@ -31,6 +31,7 @@ def filter_methods(do_remove_global_rpcs): 'bdev_set_options', 'bdev_nvme_set_options', 'bdev_nvme_set_hotplug', + 'sock_impl_set_options', ] data = json.loads(sys.stdin.read())