Skip to content

Commit ec1864f

Browse files
committed
lib-manager: isolate instance-count handling for system-services
.bss splitting is specific to system-service module loading, other use-cases use a traditional shared .bss ELF section. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent a226676 commit ec1864f

1 file changed

Lines changed: 17 additions & 6 deletions

File tree

src/library_manager/lib_manager.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,9 @@ static void __sparse_cache *lib_manager_get_instance_bss_address(uint32_t module
233233
uint32_t instance_id,
234234
struct sof_man_module *mod)
235235
{
236+
if (mod->type.load_type == SOF_MAN_MOD_TYPE_LLEXT)
237+
return (void __sparse_cache *)mod->segment[SOF_MAN_SEGMENT_BSS].v_base_addr;
238+
236239
uint32_t instance_bss_size =
237240
mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count;
238241
uint32_t inst_offset = instance_bss_size * PAGE_SZ * instance_id;
@@ -250,11 +253,15 @@ static void __sparse_cache *lib_manager_get_instance_bss_address(uint32_t module
250253
static int lib_manager_allocate_module_instance(uint32_t module_id, uint32_t instance_id,
251254
uint32_t is_pages, struct sof_man_module *mod)
252255
{
253-
size_t bss_size =
254-
(mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count)
255-
* PAGE_SZ;
256256
void __sparse_cache *va_base = lib_manager_get_instance_bss_address(module_id,
257257
instance_id, mod);
258+
size_t bss_size;
259+
260+
if (mod->type.load_type == SOF_MAN_MOD_TYPE_LLEXT)
261+
bss_size = mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length * PAGE_SZ;
262+
else
263+
bss_size = (mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length /
264+
mod->instance_max_count) * PAGE_SZ;
258265

259266
if ((is_pages * PAGE_SZ) > bss_size) {
260267
tr_err(&lib_manager_tr,
@@ -275,12 +282,16 @@ static int lib_manager_allocate_module_instance(uint32_t module_id, uint32_t ins
275282
static int lib_manager_free_module_instance(uint32_t module_id, uint32_t instance_id,
276283
struct sof_man_module *mod)
277284
{
278-
size_t bss_size =
279-
(mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length / mod->instance_max_count)
280-
* PAGE_SZ;
285+
size_t bss_size;
281286
void __sparse_cache *va_base = lib_manager_get_instance_bss_address(module_id,
282287
instance_id, mod);
283288

289+
if (mod->type.load_type == SOF_MAN_MOD_TYPE_LLEXT)
290+
bss_size = mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length * PAGE_SZ;
291+
else
292+
bss_size = (mod->segment[SOF_MAN_SEGMENT_BSS].flags.r.length /
293+
mod->instance_max_count) * PAGE_SZ;
294+
284295
/* Unmap bss memory. */
285296
return lib_manager_align_unmap(va_base, bss_size);
286297
}

0 commit comments

Comments
 (0)