Skip to content

Commit 424ec1e

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 424ec1e

1 file changed

Lines changed: 93 additions & 28 deletions

File tree

src/audio/buffers/comp_buffer.c

Lines changed: 93 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,9 @@ 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+
#ifdef CONFIG_SOF_USERSPACE_LL
374+
struct mod_alloc_ctx *alloc = buffer->audio_buffer.alloc;
375+
#endif
332376

333377
CORE_CHECK_STRUCT(&buffer->audio_buffer);
334378

@@ -341,14 +385,16 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
341385
if (size == audio_stream_get_size(&buffer->stream))
342386
return 0;
343387

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));
388+
#ifdef CONFIG_SOF_USERSPACE_LL
389+
assert(alloc);
390+
if (alloc->vreg)
391+
new_ptr = vregion_alloc_align(alloc->vreg, VREGION_MEM_TYPE_INTERIM, size, alignment);
348392
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);
393+
new_ptr = sof_heap_alloc(alloc->heap, buffer->flags, size, alignment);
394+
#else
395+
new_ptr = rballoc_align(buffer->flags, size, alignment);
396+
#endif
397+
352398
/* we couldn't allocate bigger chunk */
353399
if (!new_ptr && size > audio_stream_get_size(&buffer->stream)) {
354400
buf_err(buffer, "resize can't alloc %u bytes of flags 0x%x",
@@ -357,8 +403,18 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
357403
}
358404

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

363419
buffer_init_stream(buffer, size);
364420

@@ -368,10 +424,12 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
368424
int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, size_t minimum_size,
369425
uint32_t alignment)
370426
{
371-
void *ptr = audio_stream_get_addr(&buffer->stream);
372427
const size_t actual_size = audio_stream_get_size(&buffer->stream);
373428
void *new_ptr = NULL;
374429
size_t new_size;
430+
#ifdef CONFIG_SOF_USERSPACE_LL
431+
struct mod_alloc_ctx *alloc = buffer->audio_buffer.alloc;
432+
#endif
375433

376434
CORE_CHECK_STRUCT(&buffer->audio_buffer);
377435

@@ -389,22 +447,19 @@ int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, siz
389447
if (preferred_size == actual_size)
390448
return 0;
391449

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

410465
/* we couldn't allocate bigger chunk */
@@ -415,8 +470,18 @@ int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, siz
415470
}
416471

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

421486
buffer_init_stream(buffer, new_size);
422487

0 commit comments

Comments
 (0)