From bc79c69ff0e25963fcc62b775c9018c45b231a88 Mon Sep 17 00:00:00 2001 From: Guennadi Liakhovetski Date: Fri, 8 Mar 2024 14:36:48 +0100 Subject: [PATCH] Revert "loading module: fix native module interface register" This reverts commit a0827526b7e1e4c88060812245a8cb9c381d5745. The commit prevents modules_free() from being called, which leads to leaking memory and a failure to call lib_manager_free_module(). For LLEXT modules this also leads to failures when using a module for the second and following times. Signed-off-by: Guennadi Liakhovetski --- src/audio/module_adapter/module/modules.c | 42 ++++++++++++++--------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/src/audio/module_adapter/module/modules.c b/src/audio/module_adapter/module/modules.c index de95fb95b6de..04e3a7137947 100644 --- a/src/audio/module_adapter/module/modules.c +++ b/src/audio/module_adapter/module/modules.c @@ -82,6 +82,8 @@ static int modules_new(struct processing_module *mod, const void *buildinfo, (module_entry->segment[SOF_MAN_SEGMENT_TEXT].v_base_addr); } + void *mod_adp; + byte_array_t mod_cfg = { .data = (uint8_t *)md->cfg.init_data, /* Intel modules expects DW size here */ @@ -91,21 +93,21 @@ static int modules_new(struct processing_module *mod, const void *buildinfo, /* Check if module is FDK */ if (mod_buildinfo->format == IADK_MODULE_API_BUILD_INFO_FORMAT && mod_buildinfo->api_version_number.full == IADK_MODULE_API_CURRENT_VERSION) { - md->module_adapter = (void *)system_agent_start(module_entry_point, - module_id, instance_id, - 0, log_handle, &mod_cfg); + mod_adp = system_agent_start(module_entry_point, module_id, + instance_id, 0, log_handle, &mod_cfg); } else if (mod_buildinfo->format == SOF_MODULE_API_BUILD_INFO_FORMAT && mod_buildinfo->api_version_number.full == SOF_MODULE_API_CURRENT_VERSION) { /* The module is native: start agent for sof loadable */ mod->is_native_sof = true; - md->ops = native_system_agent_start(mod->sys_service, module_entry_point, - module_id, instance_id, - 0, log_handle, &mod_cfg); + mod_adp = native_system_agent_start(mod->sys_service, module_entry_point, + module_id, instance_id, 0, log_handle, + &mod_cfg); } else { return -ENOEXEC; } md->module_entry_point = module_entry_point; + md->module_adapter = mod_adp; md->private = mod; return 0; @@ -161,7 +163,8 @@ static int modules_init(struct processing_module *mod) /* Call module specific init function if exists. */ if (mod->is_native_sof) { - const struct module_interface *mod_in = md->ops; + struct module_interface *mod_in = + (struct module_interface *)md->module_adapter; /* The order of preference */ if (mod_in->process) @@ -204,7 +207,8 @@ static int modules_prepare(struct processing_module *mod, /* Call module specific prepare function if exists. */ if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; + struct module_interface *mod_in = + (struct module_interface *)mod->priv.module_adapter; ret = mod_in->prepare(mod, sources, num_of_sources, sinks, num_of_sinks); } else { @@ -235,7 +239,7 @@ static int modules_process(struct processing_module *mod, return iadk_wrapper_process(mod->priv.module_adapter, sources, num_of_sources, sinks, num_of_sinks); - const struct module_interface *mod_in = mod->priv.ops; + struct module_interface *mod_in = (struct module_interface *)mod->priv.module_adapter; return mod_in->process(mod, sources, num_of_sources, sinks, num_of_sinks); } @@ -249,7 +253,7 @@ static int modules_process_audio_stream(struct processing_module *mod, if (!mod->is_native_sof) return -EOPNOTSUPP; - const struct module_interface *mod_in = mod->priv.ops; + struct module_interface *mod_in = (struct module_interface *)mod->priv.module_adapter; return mod_in->process_audio_stream(mod, input_buffers, num_input_buffers, output_buffers, num_output_buffers); @@ -277,7 +281,8 @@ static int modules_process_raw(struct processing_module *mod, modules_init_process(mod); /* Call module specific process function. */ - const struct module_interface *mod_in = mod->priv.ops; + struct module_interface *mod_in = + (struct module_interface *)mod->priv.module_adapter; return mod_in->process_raw_data(mod, input_buffers, num_input_buffers, output_buffers, num_output_buffers); @@ -299,7 +304,8 @@ static int modules_free(struct processing_module *mod) comp_info(dev, "modules_free()"); if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; + struct module_interface *mod_in = + (struct module_interface *)mod->priv.module_adapter; ret = mod_in->free(mod); } else { @@ -344,7 +350,8 @@ static int modules_set_configuration(struct processing_module *mod, uint32_t con size_t response_size) { if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; + struct module_interface *mod_in = + (struct module_interface *)mod->priv.module_adapter; return mod_in->set_configuration(mod, config_id, pos, data_offset_size, fragment, fragment_size, response, response_size); @@ -371,7 +378,8 @@ static int modules_get_configuration(struct processing_module *mod, uint32_t con size_t fragment_size) { if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; + struct module_interface *mod_in = + (struct module_interface *)mod->priv.module_adapter; return mod_in->get_configuration(mod, config_id, data_offset_size, fragment, fragment_size); @@ -392,7 +400,8 @@ static int modules_set_processing_mode(struct processing_module *mod, enum module_processing_mode mode) { if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; + struct module_interface *mod_in = + (struct module_interface *)mod->priv.module_adapter; return mod_in->set_processing_mode(mod, mode); } @@ -420,7 +429,8 @@ static enum module_processing_mode modules_get_processing_mode(struct processing static int modules_reset(struct processing_module *mod) { if (mod->is_native_sof) { - const struct module_interface *mod_in = mod->priv.ops; + struct module_interface *mod_in = + (struct module_interface *)mod->priv.module_adapter; return mod_in->reset(mod); }