Commit a646ca09 authored by Suzuki K Poulose's avatar Suzuki K Poulose

coresight: perf: Output trace id only once

With the dynamic traceid allocation scheme in, we output the
AUX_OUTPUT_HWID packet every time event->start() is called.
This could cause too many such records in the perf.data,
while only one per CPU throughout the life time of
the event is required. Make sure we only output it once.

Before this patch:
  $ perf report -D | grep OUTPUT_HW_ID
  ...
  AUX_OUTPUT_HW_ID events:         55  (18.3%)

After this patch:

 $ perf report -D | grep OUTPUT_HW_ID
 ...
 AUX_OUTPUT_HW_ID events:          5  ( 1.9%)

Cc: Mike Leach <mike.leach@linaro.org>
Cc: James Clark <james.clark@arm.com>
Cc: Leo Yan <leo.yan@linaro.org>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Reviewed-by: default avatarJames Clark <james.clark@arm.com>
Link: https://lore.kernel.org/r/20230120103434.864318-1-suzuki.poulose@arm.com
parent 0c507af7
...@@ -495,10 +495,18 @@ static void etm_event_start(struct perf_event *event, int flags) ...@@ -495,10 +495,18 @@ static void etm_event_start(struct perf_event *event, int flags)
if (source_ops(csdev)->enable(csdev, event, CS_MODE_PERF)) if (source_ops(csdev)->enable(csdev, event, CS_MODE_PERF))
goto fail_disable_path; goto fail_disable_path;
/* output cpu / trace ID in perf record */ /*
hw_id = FIELD_PREP(CS_AUX_HW_ID_VERSION_MASK, CS_AUX_HW_ID_CURR_VERSION); * output cpu / trace ID in perf record, once for the lifetime
hw_id |= FIELD_PREP(CS_AUX_HW_ID_TRACE_ID_MASK, coresight_trace_id_read_cpu_id(cpu)); * of the event.
perf_report_aux_output_id(event, hw_id); */
if (!cpumask_test_cpu(cpu, &event_data->aux_hwid_done)) {
cpumask_set_cpu(cpu, &event_data->aux_hwid_done);
hw_id = FIELD_PREP(CS_AUX_HW_ID_VERSION_MASK,
CS_AUX_HW_ID_CURR_VERSION);
hw_id |= FIELD_PREP(CS_AUX_HW_ID_TRACE_ID_MASK,
coresight_trace_id_read_cpu_id(cpu));
perf_report_aux_output_id(event, hw_id);
}
out: out:
/* Tell the perf core the event is alive */ /* Tell the perf core the event is alive */
......
...@@ -48,6 +48,7 @@ struct etm_filters { ...@@ -48,6 +48,7 @@ struct etm_filters {
* struct etm_event_data - Coresight specifics associated to an event * struct etm_event_data - Coresight specifics associated to an event
* @work: Handle to free allocated memory outside IRQ context. * @work: Handle to free allocated memory outside IRQ context.
* @mask: Hold the CPU(s) this event was set for. * @mask: Hold the CPU(s) this event was set for.
* @aux_hwid_done: Whether a CPU has emitted the TraceID packet or not.
* @snk_config: The sink configuration. * @snk_config: The sink configuration.
* @cfg_hash: The hash id of any coresight config selected. * @cfg_hash: The hash id of any coresight config selected.
* @path: An array of path, each slot for one CPU. * @path: An array of path, each slot for one CPU.
...@@ -55,6 +56,7 @@ struct etm_filters { ...@@ -55,6 +56,7 @@ struct etm_filters {
struct etm_event_data { struct etm_event_data {
struct work_struct work; struct work_struct work;
cpumask_t mask; cpumask_t mask;
cpumask_t aux_hwid_done;
void *snk_config; void *snk_config;
u32 cfg_hash; u32 cfg_hash;
struct list_head * __percpu *path; struct list_head * __percpu *path;
......
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