sof: buffer: add spin lock for buffer consume/produce

We may have irq to modify buffer when are modifing the buffer.
Add the spin lock to make modify atomic.

Signed-off-by: Pan Xiuli <xiuli.pan@linux.intel.com>
This commit is contained in:
Pan Xiuli 2018-02-12 11:55:33 +08:00 committed by Liam Girdwood
parent 43e86cab60
commit 62cfeadb4e
2 changed files with 16 additions and 0 deletions

View File

@ -84,6 +84,8 @@ struct comp_buffer *buffer_new(struct sof_ipc_buffer *desc)
buffer->avail = 0;
buffer->connected = 0;
spinlock_init(&buffer->lock);
return buffer;
}

View File

@ -71,6 +71,8 @@ struct comp_buffer {
/* lists */
struct list_item source_list; /* list in comp buffers */
struct list_item sink_list; /* list in comp buffers */
spinlock_t lock;
};
/* pipeline buffer creation and destruction */
@ -81,6 +83,10 @@ void buffer_free(struct comp_buffer *buffer);
static inline void comp_update_buffer_produce(struct comp_buffer *buffer,
uint32_t bytes)
{
uint32_t flags;
spin_lock_irq(&buffer->lock, flags);
buffer->w_ptr += bytes;
/* check for pointer wrap */
@ -98,6 +104,8 @@ static inline void comp_update_buffer_produce(struct comp_buffer *buffer,
/* calculate free bytes */
buffer->free = buffer->size - buffer->avail;
spin_unlock_irq(&buffer->lock, flags);
tracev_buffer("pro");
tracev_value((buffer->avail << 16) | buffer->free);
tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer->size);
@ -108,6 +116,10 @@ static inline void comp_update_buffer_produce(struct comp_buffer *buffer,
static inline void comp_update_buffer_consume(struct comp_buffer *buffer,
uint32_t bytes)
{
uint32_t flags;
spin_lock_irq(&buffer->lock, flags);
buffer->r_ptr += bytes;
/* check for pointer wrap */
@ -125,6 +137,8 @@ static inline void comp_update_buffer_consume(struct comp_buffer *buffer,
/* calculate free bytes */
buffer->free = buffer->size - buffer->avail;
spin_unlock_irq(&buffer->lock, flags);
tracev_buffer("con");
tracev_value((buffer->avail << 16) | buffer->free);
tracev_value((buffer->ipc_buffer.comp.id << 16) | buffer->size);