[Sound-open-firmware] [PATCH V3] dma-trace: Fix reschedule bug to avoid dma buffer overflow
Xiuli Pan
xiuli.pan at linux.intel.com
Tue Mar 27 12:24:58 CEST 2018
From: Pan Xiuli <xiuli.pan at linux.intel.com>
We have wrong logic in reschedule, we always reschedule the trace_work
once the buffer is half full and new trace coming. We will delay the old
schedule before the old scheduled trace_work is finally run.
Thus the trace_work will like the carrot in front of the DSP as the donkey,
the DSP will never run the trace_work that scheduled in the furture
while we are in busy state and lots of trace are coming continuously.
Signed-off-by: Pan Xiuli <xiuli.pan at linux.intel.com>
Reviewed-by: Zhigang Wu <zhigang.wu at linux.intel.com>
Reviewed-by: Yan Wang <yan.wang at linux.intel.com>
Tested-by: Zhigang Wu <zhigang.wu at linux.intel.com>
---
V2: reuse copy in progress as Yan suggest.
V3: Fix a typo in refine
Test with:
Mininow max rt5651 and GP-MRB nocodec and CNL nocodec
SOF 1.1-stable: 210989dffeea811de2370fccb7cf5d53106b1e6e
SOF-Tool 1.1-stable: 49c1b450e635ac0c893d67ff0ddfd34e03a85b46
https://github.com/plbossart/sound/tree/topic/sof-v4.14:
8d8c1bb32537800726b14d00d13f324b7f536386
---
src/lib/dma-trace.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/lib/dma-trace.c b/src/lib/dma-trace.c
index 1ff2bd4..10e6102 100644
--- a/src/lib/dma-trace.c
+++ b/src/lib/dma-trace.c
@@ -115,7 +115,7 @@ out:
buffer->avail -= size;
}
- /* DMA trace copying is done */
+ /* DMA trace copying is done, allow reschedule */
d->copy_in_progress = 0;
spin_unlock_irq(&d->lock, flags);
@@ -335,9 +335,15 @@ void dtrace_event(const char *e, uint32_t length)
spin_unlock_irq(&trace_data->lock, flags);
/* schedule copy now if buffer > 50% full */
- if (trace_data->enabled && buffer->avail >= (DMA_TRACE_LOCAL_SIZE / 2))
+ if (trace_data->enabled &&
+ buffer->avail >= (DMA_TRACE_LOCAL_SIZE / 2)) {
work_reschedule_default(&trace_data->dmat_work,
DMA_TRACE_RESCHEDULE_TIME);
+ /* reschedule should not be intrrupted */
+ /* just like we are in copy progress */
+ trace_data->copy_in_progress = 1;
+ }
+
}
void dtrace_event_atomic(const char *e, uint32_t length)
--
2.7.4
More information about the Sound-open-firmware
mailing list