Skip to content

Commit

Permalink
init: zephyr: Fix memory leak during secondary core init
Browse files Browse the repository at this point in the history
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 <tomasz.m.leman@intel.com>
  • Loading branch information
tmleman authored and lgirdwood committed Apr 9, 2024
1 parent c159c1f commit a43981e
Showing 1 changed file with 19 additions and 3 deletions.
22 changes: 19 additions & 3 deletions src/init/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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,
Expand All @@ -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);
Expand Down

0 comments on commit a43981e

Please sign in to comment.