From 7d68e2d5b92fdeadd2d8840c4c67c2d923b87e9b Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Wed, 29 Oct 2025 00:58:41 +0200 Subject: [PATCH 1/2] module_adapter: generic: Resource tracking container usage statistics Add resource tracking container usage statistics to module code. Signed-off-by: Jyri Sarha --- src/audio/module_adapter/module/generic.c | 6 ++++++ src/audio/module_adapter/module_adapter.c | 11 +++++++++++ src/include/sof/audio/module_adapter/module/generic.h | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/audio/module_adapter/module/generic.c b/src/audio/module_adapter/module/generic.c index f91518498d37..297787de3c43 100644 --- a/src/audio/module_adapter/module/generic.c +++ b/src/audio/module_adapter/module/generic.c @@ -80,6 +80,8 @@ static void mod_resource_init(struct processing_module *mod) list_init(&md->resources.cont_chunk_list); md->resources.heap_usage = 0; md->resources.heap_high_water_mark = 0; + md->resources.container_usage = 0; + md->resources.container_high_water_mark = 0; } int module_init(struct processing_module *mod) @@ -154,6 +156,9 @@ static struct module_resource *container_get(struct processing_module *mod) container = list_first_item(&res->free_cont_list, struct module_resource, list); list_item_del(&container->list); + res->container_usage++; + if (res->container_usage > res->container_high_water_mark) + res->container_high_water_mark = res->container_usage; return container; } @@ -162,6 +167,7 @@ static void container_put(struct processing_module *mod, struct module_resource struct module_resources *res = &mod->priv.resources; list_item_append(&container->list, &res->free_cont_list); + res->container_usage--; } /** diff --git a/src/audio/module_adapter/module_adapter.c b/src/audio/module_adapter/module_adapter.c index c5e6c75ca649..cdf56848d2cd 100644 --- a/src/audio/module_adapter/module_adapter.c +++ b/src/audio/module_adapter/module_adapter.c @@ -1303,6 +1303,17 @@ size_t module_adapter_heap_usage(struct processing_module *mod, size_t *hwm) } EXPORT_SYMBOL(module_adapter_heap_usage); +size_t module_adapter_container_usage(struct processing_module *mod, size_t *hwm) +{ + struct module_resources *res = &mod->priv.resources; + + if (hwm) + *hwm = res->container_high_water_mark; + + return res->container_usage; +} +EXPORT_SYMBOL(module_adapter_container_usage); + /* * \brief Get DAI hw params * \param[in] dev - component device pointer diff --git a/src/include/sof/audio/module_adapter/module/generic.h b/src/include/sof/audio/module_adapter/module/generic.h index 7138da3a697a..84b58f2e1d1e 100644 --- a/src/include/sof/audio/module_adapter/module/generic.h +++ b/src/include/sof/audio/module_adapter/module/generic.h @@ -132,6 +132,8 @@ struct module_resources { struct list_item cont_chunk_list; /**< Memory container chunks */ size_t heap_usage; size_t heap_high_water_mark; + size_t container_usage; + size_t container_high_water_mark; #if CONFIG_MODULE_MEMORY_API_DEBUG && defined(__ZEPHYR__) k_tid_t rsrc_mngr; #endif @@ -297,6 +299,7 @@ void module_adapter_free(struct comp_dev *dev); int module_adapter_reset(struct comp_dev *dev); size_t module_adapter_heap_usage(struct processing_module *mod, size_t *hwm); +size_t module_adapter_container_usage(struct processing_module *mod, size_t *hwm); #if CONFIG_IPC_MAJOR_3 static inline From 1187a1fb8126255ecd3043f244b5dfd78475a80b Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Wed, 29 Oct 2025 01:01:26 +0200 Subject: [PATCH 2/2] zephyr: shell: Add sof module_container_usage command Add sof module_container_usage command that prints out currently used resource containers and high water mark for each module instance. Signed-off-by: Jyri Sarha --- zephyr/sof_shell.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/zephyr/sof_shell.c b/zephyr/sof_shell.c index f10a2c9275b5..a92d8d68f506 100644 --- a/zephyr/sof_shell.c +++ b/zephyr/sof_shell.c @@ -68,6 +68,32 @@ static int cmd_sof_module_heap_usage(const struct shell *sh, return 0; } +static int cmd_sof_module_container_usage(const struct shell *sh, + size_t argc, char *argv[]) +{ + struct ipc *ipc = sof_get()->ipc; + struct list_item *clist, *_clist; + struct ipc_comp_dev *icd; + + if (!ipc) { + shell_print(sh, "No IPC"); + return 0; + } + + list_for_item_safe(clist, _clist, &ipc->comp_list) { + size_t usage, hwm; + + icd = container_of(clist, struct ipc_comp_dev, list); + if (icd->type != COMP_TYPE_COMPONENT) + continue; + + usage = module_adapter_container_usage(comp_mod(icd->cd), &hwm); + shell_print(sh, "comp id 0x%08x%9zu usage%9zu hwm", + icd->id, usage, hwm); + } + return 0; +} + SHELL_STATIC_SUBCMD_SET_CREATE(sof_commands, SHELL_CMD(test_inject_sched_gap, NULL, "Inject a gap to audio scheduling\n", @@ -77,6 +103,10 @@ SHELL_STATIC_SUBCMD_SET_CREATE(sof_commands, "Print heap memory usage of each module\n", cmd_sof_module_heap_usage), + SHELL_CMD(module_container_usage, NULL, + "Print resource tracking container usage of each module\n", + cmd_sof_module_container_usage), + SHELL_SUBCMD_SET_END );