From 9040da68a7c20236eaa5de1a8c7e28b1112ddfdf Mon Sep 17 00:00:00 2001 From: Kai Vehmanen Date: Mon, 12 Jun 2023 15:24:25 +0300 Subject: [PATCH] audio: buffer: do not mix cached and non-cached access in buffer_alloc No reason to mix cached and noncached operations when initializing the buffer in buffer_alloc(). We take a cached reference, so let's use that to initialize the object. Signed-off-by: Kai Vehmanen --- src/audio/buffer.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/audio/buffer.c b/src/audio/buffer.c index 11ec261b38ca..18d2c90473d6 100644 --- a/src/audio/buffer.c +++ b/src/audio/buffer.c @@ -31,6 +31,7 @@ struct comp_buffer *buffer_alloc(uint32_t size, uint32_t caps, uint32_t flags, u { struct comp_buffer *buffer; struct comp_buffer __sparse_cache *buffer_c; + void *stream_addr; tr_dbg(&buffer_tr, "buffer_alloc()"); @@ -51,23 +52,22 @@ struct comp_buffer *buffer_alloc(uint32_t size, uint32_t caps, uint32_t flags, u return NULL; } - buffer->stream.addr = rballoc_align(0, caps, size, align); - if (!buffer->stream.addr) { + stream_addr = rballoc_align(0, caps, size, align); + if (!stream_addr) { rfree(buffer); tr_err(&buffer_tr, "buffer_alloc(): could not alloc size = %u bytes of type = %u", size, caps); return NULL; } - buffer->stream.underrun_permitted = !!(flags & SOF_BUF_UNDERRUN_PERMITTED); - buffer->stream.overrun_permitted = !!(flags & SOF_BUF_OVERRUN_PERMITTED); - - list_init(&buffer->source_list); - list_init(&buffer->sink_list); - /* From here no more uncached access to the buffer object, except its list headers */ buffer_c = buffer_acquire(buffer); + buffer_c->stream.addr = stream_addr; buffer_init(buffer_c, size, caps); + + buffer_c->stream.underrun_permitted = !!(flags & SOF_BUF_UNDERRUN_PERMITTED); + buffer_c->stream.overrun_permitted = !!(flags & SOF_BUF_OVERRUN_PERMITTED); + buffer_release(buffer_c); /* @@ -82,6 +82,9 @@ struct comp_buffer *buffer_alloc(uint32_t size, uint32_t caps, uint32_t flags, u */ dcache_writeback_invalidate_region(uncache_to_cache(buffer), sizeof(*buffer)); + list_init(&buffer->source_list); + list_init(&buffer->sink_list); + return buffer; }