[PATCH v3 29/31] coresight: Take hotplug lock in enable_source_store() for Sysfs mode

Mike Leach mike.leach at linaro.org
Fri Oct 3 03:38:06 PDT 2025


On Mon, 15 Sept 2025 at 11:34, Leo Yan <leo.yan at arm.com> wrote:
>
> The hotplug lock is acquired and released in the etm4_disable_sysfs()
> function, which is a low-level function located in the ETM4 driver.
> This prevents us from a new solution for hotplug.
>
> Firstly, hotplug callbacks cannot invoke etm4_disable_sysfs() to disable
> the source; otherwise, a deadlock issue occurs.  The reason is that, in
> the hotplug flow, the kernel acquires the hotplug lock before calling
> callbacks.  Subsequently, if coresight_disable_source() is invoked and
> it calls etm4_disable_sysfs(), the hotplug lock will be acquired twice,
> leading to a double lock issue.
>
> Secondly, when hotplugging a CPU on or off, if we want to manipulate all
> components on a path attached to the CPU, we need to maintain atomicity
> for the entire path.  Otherwise, a race condition may occur with users
> setting the same path via the Sysfs knobs, ultimately causing mess
> states in CoreSight components.
>
> This patch moves the hotplug locking from etm4_disable_sysfs() into
> enable_source_store().  As a result, when users control the Sysfs knobs,
> the whole flow is protected by hotplug locking, ensuring it is mutual
> exclusive with hotplug callbacks.
>
> Note, the paired function etm4_enable_sysfs() does not use hotplug
> locking, which is why this patch does not modify it.
>
> Signed-off-by: Leo Yan <leo.yan at arm.com>
> ---
>  drivers/hwtracing/coresight/coresight-etm4x-core.c | 9 ---------
>  drivers/hwtracing/coresight/coresight-sysfs.c      | 7 +++++++
>  2 files changed, 7 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> index 4218cefca63d7b2f3b102e74d7f007ebc7b08861..920c817de8c33751760a1ed7ab1df8437620bb4e 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
> +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> @@ -1088,13 +1088,6 @@ static void etm4_disable_sysfs(struct coresight_device *csdev)
>  {
>         struct etmv4_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
>
> -       /*
> -        * Taking hotplug lock here protects from clocks getting disabled
> -        * with tracing being left on (crash scenario) if user disable occurs
> -        * after cpu online mask indicates the cpu is offline but before the
> -        * DYING hotplug callback is serviced by the ETM driver.
> -        */
> -       cpus_read_lock();
>         raw_spin_lock(&drvdata->spinlock);
>
>         /*
> @@ -1108,8 +1101,6 @@ static void etm4_disable_sysfs(struct coresight_device *csdev)
>
>         cscfg_csdev_disable_active_config(csdev);
>
> -       cpus_read_unlock();
> -
>         /*
>          * we only release trace IDs when resetting sysfs.
>          * This permits sysfs users to read the trace ID after the trace
> diff --git a/drivers/hwtracing/coresight/coresight-sysfs.c b/drivers/hwtracing/coresight/coresight-sysfs.c
> index cb02f1bfaf068ec3f50f997bcb94f7d5215ccea8..a4c5a334703f0bb35db5eeda87ae5a9756f6a453 100644
> --- a/drivers/hwtracing/coresight/coresight-sysfs.c
> +++ b/drivers/hwtracing/coresight/coresight-sysfs.c
> @@ -363,6 +363,13 @@ static ssize_t enable_source_store(struct device *dev,
>         if (ret)
>                 return ret;
>
> +       /*
> +        * CoreSight hotplug callbacks in core layer control a activated path
> +        * from its source to sink. Taking hotplug lock here protects a race
> +        * condition with hotplug callbacks.
> +        */
> +       guard(cpus_read_lock)();
> +
>         if (val) {
>                 ret = coresight_enable_sysfs(csdev);
>                 if (ret)
>
> --
> 2.34.1
>
Reviewed-by: Mike Leach <mike.leach at linaro.org>

-- 
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK



More information about the linux-arm-kernel mailing list