]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
coresight: core: Disable helpers for devices that fail to enable
authorYabin Cui <yabinc@google.com>
Tue, 29 Apr 2025 23:13:00 +0000 (16:13 -0700)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Wed, 30 Apr 2025 13:53:56 +0000 (14:53 +0100)
When enabling a SINK or LINK type coresight device fails, the
associated helpers should be disabled.

Fixes: 6148652807ba ("coresight: Enable and disable helper devices adjacent to the path")
Signed-off-by: Yabin Cui <yabinc@google.com>
Suggested-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Reviewed-by: James Clark <james.clark@linaro.org>
Reviewed-by: Mike Leach <mike.leach@linaro.org>
Reviewed-by: Leo Yan <leo.yan@arm.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250429231301.1952246-3-yabinc@google.com
drivers/hwtracing/coresight/coresight-core.c

index dabec7073aedaa7e300ebe81caca45250f86b515..d3523f0262af829c69fe709b72eedaa7ba34d150 100644 (file)
@@ -465,7 +465,7 @@ int coresight_enable_path(struct coresight_path *path, enum cs_mode mode,
                /* Enable all helpers adjacent to the path first */
                ret = coresight_enable_helpers(csdev, mode, path);
                if (ret)
-                       goto err;
+                       goto err_disable_path;
                /*
                 * ETF devices are tricky... They can be a link or a sink,
                 * depending on how they are configured.  If an ETF has been
@@ -486,8 +486,10 @@ int coresight_enable_path(struct coresight_path *path, enum cs_mode mode,
                         * that need disabling. Disabling the path here
                         * would mean we could disrupt an existing session.
                         */
-                       if (ret)
+                       if (ret) {
+                               coresight_disable_helpers(csdev, path);
                                goto out;
+                       }
                        break;
                case CORESIGHT_DEV_TYPE_SOURCE:
                        /* sources are enabled from either sysFS or Perf */
@@ -497,16 +499,19 @@ int coresight_enable_path(struct coresight_path *path, enum cs_mode mode,
                        child = list_next_entry(nd, link)->csdev;
                        ret = coresight_enable_link(csdev, parent, child, source);
                        if (ret)
-                               goto err;
+                               goto err_disable_helpers;
                        break;
                default:
-                       goto err;
+                       ret = -EINVAL;
+                       goto err_disable_helpers;
                }
        }
 
 out:
        return ret;
-err:
+err_disable_helpers:
+       coresight_disable_helpers(csdev, path);
+err_disable_path:
        coresight_disable_path_from(path, nd);
        goto out;
 }