]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
coresight: sysfs: Use source's path pointer for path control
authorLeo Yan <leo.yan@arm.com>
Fri, 15 May 2026 20:08:29 +0000 (21:08 +0100)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Mon, 18 May 2026 09:18:47 +0000 (10:18 +0100)
Since the path pointer is stored in the source's structure, retrieve it
directly when disabling the path.

As a result, the global variables used for caching path pointers are no
longer needed. Remove them to simplify the code.

Tested-by: James Clark <james.clark@linaro.org>
Reviewed-by: Yeoreum Yun <yeoreum.yun@arm.com>
Reviewed-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-22-f88c4a3ecfe9@arm.com
drivers/hwtracing/coresight/coresight-sysfs.c

index 9ec112b457bbdc85f807eccc6944bf39e5e363e1..21196ee1d2bdf6ccba4afbde2c188432bc4932b1 100644 (file)
@@ -5,26 +5,12 @@
  */
 
 #include <linux/device.h>
-#include <linux/idr.h>
 #include <linux/kernel.h>
 #include <linux/property.h>
 
 #include "coresight-priv.h"
 #include "coresight-trace-id.h"
 
-/*
- * Use IDR to map the hash of the source's device name
- * to the pointer of path for the source. The idr is for
- * the sources which aren't associated with CPU.
- */
-static DEFINE_IDR(path_idr);
-
-/*
- * When operating Coresight drivers from the sysFS interface, only a single
- * path can exist from a tracer (associated to a CPU) to a sink.
- */
-static DEFINE_PER_CPU(struct coresight_path *, tracer_path);
-
 ssize_t coresight_simple_show_pair(struct device *_dev,
                              struct device_attribute *attr, char *buf)
 {
@@ -167,11 +153,10 @@ static int coresight_validate_source_sysfs(struct coresight_device *csdev,
 
 int coresight_enable_sysfs(struct coresight_device *csdev)
 {
-       int cpu, ret = 0;
+       int ret = 0;
        struct coresight_device *sink;
        struct coresight_path *path;
        enum coresight_dev_subtype_source subtype;
-       u32 hash;
 
        subtype = csdev->subtype.source_subtype;
 
@@ -223,37 +208,6 @@ int coresight_enable_sysfs(struct coresight_device *csdev)
        if (ret)
                goto err_source;
 
-       switch (subtype) {
-       case CORESIGHT_DEV_SUBTYPE_SOURCE_PROC:
-               /*
-                * When working from sysFS it is important to keep track
-                * of the paths that were created so that they can be
-                * undone in 'coresight_disable()'.  Since there can only
-                * be a single session per tracer (when working from sysFS)
-                * a per-cpu variable will do just fine.
-                */
-               cpu = csdev->cpu;
-               per_cpu(tracer_path, cpu) = path;
-               break;
-       case CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE:
-       case CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM:
-       case CORESIGHT_DEV_SUBTYPE_SOURCE_OTHERS:
-               /*
-                * Use the hash of source's device name as ID
-                * and map the ID to the pointer of the path.
-                */
-               hash = hashlen_hash(hashlen_string(NULL, dev_name(&csdev->dev)));
-               ret = idr_alloc_u32(&path_idr, path, &hash, hash, GFP_KERNEL);
-               if (ret) {
-                       coresight_disable_source_sysfs(csdev, NULL);
-                       goto err_source;
-               }
-               break;
-       default:
-               /* We can't be here */
-               break;
-       }
-
 out:
        mutex_unlock(&coresight_mutex);
        return ret;
@@ -269,9 +223,8 @@ EXPORT_SYMBOL_GPL(coresight_enable_sysfs);
 
 void coresight_disable_sysfs(struct coresight_device *csdev)
 {
-       int cpu, ret;
-       struct coresight_path *path = NULL;
-       u32 hash;
+       struct coresight_path *path;
+       int ret;
 
        mutex_lock(&coresight_mutex);
 
@@ -279,32 +232,15 @@ void coresight_disable_sysfs(struct coresight_device *csdev)
        if (ret)
                goto out;
 
+       /*
+        * coresight_disable_source_sysfs() clears the 'csdev->path' pointer
+        * when disabling the source. Retrieve the path pointer here.
+        */
+       path = csdev->path;
+
        if (!coresight_disable_source_sysfs(csdev, NULL))
                goto out;
 
-       switch (csdev->subtype.source_subtype) {
-       case CORESIGHT_DEV_SUBTYPE_SOURCE_PROC:
-               cpu = csdev->cpu;
-               path = per_cpu(tracer_path, cpu);
-               per_cpu(tracer_path, cpu) = NULL;
-               break;
-       case CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE:
-       case CORESIGHT_DEV_SUBTYPE_SOURCE_TPDM:
-       case CORESIGHT_DEV_SUBTYPE_SOURCE_OTHERS:
-               hash = hashlen_hash(hashlen_string(NULL, dev_name(&csdev->dev)));
-               /* Find the path by the hash. */
-               path = idr_find(&path_idr, hash);
-               if (path == NULL) {
-                       pr_err("Path is not found for %s\n", dev_name(&csdev->dev));
-                       goto out;
-               }
-               idr_remove(&path_idr, hash);
-               break;
-       default:
-               /* We can't be here */
-               break;
-       }
-
        coresight_disable_path(path);
        coresight_release_path(path);