Commit 3507d231 authored by Mathieu Poirier's avatar Mathieu Poirier Committed by Greg Kroah-Hartman

coresight: tmc-etr: Decouple buffer sync and barrier packet insertion

If less space is available in the perf ring buffer than the ETR buffer,
barrier packets inserted in the trace stream by tmc_sync_etr_buf() are
skipped over when the head of the buffer is moved forward, resulting in
traces that can't be decoded.

This patch decouples the process of syncing ETR buffers and the addition
of barrier packets in order to perform the latter once the offset in the
trace buffer has been properly computed.
Signed-off-by: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: default avatarLeo Yan <leo.yan@linaro.org>
Link: https://lore.kernel.org/r/20190829202842.580-17-mathieu.poirier@linaro.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 00bb485c
...@@ -946,10 +946,6 @@ static void tmc_sync_etr_buf(struct tmc_drvdata *drvdata) ...@@ -946,10 +946,6 @@ static void tmc_sync_etr_buf(struct tmc_drvdata *drvdata)
WARN_ON(!etr_buf->ops || !etr_buf->ops->sync); WARN_ON(!etr_buf->ops || !etr_buf->ops->sync);
etr_buf->ops->sync(etr_buf, rrp, rwp); etr_buf->ops->sync(etr_buf, rrp, rwp);
/* Insert barrier packets at the beginning, if there was an overflow */
if (etr_buf->full)
tmc_etr_buf_insert_barrier_packet(etr_buf, etr_buf->offset);
} }
static void __tmc_etr_enable_hw(struct tmc_drvdata *drvdata) static void __tmc_etr_enable_hw(struct tmc_drvdata *drvdata)
...@@ -1086,6 +1082,13 @@ static void tmc_etr_sync_sysfs_buf(struct tmc_drvdata *drvdata) ...@@ -1086,6 +1082,13 @@ static void tmc_etr_sync_sysfs_buf(struct tmc_drvdata *drvdata)
drvdata->sysfs_buf = NULL; drvdata->sysfs_buf = NULL;
} else { } else {
tmc_sync_etr_buf(drvdata); tmc_sync_etr_buf(drvdata);
/*
* Insert barrier packets at the beginning, if there was
* an overflow.
*/
if (etr_buf->full)
tmc_etr_buf_insert_barrier_packet(etr_buf,
etr_buf->offset);
} }
} }
...@@ -1502,11 +1505,16 @@ tmc_update_etr_buffer(struct coresight_device *csdev, ...@@ -1502,11 +1505,16 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
CS_LOCK(drvdata->base); CS_LOCK(drvdata->base);
spin_unlock_irqrestore(&drvdata->spinlock, flags); spin_unlock_irqrestore(&drvdata->spinlock, flags);
lost = etr_buf->full;
size = etr_buf->len; size = etr_buf->len;
if (!etr_perf->snapshot && size > handle->size) { if (!etr_perf->snapshot && size > handle->size) {
size = handle->size; size = handle->size;
lost = true; lost = true;
} }
/* Insert barrier packets at the beginning, if there was an overflow */
if (lost)
tmc_etr_buf_insert_barrier_packet(etr_buf, etr_buf->offset);
tmc_etr_sync_perf_buffer(etr_perf, size); tmc_etr_sync_perf_buffer(etr_perf, size);
/* /*
...@@ -1517,8 +1525,6 @@ tmc_update_etr_buffer(struct coresight_device *csdev, ...@@ -1517,8 +1525,6 @@ tmc_update_etr_buffer(struct coresight_device *csdev,
*/ */
if (etr_perf->snapshot) if (etr_perf->snapshot)
handle->head += size; handle->head += size;
lost |= etr_buf->full;
out: out:
/* /*
* Don't set the TRUNCATED flag in snapshot mode because 1) the * Don't set the TRUNCATED flag in snapshot mode because 1) the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment