From c6df4a62933f8e2798d3d4b2dfa52564969be3f8 Mon Sep 17 00:00:00 2001 From: Tomasz Leman Date: Fri, 5 Apr 2024 17:27:00 +0200 Subject: [PATCH] init: zephyr: Fix memory leak during secondary core init This patch refines the initialization process for secondary cores in a multicore environment when using Zephyr as the RTOS. The patch introduces a `check_restore` function specifically for Zephyr, which checks if basic core structures (IDC, notifier, schedulers) have been previously allocated and are still present in memory, indicating that the system is not undergoing a cold boot. By adding this check, the system avoids unnecessary re-allocation of these structures during the power-up sequence of secondary cores, effectively preventing the memory leak observed during repeated power cycle tests. fix #9005 Signed-off-by: Tomasz Leman --- src/init/init.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/init/init.c b/src/init/init.c index dba599661a7a..c9cc1eed6fec 100644 --- a/src/init/init.c +++ b/src/init/init.c @@ -87,7 +87,24 @@ static inline void lp_sram_unpack(void) #if CONFIG_MULTICORE -#ifndef __ZEPHYR__ +#ifdef __ZEPHYR__ + +static bool check_restore(void) +{ + struct idc *idc = *idc_get(); + struct notify *notifier = *arch_notify_get(); + struct schedulers *schedulers = *arch_schedulers_get(); + + /* check whether basic core structures has been already allocated. If they + * are available in memory, it means that this is not cold boot and memory + * has not been powered off. + */ + return !!idc && !!notifier && !!schedulers; +} + +static inline int secondary_core_restore(void) { return 0; }; + +#else static bool check_restore(void) { @@ -155,7 +172,7 @@ int secondary_core_init(struct sof *sof) err = arch_init(); if (err < 0) sof_panic(SOF_IPC_PANIC_ARCH); - +#endif /* check whether we are in a cold boot process or not (e.g. D0->D0ix * flow when primary core disables all secondary cores). If not, we do * not have allocate basic structures like e.g. schedulers, notifier, @@ -164,7 +181,6 @@ int secondary_core_init(struct sof *sof) */ if (check_restore()) return secondary_core_restore(); -#endif trace_point(TRACE_BOOT_SYS_NOTIFIER); init_system_notify(sof);