Skip to content

Commit e70041d

Browse files
committed
buffer: extend ability to allocate on specific heap to all functions
Continue the work in commit 9567234 ("buffer: allocate on specific heap") and add ability to specify the heap to all buffer interface functions. Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
1 parent cfa5f02 commit e70041d

1 file changed

Lines changed: 26 additions & 37 deletions

File tree

src/audio/buffers/comp_buffer.c

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ static void comp_buffer_free(struct sof_audio_buffer *audio_buffer)
161161

162162
struct k_heap *heap = buffer->audio_buffer.heap;
163163

164-
rfree(buffer->stream.addr);
164+
sof_heap_free(heap, buffer->stream.addr);
165165
sof_heap_free(heap, buffer);
166166
if (heap) {
167167
struct dp_heap_user *mod_heap_user = container_of(heap, struct dp_heap_user, heap);
@@ -254,7 +254,7 @@ struct comp_buffer *buffer_alloc(struct k_heap *heap, size_t size, uint32_t flag
254254
return NULL;
255255
}
256256

257-
stream_addr = rballoc_align(flags, size, align);
257+
stream_addr = sof_heap_alloc(heap, flags, size, align);
258258
if (!stream_addr) {
259259
tr_err(&buffer_tr, "could not alloc size = %zu bytes of flags = 0x%x",
260260
size, flags);
@@ -264,7 +264,7 @@ struct comp_buffer *buffer_alloc(struct k_heap *heap, size_t size, uint32_t flag
264264
buffer = buffer_alloc_struct(heap, stream_addr, size, flags, is_shared);
265265
if (!buffer) {
266266
tr_err(&buffer_tr, "could not alloc buffer structure");
267-
rfree(stream_addr);
267+
sof_heap_free(heap, stream_addr);
268268
}
269269

270270
return buffer;
@@ -292,7 +292,7 @@ struct comp_buffer *buffer_alloc_range(struct k_heap *heap, size_t preferred_siz
292292
preferred_size += minimum_size - preferred_size % minimum_size;
293293

294294
for (size = preferred_size; size >= minimum_size; size -= minimum_size) {
295-
stream_addr = rballoc_align(flags, size, align);
295+
stream_addr = sof_heap_alloc(heap, flags, size, align);
296296
if (stream_addr)
297297
break;
298298
}
@@ -308,7 +308,7 @@ struct comp_buffer *buffer_alloc_range(struct k_heap *heap, size_t preferred_siz
308308
buffer = buffer_alloc_struct(heap, stream_addr, size, flags, is_shared);
309309
if (!buffer) {
310310
tr_err(&buffer_tr, "could not alloc buffer structure");
311-
rfree(stream_addr);
311+
sof_heap_free(heap, stream_addr);
312312
}
313313

314314
return buffer;
@@ -341,14 +341,8 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
341341
if (size == audio_stream_get_size(&buffer->stream))
342342
return 0;
343343

344-
if (!alignment)
345-
new_ptr = rbrealloc(audio_stream_get_addr(&buffer->stream),
346-
buffer->flags | SOF_MEM_FLAG_NO_COPY,
347-
size, audio_stream_get_size(&buffer->stream));
348-
else
349-
new_ptr = rbrealloc_align(audio_stream_get_addr(&buffer->stream),
350-
buffer->flags | SOF_MEM_FLAG_NO_COPY, size,
351-
audio_stream_get_size(&buffer->stream), alignment);
344+
new_ptr = sof_heap_alloc(buffer->audio_buffer.heap, buffer->flags, size, alignment);
345+
352346
/* we couldn't allocate bigger chunk */
353347
if (!new_ptr && size > audio_stream_get_size(&buffer->stream)) {
354348
buf_err(buffer, "resize can't alloc %u bytes of flags 0x%x",
@@ -357,8 +351,10 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
357351
}
358352

359353
/* use bigger chunk, else just use the old chunk but set smaller */
360-
if (new_ptr)
354+
if (new_ptr) {
355+
sof_heap_free(buffer->audio_buffer.heap, audio_stream_get_addr(&buffer->stream));
361356
buffer->stream.addr = new_ptr;
357+
}
362358

363359
buffer_init_stream(buffer, size);
364360

@@ -368,7 +364,6 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
368364
int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, size_t minimum_size,
369365
uint32_t alignment)
370366
{
371-
void *ptr = audio_stream_get_addr(&buffer->stream);
372367
const size_t actual_size = audio_stream_get_size(&buffer->stream);
373368
void *new_ptr = NULL;
374369
size_t new_size;
@@ -389,34 +384,28 @@ int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, siz
389384
if (preferred_size == actual_size)
390385
return 0;
391386

392-
if (!alignment) {
393-
for (new_size = preferred_size; new_size >= minimum_size;
394-
new_size -= minimum_size) {
395-
new_ptr = rbrealloc(ptr, buffer->flags | SOF_MEM_FLAG_NO_COPY,
396-
new_size, actual_size);
397-
if (new_ptr)
398-
break;
399-
}
400-
} else {
401-
for (new_size = preferred_size; new_size >= minimum_size;
402-
new_size -= minimum_size) {
403-
new_ptr = rbrealloc_align(ptr, buffer->flags | SOF_MEM_FLAG_NO_COPY,
404-
new_size, actual_size, alignment);
405-
if (new_ptr)
406-
break;
407-
}
387+
for (new_size = preferred_size; new_size >= minimum_size;
388+
new_size -= minimum_size) {
389+
new_ptr = sof_heap_alloc(buffer->audio_buffer.heap, buffer->flags, new_size, alignment);
390+
if (new_ptr)
391+
break;
408392
}
409393

410-
/* we couldn't allocate bigger chunk */
411-
if (!new_ptr && new_size > actual_size) {
412-
buf_err(buffer, "resize can't alloc %zu bytes of flags 0x%x", new_size,
413-
buffer->flags);
414-
return -ENOMEM;
394+
/* If no allocation succeeded, check if old buffer is large enough */
395+
if (!new_ptr) {
396+
if (minimum_size > actual_size) {
397+
buf_err(buffer, "resize can't alloc %zu bytes of flags 0x%x",
398+
minimum_size, buffer->flags);
399+
return -ENOMEM;
400+
}
401+
new_size = minimum_size;
415402
}
416403

417404
/* use bigger chunk, else just use the old chunk but set smaller */
418-
if (new_ptr)
405+
if (new_ptr) {
406+
sof_heap_free(buffer->audio_buffer.heap, audio_stream_get_addr(&buffer->stream));
419407
buffer->stream.addr = new_ptr;
408+
}
420409

421410
buffer_init_stream(buffer, new_size);
422411

0 commit comments

Comments
 (0)