Skip to content

Commit 00a1c82

Browse files
committed
audio: data-blob: enable module-bound allocation
DP modules cannot access the common userspace heap, to fix data blob allocations for them those allocations have to use sof_ctx_alloc() and sof_ctx_free() to eventually allocate memory on module accessible vregion. Note, that we cannot use mod_alloc() and mod_free() because data-blob allocations are already accounted as module resources, so doing so would lead to double accounting and eventual double freeing. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent ba3abba commit 00a1c82

2 files changed

Lines changed: 42 additions & 29 deletions

File tree

‎src/audio/data_blob.c‎

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ struct comp_data_blob_handler {
2929
uint32_t single_blob:1; /**< Allocate only one blob. Module can not
3030
* be active while reconfguring.
3131
*/
32-
void *(*alloc)(size_t size); /**< alternate allocator, maybe null */
33-
void (*free)(void *buf); /**< alternate free(), maybe null */
32+
void *(*alloc)(struct comp_data_blob_handler *, size_t);/**< allocator, maybe null */
33+
void (*free)(struct comp_data_blob_handler *, void *); /**< deallocator, maybe null */
3434

3535
/** validator for new data, maybe null */
3636
int (*validator)(struct comp_dev *dev, void *new_data, uint32_t new_data_size);
@@ -43,8 +43,8 @@ static void comp_free_data_blob(struct comp_data_blob_handler *blob_handler)
4343
if (!blob_handler->data)
4444
return;
4545

46-
blob_handler->free(blob_handler->data);
47-
blob_handler->free(blob_handler->data_new);
46+
blob_handler->free(blob_handler, blob_handler->data);
47+
blob_handler->free(blob_handler, blob_handler->data_new);
4848
blob_handler->data = NULL;
4949
blob_handler->data_new = NULL;
5050
blob_handler->data_size = 0;
@@ -75,7 +75,7 @@ void *comp_get_data_blob(struct comp_data_blob_handler *blob_handler,
7575
comp_dbg(blob_handler->dev, "new data available");
7676

7777
/* Free "old" data blob and set data to data_new pointer */
78-
blob_handler->free(blob_handler->data);
78+
blob_handler->free(blob_handler, blob_handler->data);
7979
blob_handler->data = blob_handler->data_new;
8080
blob_handler->data_size = blob_handler->new_data_size;
8181

@@ -143,7 +143,7 @@ int comp_init_data_blob(struct comp_data_blob_handler *blob_handler,
143143
return 0;
144144

145145
/* Data blob allocation */
146-
blob_handler->data = blob_handler->alloc(size);
146+
blob_handler->data = blob_handler->alloc(blob_handler, size);
147147
if (!blob_handler->data) {
148148
comp_err(blob_handler->dev, "model->data allocation failed");
149149
return -ENOMEM;
@@ -232,7 +232,7 @@ int comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
232232

233233
if (blob_handler->single_blob) {
234234
if (data_offset_size != blob_handler->data_size) {
235-
blob_handler->free(blob_handler->data);
235+
blob_handler->free(blob_handler, blob_handler->data);
236236
blob_handler->data = NULL;
237237
} else {
238238
blob_handler->data_new = blob_handler->data;
@@ -241,7 +241,7 @@ int comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
241241
}
242242

243243
if (!blob_handler->data_new) {
244-
blob_handler->data_new = blob_handler->alloc(data_offset_size);
244+
blob_handler->data_new = blob_handler->alloc(blob_handler, data_offset_size);
245245
if (!blob_handler->data_new) {
246246
comp_err(blob_handler->dev, "blob_handler->data_new allocation failed.");
247247
return -ENOMEM;
@@ -277,7 +277,7 @@ int comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
277277
blob_handler->new_data_size);
278278
if (ret < 0) {
279279
comp_err(blob_handler->dev, "new data is invalid! discarding it...");
280-
blob_handler->free(blob_handler->data_new);
280+
blob_handler->free(blob_handler, blob_handler->data_new);
281281
blob_handler->data_new = NULL;
282282
return ret;
283283
}
@@ -288,7 +288,7 @@ int comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
288288
* the new configuration presence is checked in copy().
289289
*/
290290
if (blob_handler->dev->state == COMP_STATE_READY) {
291-
blob_handler->free(blob_handler->data);
291+
blob_handler->free(blob_handler, blob_handler->data);
292292
blob_handler->data = NULL;
293293
}
294294

@@ -347,7 +347,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
347347

348348
if (blob_handler->single_blob) {
349349
if (data_offset != blob_handler->data_size) {
350-
blob_handler->free(blob_handler->data);
350+
blob_handler->free(blob_handler, blob_handler->data);
351351
blob_handler->data = NULL;
352352
} else {
353353
blob_handler->data_new = blob_handler->data;
@@ -357,7 +357,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
357357

358358
if (!blob_handler->data_new) {
359359
blob_handler->data_new =
360-
blob_handler->alloc(data_offset);
360+
blob_handler->alloc(blob_handler, data_offset);
361361

362362
if (!blob_handler->data_new) {
363363
comp_err(blob_handler->dev,
@@ -376,7 +376,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
376376
blob_handler->new_data_size, data, valid_data_size);
377377
if (ret) {
378378
comp_err(blob_handler->dev, "failed to copy fragment");
379-
blob_handler->free(blob_handler->data_new);
379+
blob_handler->free(blob_handler, blob_handler->data_new);
380380
blob_handler->data_new = NULL;
381381
blob_handler->new_data_size = 0;
382382
blob_handler->data_pos = 0;
@@ -411,7 +411,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
411411
data, valid_data_size);
412412
if (ret) {
413413
comp_err(blob_handler->dev, "failed to copy fragment");
414-
blob_handler->free(blob_handler->data_new);
414+
blob_handler->free(blob_handler, blob_handler->data_new);
415415
blob_handler->data_new = NULL;
416416
blob_handler->new_data_size = 0;
417417
blob_handler->data_pos = 0;
@@ -431,7 +431,7 @@ int ipc4_comp_data_blob_set(struct comp_data_blob_handler *blob_handler,
431431
* the new configuration presence is checked in copy().
432432
*/
433433
if (blob_handler->dev->state == COMP_STATE_READY) {
434-
blob_handler->free(blob_handler->data);
434+
blob_handler->free(blob_handler, blob_handler->data);
435435
blob_handler->data = NULL;
436436
}
437437

@@ -510,7 +510,7 @@ int comp_data_blob_set_cmd(struct comp_data_blob_handler *blob_handler,
510510

511511
if (blob_handler->single_blob) {
512512
if (cdata->data->size != blob_handler->data_size) {
513-
blob_handler->free(blob_handler->data);
513+
blob_handler->free(blob_handler, blob_handler->data);
514514
blob_handler->data = NULL;
515515
} else {
516516
blob_handler->data_new = blob_handler->data;
@@ -520,7 +520,7 @@ int comp_data_blob_set_cmd(struct comp_data_blob_handler *blob_handler,
520520

521521
if (!blob_handler->data_new) {
522522
blob_handler->data_new =
523-
blob_handler->alloc(cdata->data->size);
523+
blob_handler->alloc(blob_handler, cdata->data->size);
524524
if (!blob_handler->data_new) {
525525
comp_err(blob_handler->dev, "blob_handler->data_new allocation failed.");
526526
return -ENOMEM;
@@ -556,7 +556,7 @@ int comp_data_blob_set_cmd(struct comp_data_blob_handler *blob_handler,
556556
blob_handler->new_data_size);
557557
if (ret < 0) {
558558
comp_err(blob_handler->dev, "new data blob invalid, discarding");
559-
blob_handler->free(blob_handler->data_new);
559+
blob_handler->free(blob_handler, blob_handler->data_new);
560560
blob_handler->data_new = NULL;
561561
return ret;
562562
}
@@ -567,7 +567,7 @@ int comp_data_blob_set_cmd(struct comp_data_blob_handler *blob_handler,
567567
* the new configuration presence is checked in copy().
568568
*/
569569
if (blob_handler->dev->state == COMP_STATE_READY) {
570-
blob_handler->free(blob_handler->data);
570+
blob_handler->free(blob_handler, blob_handler->data);
571571
blob_handler->data = NULL;
572572
}
573573

@@ -659,28 +659,38 @@ int comp_data_blob_get_cmd(struct comp_data_blob_handler *blob_handler,
659659
}
660660
EXPORT_SYMBOL(comp_data_blob_get_cmd);
661661

662-
static void *default_alloc(size_t size)
662+
static void *default_alloc(struct comp_data_blob_handler *handler, size_t size)
663663
{
664+
if (handler->dev->mod)
665+
return sof_ctx_alloc(handler->dev->mod->priv.resources.alloc,
666+
SOF_MEM_FLAG_USER | SOF_MEM_FLAG_LARGE_BUFFER, size, 0);
664667
return sof_heap_alloc(sof_sys_user_heap_get(),
665668
SOF_MEM_FLAG_USER | SOF_MEM_FLAG_LARGE_BUFFER, size, 0);
666669
}
667670

668-
static void default_free(void *buf)
671+
static void default_free(struct comp_data_blob_handler *handler, void *buf)
669672
{
670-
sof_heap_free(sof_sys_user_heap_get(), buf);
673+
if (handler->dev->mod)
674+
sof_ctx_free(handler->dev->mod->priv.resources.alloc, buf);
675+
else
676+
sof_heap_free(sof_sys_user_heap_get(), buf);
671677
}
672678

673679
struct comp_data_blob_handler *
674680
comp_data_blob_handler_new_ext(struct comp_dev *dev, bool single_blob,
675-
void *(*alloc)(size_t size),
676-
void (*free)(void *buf))
681+
void *(*alloc)(struct comp_data_blob_handler *, size_t),
682+
void (*free)(struct comp_data_blob_handler *, void *))
677683
{
678684
struct comp_data_blob_handler *handler;
679685

680686
comp_dbg(dev, "entry");
681687

682-
handler = sof_heap_alloc(sof_sys_user_heap_get(), SOF_MEM_FLAG_USER,
683-
sizeof(struct comp_data_blob_handler), 0);
688+
if (dev->mod)
689+
handler = sof_ctx_alloc(dev->mod->priv.resources.alloc, 0,
690+
sizeof(struct comp_data_blob_handler), 0);
691+
else
692+
handler = sof_heap_alloc(sof_sys_user_heap_get(), SOF_MEM_FLAG_USER,
693+
sizeof(struct comp_data_blob_handler), 0);
684694

685695
if (handler) {
686696
memset(handler, 0, sizeof(*handler));
@@ -701,6 +711,9 @@ void comp_data_blob_handler_free(struct comp_data_blob_handler *blob_handler)
701711

702712
comp_free_data_blob(blob_handler);
703713

704-
sof_heap_free(sof_sys_user_heap_get(), blob_handler);
714+
if (blob_handler->dev->mod)
715+
sof_ctx_free(blob_handler->dev->mod->priv.resources.alloc, blob_handler);
716+
else
717+
sof_heap_free(sof_sys_user_heap_get(), blob_handler);
705718
}
706719
EXPORT_SYMBOL(comp_data_blob_handler_free);

‎src/include/sof/audio/data_blob.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ int comp_data_blob_get_cmd(struct comp_data_blob_handler *blob_handler,
116116
*/
117117
struct comp_data_blob_handler *
118118
comp_data_blob_handler_new_ext(struct comp_dev *dev, bool single_blob,
119-
void *(*alloc)(size_t size),
120-
void (*free)(void *buf));
119+
void *(*alloc)(struct comp_data_blob_handler *, size_t),
120+
void (*free)(struct comp_data_blob_handler *, void *));
121121

122122
/**
123123
* Returns new data blob handler.

0 commit comments

Comments
 (0)