summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorLeo Yan <leo.yan@arm.com>2026-05-15 21:08:26 +0100
committerSuzuki K Poulose <suzuki.poulose@arm.com>2026-05-18 10:18:46 +0100
commitac8eac9062eefc33f5e97e526eef69bc98ecbdbc (patch)
tree9b6687a600d6c23f3ba0c48b06c94ba4cb4eb128 /drivers
parenta18e877b0491ad21b24d6f1fe2afb854990e031d (diff)
coresight: Save active path for system tracers
This commit only set the path pointer for system tracers (e.g. STM) in coresight_{enable|disable}_source(). Later changes will set the path pointer locally for per-CPU sources. This is because the mode and path pointer must be set together, so that they are observed atomically by the CPU PM notifier. Reviewed-by: Yeoreum Yun <yeoreum.yun@arm.com> Reviewed-by: James Clark <james.clark@linaro.org> Tested-by: James Clark <james.clark@linaro.org> Tested-by: Jie Gan <jie.gan@oss.qualcomm.com> Signed-off-by: Leo Yan <leo.yan@arm.com> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> Link: https://lore.kernel.org/r/20260515-arm_coresight_path_power_management_improvement-v14-19-f88c4a3ecfe9@arm.com
Diffstat (limited to 'drivers')
-rw-r--r--drivers/hwtracing/coresight/coresight-core.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c
index f833b73ebc16..7f6febd20faa 100644
--- a/drivers/hwtracing/coresight/coresight-core.c
+++ b/drivers/hwtracing/coresight/coresight-core.c
@@ -487,10 +487,28 @@ int coresight_enable_source(struct coresight_device *csdev,
struct perf_event *event, enum cs_mode mode,
struct coresight_path *path)
{
+ int ret;
+
if (!coresight_is_device_source(csdev))
return -EINVAL;
- return source_ops(csdev)->enable(csdev, event, mode, path);
+ ret = source_ops(csdev)->enable(csdev, event, mode, path);
+ if (ret)
+ return ret;
+
+ /*
+ * Update the path pointer until after the source is enabled to avoid
+ * races where multiple paths attempt to enable the same source.
+ *
+ * Do not set the path pointer here for per-CPU sources; set it locally
+ * on the CPU instead. Otherwise, there is a window where the path is
+ * enabled but the pointer is not yet set, causing CPU PM notifiers to
+ * miss PM operations due to reading a NULL pointer.
+ */
+ if (!coresight_is_percpu_source(csdev))
+ csdev->path = path;
+
+ return 0;
}
void coresight_disable_source(struct coresight_device *csdev, void *data)
@@ -498,6 +516,9 @@ void coresight_disable_source(struct coresight_device *csdev, void *data)
if (!coresight_is_device_source(csdev))
return;
+ if (!coresight_is_percpu_source(csdev))
+ csdev->path = NULL;
+
source_ops(csdev)->disable(csdev, data);
}
EXPORT_SYMBOL_GPL(coresight_disable_source);