Skip to content

Commit 6d2d581

Browse files
lyakhlgirdwood
authored andcommitted
Revert "audio: module-adapter: use objpool for allocation containers"
This reverts commit 8acc9ca. It seems to break certain capture flows, revert it until fixed. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent abf1aa9 commit 6d2d581

11 files changed

Lines changed: 86 additions & 60 deletions

File tree

posix/include/rtos/alloc.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,10 @@ static inline void k_heap_init(struct k_heap *heap, void *mem, size_t bytes)
140140
void *sof_heap_alloc(struct k_heap *heap, uint32_t flags, size_t bytes,
141141
size_t alignment);
142142
void sof_heap_free(struct k_heap *heap, void *addr);
143-
struct k_heap *sof_sys_heap_get(void);
143+
static inline struct k_heap *sof_sys_heap_get(void)
144+
{
145+
return NULL;
146+
}
144147

145148
/**
146149
* Calculates length of the null-terminated string.

src/audio/module_adapter/module/generic.c

Lines changed: 76 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
*/
1313

1414
#include <rtos/symbol.h>
15-
#include <sof/compiler_attributes.h>
16-
#include <sof/objpool.h>
1715
#include <sof/audio/module_adapter/module/generic.h>
1816
#include <sof/audio/data_blob.h>
1917
#include <sof/lib/fast-get.h>
@@ -83,10 +81,10 @@ int module_load_config(struct comp_dev *dev, const void *cfg, size_t size)
8381
void mod_resource_init(struct processing_module *mod)
8482
{
8583
struct module_data *md = &mod->priv;
86-
8784
/* Init memory list */
88-
list_init(&md->resources.objpool.list);
89-
md->resources.objpool.heap = md->resources.heap;
85+
list_init(&md->resources.res_list);
86+
list_init(&md->resources.free_cont_list);
87+
list_init(&md->resources.cont_chunk_list);
9088
md->resources.heap_usage = 0;
9189
md->resources.heap_high_water_mark = 0;
9290
}
@@ -143,14 +141,43 @@ int module_init(struct processing_module *mod)
143141
return 0;
144142
}
145143

144+
struct container_chunk {
145+
struct list_item chunk_list;
146+
struct module_resource containers[CONFIG_MODULE_MEMORY_API_CONTAINER_CHUNK_SIZE];
147+
};
148+
146149
static struct module_resource *container_get(struct processing_module *mod)
147150
{
148-
return objpool_alloc(&mod->priv.resources.objpool, sizeof(struct module_resource), 0);
151+
struct module_resources *res = &mod->priv.resources;
152+
struct k_heap *mod_heap = res->heap;
153+
struct module_resource *container;
154+
155+
if (list_is_empty(&res->free_cont_list)) {
156+
struct container_chunk *chunk = sof_heap_alloc(mod_heap, 0, sizeof(*chunk), 0);
157+
int i;
158+
159+
if (!chunk) {
160+
comp_err(mod->dev, "allocating more containers failed");
161+
return NULL;
162+
}
163+
164+
memset(chunk, 0, sizeof(*chunk));
165+
166+
list_item_append(&chunk->chunk_list, &res->cont_chunk_list);
167+
for (i = 0; i < ARRAY_SIZE(chunk->containers); i++)
168+
list_item_append(&chunk->containers[i].list, &res->free_cont_list);
169+
}
170+
171+
container = list_first_item(&res->free_cont_list, struct module_resource, list);
172+
list_item_del(&container->list);
173+
return container;
149174
}
150175

151176
static void container_put(struct processing_module *mod, struct module_resource *container)
152177
{
153-
objpool_free(&mod->priv.resources.objpool, container);
178+
struct module_resources *res = &mod->priv.resources;
179+
180+
list_item_append(&container->list, &res->free_cont_list);
154181
}
155182

156183
#if CONFIG_USERSPACE
@@ -208,6 +235,7 @@ void *mod_balloc_align(struct processing_module *mod, size_t size, size_t alignm
208235
container->ptr = ptr;
209236
container->size = size;
210237
container->type = MOD_RES_HEAP;
238+
list_item_prepend(&container->list, &res->res_list);
211239

212240
res->heap_usage += size;
213241
if (res->heap_usage > res->heap_high_water_mark)
@@ -258,6 +286,7 @@ void *z_impl_mod_alloc_ext(struct processing_module *mod, uint32_t flags, size_t
258286
container->ptr = ptr;
259287
container->size = size;
260288
container->type = MOD_RES_HEAP;
289+
list_item_prepend(&container->list, &res->res_list);
261290

262291
res->heap_usage += size;
263292
if (res->heap_usage > res->heap_high_water_mark)
@@ -277,7 +306,7 @@ EXPORT_SYMBOL(z_impl_mod_alloc_ext);
277306
#if CONFIG_COMP_BLOB
278307
struct comp_data_blob_handler *mod_data_blob_handler_new(struct processing_module *mod)
279308
{
280-
struct module_resources * __maybe_unused res = &mod->priv.resources;
309+
struct module_resources *res = &mod->priv.resources;
281310
struct comp_data_blob_handler *bhp;
282311
struct module_resource *container;
283312

@@ -296,6 +325,7 @@ struct comp_data_blob_handler *mod_data_blob_handler_new(struct processing_modul
296325
container->bhp = bhp;
297326
container->size = 0;
298327
container->type = MOD_RES_BLOB_HANDLER;
328+
list_item_prepend(&container->list, &res->res_list);
299329

300330
return bhp;
301331
}
@@ -332,6 +362,7 @@ const void *z_impl_mod_fast_get(struct processing_module *mod, const void * cons
332362
container->sram_ptr = ptr;
333363
container->size = 0;
334364
container->type = MOD_RES_FAST_GET;
365+
list_item_prepend(&container->list, &res->res_list);
335366

336367
return ptr;
337368
}
@@ -363,29 +394,6 @@ static int free_contents(struct processing_module *mod, struct module_resource *
363394
return -EINVAL;
364395
}
365396

366-
struct mod_res_cb_arg {
367-
struct processing_module *mod;
368-
const void *ptr;
369-
};
370-
371-
static bool mod_res_free(void *data, void *arg)
372-
{
373-
struct mod_res_cb_arg *cb_arg = arg;
374-
struct module_resource *container = data;
375-
376-
if (cb_arg->ptr && container->ptr != cb_arg->ptr)
377-
return false;
378-
379-
int ret = free_contents(cb_arg->mod, container);
380-
381-
if (ret < 0)
382-
comp_err(cb_arg->mod->dev, "Cannot free allocation %p", cb_arg->ptr);
383-
384-
container_put(cb_arg->mod, container);
385-
386-
return true;
387-
}
388-
389397
/**
390398
* Frees the memory block removes it from module's book keeping.
391399
* @param mod Pointer to module this memory block was allocated for.
@@ -394,19 +402,28 @@ static bool mod_res_free(void *data, void *arg)
394402
int z_impl_mod_free(struct processing_module *mod, const void *ptr)
395403
{
396404
struct module_resources *res = &mod->priv.resources;
405+
struct module_resource *container;
406+
struct list_item *res_list;
397407

398408
MEM_API_CHECK_THREAD(res);
399409
if (!ptr)
400410
return 0;
401411

402-
/* Find which container holds this memory */
403-
struct mod_res_cb_arg cb_arg = {mod, ptr};
404-
int ret = objpool_iterate(&res->objpool, mod_res_free, &cb_arg);
412+
/* Find which container keeps this memory */
413+
list_for_item(res_list, &res->res_list) {
414+
container = container_of(res_list, struct module_resource, list);
415+
if (container->ptr == ptr) {
416+
int ret = free_contents(mod, container);
417+
418+
list_item_del(&container->list);
419+
container_put(mod, container);
420+
return ret;
421+
}
422+
}
405423

406-
if (ret < 0)
407-
comp_err(mod->dev, "error: could not find memory pointed by %p", ptr);
424+
comp_err(mod->dev, "error: could not find memory pointed by %p", ptr);
408425

409-
return ret;
426+
return -EINVAL;
410427
}
411428
EXPORT_SYMBOL(z_impl_mod_free);
412429

@@ -667,14 +684,32 @@ int module_reset(struct processing_module *mod)
667684
void mod_free_all(struct processing_module *mod)
668685
{
669686
struct module_resources *res = &mod->priv.resources;
687+
struct k_heap *mod_heap = res->heap;
688+
struct list_item *list;
689+
struct list_item *_list;
670690

671691
MEM_API_CHECK_THREAD(res);
672-
673692
/* Free all contents found in used containers */
674-
struct mod_res_cb_arg cb_arg = {mod, NULL};
693+
list_for_item(list, &res->res_list) {
694+
struct module_resource *container =
695+
container_of(list, struct module_resource, list);
696+
697+
free_contents(mod, container);
698+
}
675699

676-
objpool_iterate(&res->objpool, mod_res_free, &cb_arg);
677-
objpool_prune(&res->objpool);
700+
/*
701+
* We do not need to remove the containers from res_list in
702+
* the loop above or go through free_cont_list as all the
703+
* containers are anyway freed in the loop below, and the list
704+
* heads are reinitialized when mod_resource_init() is called.
705+
*/
706+
list_for_item_safe(list, _list, &res->cont_chunk_list) {
707+
struct container_chunk *chunk =
708+
container_of(list, struct container_chunk, chunk_list);
709+
710+
list_item_del(&chunk->chunk_list);
711+
sof_heap_free(mod_heap, chunk);
712+
}
678713

679714
/* Make sure resource lists and accounting are reset */
680715
mod_resource_init(mod);

src/include/sof/audio/module_adapter/module/generic.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@
1313
#ifndef __SOF_AUDIO_MODULE_GENERIC__
1414
#define __SOF_AUDIO_MODULE_GENERIC__
1515

16-
#include <sof/objpool.h>
17-
#include <sof/ut.h>
1816
#include <sof/audio/component.h>
17+
#include <sof/ut.h>
1918
#include <sof/audio/sink_api.h>
2019
#include <sof/audio/source_api.h>
2120
#include "module_interface.h"
@@ -129,7 +128,9 @@ struct module_param {
129128
* when the module unloads.
130129
*/
131130
struct module_resources {
132-
struct objpool_head objpool;
131+
struct list_item res_list; /**< Allocad resource containers */
132+
struct list_item free_cont_list; /**< Unused memory containers */
133+
struct list_item cont_chunk_list; /**< Memory container chunks */
133134
size_t heap_usage;
134135
size_t heap_high_water_mark;
135136
struct k_heap *heap;

src/platform/library/lib/alloc.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,3 @@ void heap_trace_all(int force)
7070
{
7171
heap_trace(NULL, 0);
7272
}
73-
74-
struct k_heap *sof_sys_heap_get(void)
75-
{
76-
return NULL;
77-
}

test/cmocka/src/audio/eq_fir/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ add_library(audio_for_eq_fir STATIC
3737
${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c
3838
${PROJECT_SOURCE_DIR}/src/ipc/ipc-common.c
3939
${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c
40-
${PROJECT_SOURCE_DIR}/src/lib/objpool.c
4140
${PROJECT_SOURCE_DIR}/test/cmocka/src/notifier_mocks.c
4241
${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-graph.c
4342
${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-params.c

test/cmocka/src/audio/eq_iir/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ add_library(audio_for_eq_iir STATIC
4040
${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c
4141
${PROJECT_SOURCE_DIR}/src/ipc/ipc-common.c
4242
${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c
43-
${PROJECT_SOURCE_DIR}/src/lib/objpool.c
4443
${PROJECT_SOURCE_DIR}/test/cmocka/src/notifier_mocks.c
4544
${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-graph.c
4645
${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-params.c

test/cmocka/src/audio/mixer/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ cmocka_test(mixer
1010
${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c
1111
${PROJECT_SOURCE_DIR}/src/ipc/ipc-common.c
1212
${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c
13-
${PROJECT_SOURCE_DIR}/src/lib/objpool.c
1413
${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module_adapter.c
1514
${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module_adapter_ipc3.c
1615
${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module/generic.c

test/cmocka/src/audio/mux/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ add_library(
2525
${PROJECT_SOURCE_DIR}/src/math/numbers.c
2626
${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c
2727
${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c
28-
${PROJECT_SOURCE_DIR}/src/lib/objpool.c
2928
${PROJECT_SOURCE_DIR}/test/cmocka/src/notifier_mocks.c
3029
${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module_adapter.c
3130
${PROJECT_SOURCE_DIR}/src/audio/module_adapter/module_adapter_ipc3.c

test/cmocka/src/audio/volume/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ add_library(audio_for_volume STATIC
3434
${PROJECT_SOURCE_DIR}/src/ipc/ipc3/helper.c
3535
${PROJECT_SOURCE_DIR}/src/ipc/ipc-common.c
3636
${PROJECT_SOURCE_DIR}/src/ipc/ipc-helper.c
37-
${PROJECT_SOURCE_DIR}/src/lib/objpool.c
3837
${PROJECT_SOURCE_DIR}/test/cmocka/src/notifier_mocks.c
3938
${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-graph.c
4039
${PROJECT_SOURCE_DIR}/src/audio/pipeline/pipeline-params.c

test/cmocka/src/common_mocks.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -124,11 +124,6 @@ int WEAK mod_free(struct processing_module *mod, const void *ptr)
124124
return 0;
125125
}
126126

127-
struct k_heap * WEAK sof_sys_heap_get(void)
128-
{
129-
return NULL;
130-
}
131-
132127
void WEAK *sof_heap_alloc(struct k_heap *heap, uint32_t flags, size_t bytes,
133128
size_t alignment)
134129
{

0 commit comments

Comments
 (0)