An AUX pause ends the current AUX output before trying to begin a new
one. That new beginning can fail, leaving the CoreSight path published
after the perf handle has become inactive. AUX resume may also overlap
a normal stop which clears the per-CPU context.
Pass the per-CPU ETM context to etm_event_resume() and centralize both
lifetime checks there. Use perf_get_aux() to confirm that the AUX output
handle is active and path to confirm that the context is still live.
Resume the source only when both checks succeed.
Assisted-by: Codex:gpt-6
Signed-off-by: Leo Yan <leo.yan@arm.com>
---
drivers/hwtracing/coresight/coresight-etm-perf.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c
index c7454da5c881c4a8eea5cc77902c9113c297096e..e3c9d3cf84c502f357a430bc3bfa854a776618f1 100644
--- a/drivers/hwtracing/coresight/coresight-etm-perf.c
+++ b/drivers/hwtracing/coresight/coresight-etm-perf.c
@@ -517,11 +517,17 @@ static void *etm_setup_aux(struct perf_event *event, void **pages,
goto out;
}
-static int etm_event_resume(struct coresight_path *path)
+static int etm_event_resume(struct etm_ctxt *ctxt)
{
+ struct perf_output_handle *handle = &ctxt->handle;
struct coresight_device *source;
+ struct coresight_path *path;
int ret;
+ if (!perf_get_aux(handle))
+ return 0;
+
+ path = etm_event_get_ctxt_path(ctxt);
if (!path)
return 0;
@@ -547,8 +553,7 @@ static void etm_event_start(struct perf_event *event, int flags)
u64 hw_id;
if (flags & PERF_EF_RESUME) {
- path = etm_event_get_ctxt_path(ctxt);
- if (etm_event_resume(path) < 0)
+ if (etm_event_resume(ctxt) < 0)
goto fail;
return;
}
--
2.34.1