diff --git a/include/spdk/copy_engine.h b/include/spdk/copy_engine.h index 1b87b74e5..9f9ba346e 100644 --- a/include/spdk/copy_engine.h +++ b/include/spdk/copy_engine.h @@ -66,6 +66,13 @@ int spdk_copy_engine_initialize(void); */ void spdk_copy_engine_finish(spdk_copy_fini_cb cb_fn, void *cb_arg); +/** + * Get the configuration for the copy engine. + * + * \param fp The pointer to a file that will be written to the configuration. + */ +void spdk_copy_engine_config_text(FILE *fp); + /** * Close the copy engine module and perform any necessary cleanup. */ diff --git a/lib/copy/copy_engine.c b/lib/copy/copy_engine.c index d4725268c..f8b6fb8f0 100644 --- a/lib/copy/copy_engine.c +++ b/lib/copy/copy_engine.c @@ -285,4 +285,16 @@ spdk_copy_engine_finish(spdk_copy_fini_cb cb_fn, void *cb_arg) spdk_copy_engine_module_finish(); } +void +spdk_copy_engine_config_text(FILE *fp) +{ + struct spdk_copy_module_if *copy_engine_module; + + TAILQ_FOREACH(copy_engine_module, &spdk_copy_module_list, tailq) { + if (copy_engine_module->config_text) { + copy_engine_module->config_text(fp); + } + } +} + SPDK_COPY_MODULE_REGISTER(copy_engine_mem_init, NULL, NULL, copy_engine_mem_get_ctx_size) diff --git a/lib/copy/ioat/copy_engine_ioat.c b/lib/copy/ioat/copy_engine_ioat.c index 651942c16..f4f881944 100644 --- a/lib/copy/ioat/copy_engine_ioat.c +++ b/lib/copy/ioat/copy_engine_ioat.c @@ -116,6 +116,7 @@ struct ioat_task { static int copy_engine_ioat_init(void); static void copy_engine_ioat_exit(void *ctx); +static void copy_engine_ioat_config_text(FILE *fp); static size_t copy_engine_ioat_get_ctx_size(void) @@ -123,7 +124,8 @@ copy_engine_ioat_get_ctx_size(void) return sizeof(struct ioat_task) + sizeof(struct spdk_copy_task); } -SPDK_COPY_MODULE_REGISTER(copy_engine_ioat_init, copy_engine_ioat_exit, NULL, +SPDK_COPY_MODULE_REGISTER(copy_engine_ioat_init, copy_engine_ioat_exit, + copy_engine_ioat_config_text, copy_engine_ioat_get_ctx_size) static void @@ -319,3 +321,31 @@ copy_engine_ioat_init(void) sizeof(struct ioat_io_channel)); return 0; } + +#define COPY_ENGINE_IOAT_HEADER_TMPL \ +"[Ioat]\n" \ +" # Users may not want to use offload even it is available.\n" \ +" # Users may use the whitelist to initialize specified devices, IDS\n" \ +" # uses BUS:DEVICE.FUNCTION to identify each Ioat channel.\n" + +#define COPY_ENGINE_IOAT_DISABLE_TMPL \ +" Disable %s\n" + +#define COPY_ENGINE_IOAT_WHITELIST_TMPL \ +" Whitelist %.4" PRIx16 ":%.2" PRIx8 ":%.2" PRIx8 ".%" PRIx8 "\n" + +static void +copy_engine_ioat_config_text(FILE *fp) +{ + int i; + struct spdk_pci_addr *dev; + + fprintf(fp, COPY_ENGINE_IOAT_HEADER_TMPL); + fprintf(fp, COPY_ENGINE_IOAT_DISABLE_TMPL, g_ioat_disable ? "Yes" : "No"); + + for (i = 0; i < g_probe_ctx.num_whitelist_devices; i++) { + dev = &g_probe_ctx.whitelist[i]; + fprintf(fp, COPY_ENGINE_IOAT_WHITELIST_TMPL, + dev->domain, dev->bus, dev->dev, dev->func); + } +} diff --git a/lib/event/subsystems/copy/copy.c b/lib/event/subsystems/copy/copy.c index 810d848b5..9bc6e2811 100644 --- a/lib/event/subsystems/copy/copy.c +++ b/lib/event/subsystems/copy/copy.c @@ -64,7 +64,7 @@ static struct spdk_subsystem g_spdk_subsystem_copy = { .name = "copy", .init = spdk_copy_engine_subsystem_initialize, .fini = spdk_copy_engine_subsystem_finish, - .config = NULL, + .config = spdk_copy_engine_config_text, }; SPDK_SUBSYSTEM_REGISTER(g_spdk_subsystem_copy);