From e528cd51e475442636853c30964b72d8f6dc3ba5 Mon Sep 17 00:00:00 2001 From: Tomasz Leman Date: Tue, 9 Apr 2024 10:48:43 +0200 Subject: [PATCH 1/2] init: Refactor check_restore to return bool This patch refactors the `check_restore` function to return a `bool` instead of an `int`. This change enhances code readability and clarifies the intent of the function, which is to return a true or false value based on the presence of core structures in memory. No functional changes are introduced by this patch; it is purely a code quality improvement. Signed-off-by: Tomasz Leman --- src/init/init.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/init/init.c b/src/init/init.c index 86049d8b6be1..dba599661a7a 100644 --- a/src/init/init.c +++ b/src/init/init.c @@ -89,7 +89,7 @@ static inline void lp_sram_unpack(void) #ifndef __ZEPHYR__ -static int check_restore(void) +static bool check_restore(void) { struct idc *idc = *idc_get(); struct task *task = *task_main_get(); @@ -100,10 +100,7 @@ static int check_restore(void) * are available in memory, it means that this is not cold boot and memory * has not been powered off. */ - if (!idc || !task || !notifier || !schedulers) - return 0; - - return 1; + return !!idc && !!task && !!notifier && !!schedulers; } static int secondary_core_restore(void) From c6df4a62933f8e2798d3d4b2dfa52564969be3f8 Mon Sep 17 00:00:00 2001 From: Tomasz Leman Date: Fri, 5 Apr 2024 17:27:00 +0200 Subject: [PATCH 2/2] 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);