Skip to content

Commit 1be651c

Browse files
committed
xtos: heap: check all SYS_ allocations
Previously with xtos config the linker would reserve a guaranteed heap for init system allocations that were all guaranteed to succeed. These allocations never failed with Zephyr as they were all done at early boot. Be more mindful and check in the unlikely result of a failure. e.g. a Kconfig with heapsize == 0 Signed-off-by: Liam Girdwood <liam.r.girdwood@linux.intel.com>
1 parent 3a3d6c0 commit 1be651c

File tree

15 files changed

+82
-1
lines changed

15 files changed

+82
-1
lines changed

src/audio/base_fw_intel.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,10 @@ __cold static int basefw_mem_state_info(uint32_t *data_offset, char *data)
183183
size = ALIGN(size, 4);
184184
/* size is also saved as tuple length */
185185
tuple_data = rballoc(SOF_MEM_FLAG_USER, size);
186+
if (!tuple_data) {
187+
LOG_ERR("basefw_mem_state_info(): allocation failed");
188+
return IPC4_ERROR_INVALID_PARAM;
189+
}
186190

187191
/* save memory info in data array since info length is variable */
188192
index = 0;

src/drivers/mediatek/mt818x/ipc.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@ int platform_ipc_init(struct ipc *ipc)
128128
struct ipc_data *iipc;
129129

130130
iipc = rzalloc(SOF_MEM_FLAG_KERNEL, sizeof(*iipc));
131+
if (!iipc) {
132+
tr_err(&ipc_tr, "Unable to allocate memory for IPC data");
133+
return -ENOMEM;
134+
}
131135
ipc_set_drvdata(ipc, iipc);
132136
#else
133137
ipc_set_drvdata(ipc, NULL);

src/drivers/mediatek/mt8195/ipc.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ int platform_ipc_init(struct ipc *ipc)
127127
struct ipc_data *iipc;
128128

129129
iipc = rzalloc(SOF_MEM_FLAG_KERNEL, sizeof(*iipc));
130+
if (!iipc) {
131+
tr_err(&ipc_tr, "Unable to allocate memory for IPC data");
132+
return -ENOMEM;
133+
}
130134
ipc_set_drvdata(ipc, iipc);
131135
#else
132136
ipc_set_drvdata(ipc, NULL);

src/drivers/mediatek/mt8196/ipc.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ int platform_ipc_init(struct ipc *ipc)
127127
struct ipc_data *iipc;
128128

129129
iipc = rzalloc(SOF_MEM_FLAG_KERNEL, sizeof(*iipc));
130+
if (!iipc) {
131+
tr_err(&ipc_tr, "Unable to allocate memory for IPC data");
132+
return -ENOMEM;
133+
}
130134
ipc_set_drvdata(ipc, iipc);
131135
#else
132136
ipc_set_drvdata(ipc, NULL);

src/include/sof/schedule/ll_schedule_domain.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ static inline struct ll_schedule_domain *domain_init
9999
struct ll_schedule_domain *domain;
100100

101101
domain = rzalloc(SOF_MEM_FLAG_KERNEL | SOF_MEM_FLAG_COHERENT, sizeof(*domain));
102+
if (!domain)
103+
return NULL;
102104
domain->type = type;
103105
domain->clk = clk;
104106
domain->synchronous = synchronous;

src/lib/pm_runtime.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ DECLARE_TR_CTX(pm_tr, SOF_UUID(pm_runtime_uuid), LOG_LEVEL_INFO);
3333
void pm_runtime_init(struct sof *sof)
3434
{
3535
sof->prd = rzalloc(SOF_MEM_FLAG_KERNEL | SOF_MEM_FLAG_COHERENT, sizeof(*sof->prd));
36+
if (!sof->prd) {
37+
tr_err(&pm_tr, "pm_runtime_init(): allocation failed");
38+
return;
39+
}
3640
k_spinlock_init(&sof->prd->lock);
3741

3842
platform_pm_runtime_init(sof->prd);
@@ -149,6 +153,10 @@ void init_dsp_r_state(enum dsp_r_state r_state)
149153
struct r_counters_data *r_counters;
150154

151155
r_counters = rzalloc(SOF_MEM_FLAG_KERNEL | SOF_MEM_FLAG_COHERENT, sizeof(*r_counters));
156+
if (!r_counters) {
157+
tr_err(&pm_tr, "init_dsp_r_state(): allocation failed");
158+
return;
159+
}
152160
prd->r_counters = r_counters;
153161

154162
r_counters->ts = sof_cycle_get_64();

src/schedule/dma_multi_chan_domain.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,17 @@ struct ll_schedule_domain *dma_multi_chan_domain_init(struct dma *dma_array,
370370

371371
domain = domain_init(SOF_SCHEDULE_LL_DMA, clk, true,
372372
&dma_multi_chan_domain_ops);
373+
if (!domain) {
374+
tr_err(&ll_tr, "dma_multi_chan_domain_init(): domain init failed");
375+
return NULL;
376+
}
373377

374378
dma_domain = rzalloc(SOF_MEM_FLAG_KERNEL | SOF_MEM_FLAG_COHERENT, sizeof(*dma_domain));
379+
if (!dma_domain) {
380+
tr_err(&ll_tr, "dma_multi_chan_domain_init(): allocation failed");
381+
rfree(domain);
382+
return NULL;
383+
}
375384
dma_domain->dma_array = dma_array;
376385
dma_domain->num_dma = num_dma;
377386
dma_domain->aggregated_irq = aggregated_irq;

src/schedule/dma_single_chan_domain.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,8 +543,17 @@ struct ll_schedule_domain *dma_single_chan_domain_init(struct dma *dma_array,
543543

544544
domain = domain_init(SOF_SCHEDULE_LL_DMA, clk, false,
545545
&dma_single_chan_domain_ops);
546+
if (!domain) {
547+
tr_err(&ll_tr, "dma_single_chan_domain_init(): domain init failed");
548+
return NULL;
549+
}
546550

547551
dma_domain = rzalloc(SOF_MEM_FLAG_KERNEL | SOF_MEM_FLAG_COHERENT, sizeof(*dma_domain));
552+
if (!dma_domain) {
553+
tr_err(&ll_tr, "dma_single_chan_domain_init(): allocation failed");
554+
rfree(domain);
555+
return NULL;
556+
}
548557
dma_domain->dma_array = dma_array;
549558
dma_domain->num_dma = num_dma;
550559
dma_domain->owner = DMA_DOMAIN_OWNER_INVALID;

src/schedule/edf_schedule.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,11 @@ int scheduler_init_edf(void)
258258

259259
edf_sch = rzalloc(SOF_MEM_FLAG_KERNEL,
260260
sizeof(*edf_sch));
261+
if (!edf_sch) {
262+
tr_err(&edf_tr, "scheduler_init_edf(): allocation failed");
263+
return -ENOMEM;
264+
}
265+
261266
list_init(&edf_sch->list);
262267
edf_sch->clock = PLATFORM_DEFAULT_CLOCK;
263268

src/schedule/ll_schedule.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,10 @@ int scheduler_init_ll(struct ll_schedule_domain *domain)
782782

783783
/* initialize scheduler private data */
784784
sch = rzalloc(SOF_MEM_FLAG_KERNEL, sizeof(*sch));
785+
if (!sch) {
786+
tr_err(&ll_tr, "scheduler_init_ll(): allocation failed");
787+
return -ENOMEM;
788+
}
785789
list_init(&sch->tasks);
786790
atomic_init(&sch->num_tasks, 0);
787791
sch->domain = domain;

0 commit comments

Comments
 (0)