diff --git a/include/spdk_internal/accel_engine.h b/include/spdk_internal/accel_engine.h index ae4c38a6c..f430779c1 100644 --- a/include/spdk_internal/accel_engine.h +++ b/include/spdk_internal/accel_engine.h @@ -74,19 +74,29 @@ struct spdk_accel_module_if { */ void (*config_text)(FILE *fp); + /** + * Write Acceleration module configuration into provided JSON context. + */ + void (*write_config_json)(struct spdk_json_write_ctx *w); + + /** + * Returns the allocation size required for the modules to use for context. + */ size_t (*get_ctx_size)(void); + TAILQ_ENTRY(spdk_accel_module_if) tailq; }; void spdk_accel_hw_engine_register(struct spdk_accel_engine *accel_engine); void spdk_accel_module_list_add(struct spdk_accel_module_if *accel_module); -#define SPDK_ACCEL_MODULE_REGISTER(init_fn, fini_fn, config_fn, ctx_size_fn) \ +#define SPDK_ACCEL_MODULE_REGISTER(init_fn, fini_fn, config_fn, config_json, ctx_size_fn) \ static struct spdk_accel_module_if init_fn ## _if = { \ - .module_init = init_fn, \ - .module_fini = fini_fn, \ - .config_text = config_fn, \ - .get_ctx_size = ctx_size_fn, \ + .module_init = init_fn, \ + .module_fini = fini_fn, \ + .config_text = config_fn, \ + .write_config_json = config_json, \ + .get_ctx_size = ctx_size_fn, \ }; \ __attribute__((constructor)) static void init_fn ## _init(void) \ { \ diff --git a/lib/accel/accel_engine.c b/lib/accel/accel_engine.c index 7257afe3b..a4cbc6ced 100644 --- a/lib/accel/accel_engine.c +++ b/lib/accel/accel_engine.c @@ -223,11 +223,17 @@ spdk_accel_engine_module_finish_cb(void) void spdk_accel_write_config_json(struct spdk_json_write_ctx *w) { - /* TODO: call engine config_json entry points. */ - spdk_json_write_array_begin(w); - spdk_json_write_object_begin(w); - spdk_json_write_object_end(w); - spdk_json_write_array_end(w); + struct spdk_accel_module_if *accel_engine_module; + + /* + * The accel engine has no config, there may be some in + * the modules though. + */ + TAILQ_FOREACH(accel_engine_module, &spdk_accel_module_list, tailq) { + if (accel_engine_module->write_config_json) { + accel_engine_module->write_config_json(w); + } + } } void @@ -364,4 +370,4 @@ sw_accel_engine_fini(void *ctxt) } SPDK_ACCEL_MODULE_REGISTER(sw_accel_engine_init, sw_accel_engine_fini, - NULL, sw_accel_engine_get_ctx_size) + NULL, NULL, sw_accel_engine_get_ctx_size) diff --git a/mk/spdk.lib_deps.mk b/mk/spdk.lib_deps.mk index 2c24578be..69dc65d89 100644 --- a/mk/spdk.lib_deps.mk +++ b/mk/spdk.lib_deps.mk @@ -57,7 +57,7 @@ DEPDIRS-reduce := log util DEPDIRS-thread := log util DEPDIRS-blob := log util thread -DEPDIRS-accel := log json thread +DEPDIRS-accel := log thread DEPDIRS-jsonrpc := log util json DEPDIRS-virtio := log util json thread diff --git a/module/accel/idxd/accel_engine_idxd.c b/module/accel/idxd/accel_engine_idxd.c index 4ccadf710..d03840793 100644 --- a/module/accel/idxd/accel_engine_idxd.c +++ b/module/accel/idxd/accel_engine_idxd.c @@ -45,6 +45,7 @@ #include "spdk/thread.h" #include "spdk/idxd.h" #include "spdk/util.h" +#include "spdk/json.h" /* Undefine this to require an RPC to enable IDXD. */ #undef DEVELOPER_DEBUG_MODE @@ -55,6 +56,8 @@ static bool g_idxd_enable = true; static bool g_idxd_enable = false; #endif +uint32_t g_config_number; + enum channel_state { IDXD_CHANNEL_ACTIVE, IDXD_CHANNEL_PAUSED, @@ -470,8 +473,9 @@ accel_engine_idxd_enable_probe(uint32_t config_number) config_number = 0; } + g_config_number = config_number; g_idxd_enable = true; - spdk_idxd_set_config(config_number); + spdk_idxd_set_config(g_config_number); } static int @@ -521,8 +525,25 @@ accel_engine_idxd_exit(void *ctx) spdk_accel_engine_module_finish(); } +static void +accel_engine_idxd_write_config_json(struct spdk_json_write_ctx *w) +{ + spdk_json_write_array_begin(w); + + if (g_idxd_enable) { + spdk_json_write_object_begin(w); + spdk_json_write_named_string(w, "method", "idxd_scan_accel_engine"); + spdk_json_write_named_object_begin(w, "params"); + spdk_json_write_named_uint32(w, "config_number", g_config_number); + spdk_json_write_object_end(w); + spdk_json_write_object_end(w); + } + + spdk_json_write_array_end(w); +} + SPDK_ACCEL_MODULE_REGISTER(accel_engine_idxd_init, accel_engine_idxd_exit, - NULL, + NULL, accel_engine_idxd_write_config_json, accel_engine_idxd_get_ctx_size) SPDK_LOG_REGISTER_COMPONENT("accel_idxd", SPDK_LOG_ACCEL_IDXD) diff --git a/module/accel/ioat/accel_engine_ioat.c b/module/accel/ioat/accel_engine_ioat.c index 023b71c3f..a485878b7 100644 --- a/module/accel/ioat/accel_engine_ioat.c +++ b/module/accel/ioat/accel_engine_ioat.c @@ -134,7 +134,7 @@ accel_engine_ioat_get_ctx_size(void) } SPDK_ACCEL_MODULE_REGISTER(accel_engine_ioat_init, accel_engine_ioat_exit, - accel_engine_ioat_config_text, + accel_engine_ioat_config_text, NULL, accel_engine_ioat_get_ctx_size) static void diff --git a/module/event/subsystems/accel/accel.c b/module/event/subsystems/accel/accel.c index e9ec538bf..6d49bd5af 100644 --- a/module/event/subsystems/accel/accel.c +++ b/module/event/subsystems/accel/accel.c @@ -65,7 +65,7 @@ static struct spdk_subsystem g_spdk_subsystem_accel = { .init = spdk_accel_engine_subsystem_initialize, .fini = spdk_accel_engine_subsystem_finish, .config = spdk_accel_engine_config_text, - .write_config_json = NULL, + .write_config_json = spdk_accel_write_config_json, }; SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_accel); diff --git a/test/json_config/config_filter.py b/test/json_config/config_filter.py index 4f81ab077..7a5cb4e80 100755 --- a/test/json_config/config_filter.py +++ b/test/json_config/config_filter.py @@ -23,6 +23,7 @@ def sort_json_object(o): def filter_methods(do_remove_global_rpcs): global_rpcs = [ + 'idxd_scan_accel_engine', 'iscsi_set_options', 'nvmf_set_config', 'nvmf_set_max_subsystems',