mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
UPSTREAM: coresight: etm-pmu: Ensure the AUX handle is valid
The ETM perf infrastructure closes out a handle during event_stop
or on an error in starting the event. In either case, it is possible
for a "sink" to update/close the handle, under certain circumstances.
(e.g no space in ring buffer.). So, ensure that we handle this
gracefully in the PMU driver by verifying the handle is still valid.
Bug: 213931796
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Leo Yan <leo.yan@linaro.org>
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20210914102641.1852544-4-suzuki.poulose@arm.com
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
(cherry picked from commit 2ef43054bb)
Signed-off-by: Qais Yousef <qais.yousef@arm.com>
Change-Id: I5046abb29097d575f766b9569ef95ed38d86bbd3
This commit is contained in:
committed by
Todd Kjos
parent
eafd22e7f7
commit
0e5e45f4f0
@@ -485,8 +485,15 @@ out:
|
||||
fail_disable_path:
|
||||
coresight_disable_path(path);
|
||||
fail_end_stop:
|
||||
perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED);
|
||||
perf_aux_output_end(handle, 0);
|
||||
/*
|
||||
* Check if the handle is still associated with the event,
|
||||
* to handle cases where if the sink failed to start the
|
||||
* trace and TRUNCATED the handle already.
|
||||
*/
|
||||
if (READ_ONCE(handle->event)) {
|
||||
perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED);
|
||||
perf_aux_output_end(handle, 0);
|
||||
}
|
||||
fail:
|
||||
event->hw.state = PERF_HES_STOPPED;
|
||||
return;
|
||||
@@ -567,7 +574,21 @@ static void etm_event_stop(struct perf_event *event, int mode)
|
||||
|
||||
size = sink_ops(sink)->update_buffer(sink, handle,
|
||||
event_data->snk_config);
|
||||
perf_aux_output_end(handle, size);
|
||||
/*
|
||||
* Make sure the handle is still valid as the
|
||||
* sink could have closed it from an IRQ.
|
||||
* The sink driver must handle the race with
|
||||
* update_buffer() and IRQ. Thus either we
|
||||
* should get a valid handle and valid size
|
||||
* (which may be 0).
|
||||
*
|
||||
* But we should never get a non-zero size with
|
||||
* an invalid handle.
|
||||
*/
|
||||
if (READ_ONCE(handle->event))
|
||||
perf_aux_output_end(handle, size);
|
||||
else
|
||||
WARN_ON(size);
|
||||
}
|
||||
|
||||
/* Disabling the path make its elements available to other sessions */
|
||||
|
||||
Reference in New Issue
Block a user