From: Mike Leach mike.leach@linaro.org
mainline inclusion from mainline-v6.3-rc1 commit 4ff1fdb4125c category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/I85PIL CVE: NA
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i...
----------------------------------------------------------------------
Adds in calls to allocate and release Trace ID for the CPUs in use by the perf session.
Adds in notifier calls to the trace ID allocator that perf events are starting and stopping.
This ensures that Trace IDs associated with CPUs remain the same throughout the perf session, and are only released when all perf sessions are complete.
Signed-off-by: Mike Leach mike.leach@linaro.org Reviewed-by: Suzuki K Poulose suzuki.poulose@arm.com Signed-off-by: Suzuki K Poulose suzuki.poulose@arm.com Link: https://lore.kernel.org/r/20230116124928.5440-4-mike.leach@linaro.org Signed-off-by: xiabing xiabing12@h-partners.com --- drivers/hwtracing/coresight/coresight-etm-perf.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c index 34a920fbb08d..c6ec0b2c2512 100644 --- a/drivers/hwtracing/coresight/coresight-etm-perf.c +++ b/drivers/hwtracing/coresight/coresight-etm-perf.c @@ -20,6 +20,7 @@
#include "coresight-etm-perf.h" #include "coresight-priv.h" +#include "coresight-trace-id.h"
static struct pmu etm_pmu; static bool etm_perf_up; @@ -175,8 +176,12 @@ static void free_event_data(struct work_struct *work) if (!(IS_ERR_OR_NULL(*ppath))) coresight_release_path(*ppath); *ppath = NULL; + coresight_trace_id_put_cpu_id(cpu); }
+ /* mark perf event as done for trace id allocator */ + coresight_trace_id_perf_stop(); + free_percpu(event_data->path); kfree(event_data); } @@ -228,6 +233,7 @@ static void *etm_setup_aux(struct perf_event *event, void **pages, { u32 id; int cpu = event->cpu; + int trace_id; cpumask_t *mask; struct coresight_device *sink = NULL; struct etm_event_data *event_data = NULL; @@ -243,6 +249,9 @@ static void *etm_setup_aux(struct perf_event *event, void **pages, sink = coresight_get_sink_by_id(id); }
+ /* tell the trace ID allocator that a perf event is starting up */ + coresight_trace_id_perf_start(); + mask = &event_data->mask;
/* @@ -288,6 +297,13 @@ static void *etm_setup_aux(struct perf_event *event, void **pages, continue; }
+ /* ensure we can allocate a trace ID for this CPU */ + trace_id = coresight_trace_id_get_cpu_id(cpu); + if (!IS_VALID_CS_TRACE_ID(trace_id)) { + cpumask_clear_cpu(cpu, mask); + continue; + } + *etm_event_cpu_path_ptr(event_data, cpu) = path; }