Skip to content

Commit d31849e

Browse files
committed
buffer: use the buffer heap for also the payload allocations
Continue the work in commit 9567234 ("buffer: allocate on specific heap") and allocate also the payload buffer with the passed memory allocator. Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
1 parent 000fb33 commit d31849e

1 file changed

Lines changed: 89 additions & 28 deletions

File tree

src/audio/buffers/comp_buffer.c

Lines changed: 89 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,16 @@ static void comp_buffer_free(struct sof_audio_buffer *audio_buffer)
156156

157157
struct mod_alloc_ctx *alloc = buffer->audio_buffer.alloc;
158158

159+
#ifdef CONFIG_SOF_USERSPACE_LL
160+
assert(alloc);
161+
if (alloc->vreg)
162+
vregion_free(alloc->vreg, buffer->stream.addr);
163+
else
164+
sof_heap_free(alloc->heap, buffer->stream.addr);
165+
#else
159166
rfree(buffer->stream.addr);
167+
#endif
168+
160169
if (alloc && alloc->vreg) {
161170
vregion_free(alloc->vreg, buffer);
162171
if (!vregion_put(alloc->vreg))
@@ -254,7 +263,15 @@ struct comp_buffer *buffer_alloc(struct mod_alloc_ctx *alloc, size_t size, uint3
254263
return NULL;
255264
}
256265

266+
#ifdef CONFIG_SOF_USERSPACE_LL
267+
assert(alloc);
268+
if (alloc->vreg)
269+
stream_addr = vregion_alloc_align(alloc->vreg, VREGION_MEM_TYPE_INTERIM, size, align);
270+
else
271+
stream_addr = sof_heap_alloc(alloc->heap, flags, size, align);
272+
#else
257273
stream_addr = rballoc_align(flags, size, align);
274+
#endif
258275
if (!stream_addr) {
259276
tr_err(&buffer_tr, "could not alloc size = %zu bytes of flags = 0x%x",
260277
size, flags);
@@ -264,7 +281,15 @@ struct comp_buffer *buffer_alloc(struct mod_alloc_ctx *alloc, size_t size, uint3
264281
buffer = buffer_alloc_struct(alloc, stream_addr, size, flags, is_shared);
265282
if (!buffer) {
266283
tr_err(&buffer_tr, "could not alloc buffer structure");
284+
#ifdef CONFIG_SOF_USERSPACE_LL
285+
assert(alloc);
286+
if (alloc->vreg)
287+
vregion_free(alloc->vreg, stream_addr);
288+
else
289+
sof_heap_free(alloc->heap, stream_addr);
290+
#else
267291
rfree(stream_addr);
292+
#endif
268293
}
269294

270295
return buffer;
@@ -292,7 +317,15 @@ struct comp_buffer *buffer_alloc_range(struct mod_alloc_ctx *alloc, size_t prefe
292317
preferred_size += minimum_size - preferred_size % minimum_size;
293318

294319
for (size = preferred_size; size >= minimum_size; size -= minimum_size) {
320+
#ifdef CONFIG_SOF_USERSPACE_LL
321+
assert(alloc);
322+
if (alloc->vreg)
323+
stream_addr = vregion_alloc_align(alloc->vreg, VREGION_MEM_TYPE_INTERIM, size, align);
324+
else
325+
stream_addr = sof_heap_alloc(alloc->heap, flags, size, align);
326+
#else
295327
stream_addr = rballoc_align(flags, size, align);
328+
#endif
296329
if (stream_addr)
297330
break;
298331
}
@@ -308,7 +341,15 @@ struct comp_buffer *buffer_alloc_range(struct mod_alloc_ctx *alloc, size_t prefe
308341
buffer = buffer_alloc_struct(alloc, stream_addr, size, flags, is_shared);
309342
if (!buffer) {
310343
tr_err(&buffer_tr, "could not alloc buffer structure");
344+
#ifdef CONFIG_SOF_USERSPACE_LL
345+
assert(alloc);
346+
if (alloc->vreg)
347+
vregion_free(alloc->vreg, stream_addr);
348+
else
349+
sof_heap_free(alloc->heap, stream_addr);
350+
#else
311351
rfree(stream_addr);
352+
#endif
312353
}
313354

314355
return buffer;
@@ -329,6 +370,7 @@ void buffer_zero(struct comp_buffer *buffer)
329370
int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignment)
330371
{
331372
void *new_ptr = NULL;
373+
struct mod_alloc_ctx *alloc = buffer->audio_buffer.alloc;
332374

333375
CORE_CHECK_STRUCT(&buffer->audio_buffer);
334376

@@ -341,14 +383,16 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
341383
if (size == audio_stream_get_size(&buffer->stream))
342384
return 0;
343385

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));
386+
#ifdef CONFIG_SOF_USERSPACE_LL
387+
assert(alloc);
388+
if (alloc->vreg)
389+
new_ptr = vregion_alloc_align(alloc->vreg, VREGION_MEM_TYPE_INTERIM, size, alignment);
348390
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);
391+
new_ptr = sof_heap_alloc(alloc->heap, buffer->flags, size, alignment);
392+
#else
393+
new_ptr = rballoc_align(buffer->flags, size, alignment);
394+
#endif
395+
352396
/* we couldn't allocate bigger chunk */
353397
if (!new_ptr && size > audio_stream_get_size(&buffer->stream)) {
354398
buf_err(buffer, "resize can't alloc %u bytes of flags 0x%x",
@@ -357,8 +401,18 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
357401
}
358402

359403
/* use bigger chunk, else just use the old chunk but set smaller */
360-
if (new_ptr)
361-
buffer->stream.addr = new_ptr;
404+
if (new_ptr) {
405+
#ifdef CONFIG_SOF_USERSPACE_LL
406+
assert(alloc);
407+
if (alloc->vreg)
408+
vregion_free(alloc->vreg, audio_stream_get_addr(&buffer->stream));
409+
else
410+
sof_heap_free(alloc->heap, audio_stream_get_addr(&buffer->stream));
411+
#else
412+
rfree(audio_stream_get_addr(&buffer->stream));
413+
#endif
414+
audio_stream_set_addr(&buffer->stream, new_ptr);
415+
}
362416

363417
buffer_init_stream(buffer, size);
364418

@@ -368,10 +422,10 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
368422
int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, size_t minimum_size,
369423
uint32_t alignment)
370424
{
371-
void *ptr = audio_stream_get_addr(&buffer->stream);
372425
const size_t actual_size = audio_stream_get_size(&buffer->stream);
373426
void *new_ptr = NULL;
374427
size_t new_size;
428+
struct mod_alloc_ctx *alloc = buffer->audio_buffer.alloc;
375429

376430
CORE_CHECK_STRUCT(&buffer->audio_buffer);
377431

@@ -389,22 +443,19 @@ int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, siz
389443
if (preferred_size == actual_size)
390444
return 0;
391445

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-
}
446+
for (new_size = preferred_size; new_size >= minimum_size;
447+
new_size -= minimum_size) {
448+
#ifdef CONFIG_SOF_USERSPACE_LL
449+
assert(alloc);
450+
if (alloc->vreg)
451+
new_ptr = vregion_alloc_align(alloc->vreg, VREGION_MEM_TYPE_INTERIM, new_size, alignment);
452+
else
453+
new_ptr = sof_heap_alloc(alloc->heap, buffer->flags, new_size, alignment);
454+
#else
455+
new_ptr = rballoc_align(buffer->flags, new_size, alignment);
456+
#endif
457+
if (new_ptr)
458+
break;
408459
}
409460

410461
/* we couldn't allocate bigger chunk */
@@ -415,8 +466,18 @@ int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, siz
415466
}
416467

417468
/* use bigger chunk, else just use the old chunk but set smaller */
418-
if (new_ptr)
419-
buffer->stream.addr = new_ptr;
469+
if (new_ptr) {
470+
#ifdef CONFIG_SOF_USERSPACE_LL
471+
assert(alloc);
472+
if (alloc->vreg)
473+
vregion_free(alloc->vreg, audio_stream_get_addr(&buffer->stream));
474+
else
475+
sof_heap_free(alloc->heap, audio_stream_get_addr(&buffer->stream));
476+
#else
477+
rfree(audio_stream_get_addr(&buffer->stream));
478+
#endif
479+
audio_stream_set_addr(&buffer->stream, new_ptr);
480+
}
420481

421482
buffer_init_stream(buffer, new_size);
422483

0 commit comments

Comments
 (0)