Skip to content

Commit

Permalink
dmaengine: imx-sdma: fix buffer ownership
Browse files Browse the repository at this point in the history
BD_DONE flag marks ownership of the buffer. When 1 SDMA owns the
buffer, when 0 ARM owns it. When processing the buffers in
sdma_update_channel_loop the ownership of the currently processed
buffer was set to SDMA again before running the callback function of
the buffer and while the sdma script may be running in parallel. So
there was the possibility to get the buffer overwritten by SDMA before
it has been processed by kernel leading to kind of random errors in the
upper layers, e.g. bluetooth.

Signed-off-by: Philipp Puschmann <philipp.puschmann@emlix.com>
  • Loading branch information
Philipp Puschmann authored and intel-lab-lkp committed Sep 19, 2019
1 parent b41dae0 commit 750aab0
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion drivers/dma/imx-sdma.c
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,6 @@ static void sdma_update_channel_loop(struct sdma_channel *sdmac)
*/

desc->chn_real_count = bd->mode.count;
bd->mode.status |= BD_DONE;
bd->mode.count = desc->period_len;
desc->buf_ptail = desc->buf_tail;
desc->buf_tail = (desc->buf_tail + 1) % desc->num_bd;
Expand All @@ -817,6 +816,9 @@ static void sdma_update_channel_loop(struct sdma_channel *sdmac)
dmaengine_desc_get_callback_invoke(&desc->vd.tx, NULL);
spin_lock(&sdmac->vc.lock);

dma_wb();
bd->mode.status |= BD_DONE;

if (error)
sdmac->status = old_status;
}
Expand Down

0 comments on commit 750aab0

Please sign in to comment.