Skip to content

Commit 5cca57d

Browse files
audio: comp_buffer: make allocations from the passed memory context
To ensure the buffer is not left outside the module's memory domain, the payload allocation must be made from the supplied context instead of always calling rballoc_align(). This fixes a crash during bind processing when running a test with a userspace DP module on a secondary core. Signed-off-by: Serhiy Katsyuba <serhiy.katsyuba@intel.com>
1 parent b5f3faf commit 5cca57d

1 file changed

Lines changed: 46 additions & 58 deletions

File tree

src/audio/buffers/comp_buffer.c

Lines changed: 46 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,12 @@ 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-
sof_ctx_free(alloc, buffer->stream.addr);
162-
#else
163-
rfree(buffer->stream.addr);
164-
#endif
159+
assert(!IS_ENABLED(CONFIG_SOF_USERSPACE_LL) || alloc);
160+
161+
if (alloc)
162+
sof_ctx_free(alloc, buffer->stream.addr);
163+
else
164+
rfree(buffer->stream.addr);
165165

166166
if (alloc && alloc->vreg) {
167167
vregion_free(alloc->vreg, buffer);
@@ -255,12 +255,12 @@ struct comp_buffer *buffer_alloc(struct mod_alloc_ctx *alloc, size_t size, uint3
255255
return NULL;
256256
}
257257

258-
#ifdef CONFIG_SOF_USERSPACE_LL
259-
assert(alloc);
260-
stream_addr = sof_ctx_alloc(alloc, flags, size, align);
261-
#else
262-
stream_addr = rballoc_align(flags, size, align);
263-
#endif
258+
assert(!IS_ENABLED(CONFIG_SOF_USERSPACE_LL) || alloc);
259+
260+
if (alloc)
261+
stream_addr = sof_ctx_alloc(alloc, flags, size, align);
262+
else
263+
stream_addr = rballoc_align(flags, size, align);
264264
if (!stream_addr) {
265265
tr_err(&buffer_tr, "could not alloc size = %zu bytes of flags = 0x%x",
266266
size, flags);
@@ -270,12 +270,10 @@ struct comp_buffer *buffer_alloc(struct mod_alloc_ctx *alloc, size_t size, uint3
270270
buffer = buffer_alloc_struct(alloc, stream_addr, size, flags, is_shared);
271271
if (!buffer) {
272272
tr_err(&buffer_tr, "could not alloc buffer structure");
273-
#ifdef CONFIG_SOF_USERSPACE_LL
274-
assert(alloc);
275-
sof_ctx_free(alloc, stream_addr);
276-
#else
277-
rfree(stream_addr);
278-
#endif
273+
if (alloc)
274+
sof_ctx_free(alloc, stream_addr);
275+
else
276+
rfree(stream_addr);
279277
}
280278

281279
return buffer;
@@ -302,13 +300,13 @@ struct comp_buffer *buffer_alloc_range(struct mod_alloc_ctx *alloc, size_t prefe
302300
if (preferred_size % minimum_size)
303301
preferred_size += minimum_size - preferred_size % minimum_size;
304302

303+
assert(!IS_ENABLED(CONFIG_SOF_USERSPACE_LL) || alloc);
304+
305305
for (size = preferred_size; size >= minimum_size; size -= minimum_size) {
306-
#ifdef CONFIG_SOF_USERSPACE_LL
307-
assert(alloc);
308-
stream_addr = sof_ctx_alloc(alloc, flags, size, align);
309-
#else
310-
stream_addr = rballoc_align(flags, size, align);
311-
#endif
306+
if (alloc)
307+
stream_addr = sof_ctx_alloc(alloc, flags, size, align);
308+
else
309+
stream_addr = rballoc_align(flags, size, align);
312310
if (stream_addr)
313311
break;
314312
}
@@ -324,12 +322,10 @@ struct comp_buffer *buffer_alloc_range(struct mod_alloc_ctx *alloc, size_t prefe
324322
buffer = buffer_alloc_struct(alloc, stream_addr, size, flags, is_shared);
325323
if (!buffer) {
326324
tr_err(&buffer_tr, "could not alloc buffer structure");
327-
#ifdef CONFIG_SOF_USERSPACE_LL
328-
assert(alloc);
329-
sof_ctx_free(alloc, stream_addr);
330-
#else
331-
rfree(stream_addr);
332-
#endif
325+
if (alloc)
326+
sof_ctx_free(alloc, stream_addr);
327+
else
328+
rfree(stream_addr);
333329
}
334330

335331
return buffer;
@@ -350,9 +346,7 @@ void buffer_zero(struct comp_buffer *buffer)
350346
int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignment)
351347
{
352348
void *new_ptr = NULL;
353-
#ifdef CONFIG_SOF_USERSPACE_LL
354349
struct mod_alloc_ctx *alloc = buffer->audio_buffer.alloc;
355-
#endif
356350

357351
CORE_CHECK_STRUCT(&buffer->audio_buffer);
358352

@@ -365,12 +359,12 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
365359
if (size == audio_stream_get_size(&buffer->stream))
366360
return 0;
367361

368-
#ifdef CONFIG_SOF_USERSPACE_LL
369-
assert(alloc);
370-
new_ptr = sof_ctx_alloc(alloc, buffer->flags, size, alignment);
371-
#else
372-
new_ptr = rballoc_align(buffer->flags, size, alignment);
373-
#endif
362+
assert(!IS_ENABLED(CONFIG_SOF_USERSPACE_LL) || alloc);
363+
364+
if (alloc)
365+
new_ptr = sof_ctx_alloc(alloc, buffer->flags, size, alignment);
366+
else
367+
new_ptr = rballoc_align(buffer->flags, size, alignment);
374368

375369
/* we couldn't allocate bigger chunk */
376370
if (!new_ptr && size > audio_stream_get_size(&buffer->stream)) {
@@ -381,12 +375,10 @@ int buffer_set_size(struct comp_buffer *buffer, uint32_t size, uint32_t alignmen
381375

382376
/* use bigger chunk, else just use the old chunk but set smaller */
383377
if (new_ptr) {
384-
#ifdef CONFIG_SOF_USERSPACE_LL
385-
assert(alloc);
386-
sof_ctx_free(alloc, audio_stream_get_addr(&buffer->stream));
387-
#else
388-
rfree(audio_stream_get_addr(&buffer->stream));
389-
#endif
378+
if (alloc)
379+
sof_ctx_free(alloc, audio_stream_get_addr(&buffer->stream));
380+
else
381+
rfree(audio_stream_get_addr(&buffer->stream));
390382
audio_stream_set_addr(&buffer->stream, new_ptr);
391383
}
392384

@@ -401,9 +393,7 @@ int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, siz
401393
const size_t actual_size = audio_stream_get_size(&buffer->stream);
402394
void *new_ptr = NULL;
403395
size_t new_size;
404-
#ifdef CONFIG_SOF_USERSPACE_LL
405396
struct mod_alloc_ctx *alloc = buffer->audio_buffer.alloc;
406-
#endif
407397

408398
CORE_CHECK_STRUCT(&buffer->audio_buffer);
409399

@@ -421,14 +411,14 @@ int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, siz
421411
if (preferred_size == actual_size)
422412
return 0;
423413

414+
assert(!IS_ENABLED(CONFIG_SOF_USERSPACE_LL) || alloc);
415+
424416
for (new_size = preferred_size; new_size >= minimum_size;
425417
new_size -= minimum_size) {
426-
#ifdef CONFIG_SOF_USERSPACE_LL
427-
assert(alloc);
428-
new_ptr = sof_ctx_alloc(alloc, buffer->flags, new_size, alignment);
429-
#else
430-
new_ptr = rballoc_align(buffer->flags, new_size, alignment);
431-
#endif
418+
if (alloc)
419+
new_ptr = sof_ctx_alloc(alloc, buffer->flags, new_size, alignment);
420+
else
421+
new_ptr = rballoc_align(buffer->flags, new_size, alignment);
432422
if (new_ptr)
433423
break;
434424
}
@@ -442,12 +432,10 @@ int buffer_set_size_range(struct comp_buffer *buffer, size_t preferred_size, siz
442432

443433
/* use bigger chunk, else just use the old chunk but set smaller */
444434
if (new_ptr) {
445-
#ifdef CONFIG_SOF_USERSPACE_LL
446-
assert(alloc);
447-
sof_ctx_free(alloc, audio_stream_get_addr(&buffer->stream));
448-
#else
449-
rfree(audio_stream_get_addr(&buffer->stream));
450-
#endif
435+
if (alloc)
436+
sof_ctx_free(alloc, audio_stream_get_addr(&buffer->stream));
437+
else
438+
rfree(audio_stream_get_addr(&buffer->stream));
451439
audio_stream_set_addr(&buffer->stream, new_ptr);
452440
}
453441

0 commit comments

Comments
 (0)