* [PATCH] coresight: drop lookup reference in coresight_get_sink_by_id()
@ 2026-05-19 8:43 Ma Ke
2026-05-19 9:06 ` Suzuki K Poulose
0 siblings, 1 reply; 2+ messages in thread
From: Ma Ke @ 2026-05-19 8:43 UTC (permalink / raw)
To: suzuki.poulose, mike.leach, james.clark, leo.yan,
alexander.shishkin, mathieu.poirier, peterz, acme
Cc: coresight, linux-arm-kernel, linux-kernel, akpm, Ma Ke, stable
bus_find_device() returns a device with its reference count
incremented. coresight_get_sink_by_id() only uses the returned device
to find the matching CoreSight sink by id and does not need to
transfer this lookup reference to its callers.
Keeping the reference forces callers such as etm_setup_aux() to know
about the internal lookup implementation and to drop the reference
themselves. This is error-prone and led to a leaked reference when a
user-selected sink is used for perf AUX tracing.
Drop the reference inside coresight_get_sink_by_id() after converting
the device to the corresponding coresight_device. The CoreSight path
code takes device references it needs when building/using the path.
Found by code review.
Signed-off-by: Ma Ke <make24@iscas.ac.cn>
Cc: stable@vger.kernel.org
Fixes: 226443925887 ("coresight: Use event attributes for sink selection")
---
drivers/hwtracing/coresight/coresight-core.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c
index 46f247f73cf6..2cca4ed83e2c 100644
--- a/drivers/hwtracing/coresight/coresight-core.c
+++ b/drivers/hwtracing/coresight/coresight-core.c
@@ -624,11 +624,24 @@ static int coresight_sink_by_id(struct device *dev, const void *data)
struct coresight_device *coresight_get_sink_by_id(u32 id)
{
struct device *dev = NULL;
+ struct coresight_device *csdev;
dev = bus_find_device(&coresight_bustype, NULL, &id,
coresight_sink_by_id);
+ if (!dev)
+ return NULL;
+
+ csdev = to_coresight_device(dev);
+
+ /*
+ * bus_find_device() returns a device with its reference count
+ * incremented. coresight_get_sink_by_id() only performs a lookup;
+ * the CoreSight path code takes the references it needs when the
+ * path is built, so drop the lookup reference here.
+ */
+ put_device(dev);
- return dev ? to_coresight_device(dev) : NULL;
+ return csdev;
}
/**
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] coresight: drop lookup reference in coresight_get_sink_by_id()
2026-05-19 8:43 [PATCH] coresight: drop lookup reference in coresight_get_sink_by_id() Ma Ke
@ 2026-05-19 9:06 ` Suzuki K Poulose
0 siblings, 0 replies; 2+ messages in thread
From: Suzuki K Poulose @ 2026-05-19 9:06 UTC (permalink / raw)
To: Ma Ke, mike.leach, james.clark, leo.yan, alexander.shishkin,
mathieu.poirier, peterz, acme
Cc: coresight, linux-arm-kernel, linux-kernel, akpm, stable
On 19/05/2026 09:43, Ma Ke wrote:
> bus_find_device() returns a device with its reference count
> incremented. coresight_get_sink_by_id() only uses the returned device
> to find the matching CoreSight sink by id and does not need to
> transfer this lookup reference to its callers.
>
> Keeping the reference forces callers such as etm_setup_aux() to know
> about the internal lookup implementation and to drop the reference
> themselves. This is error-prone and led to a leaked reference when a
> user-selected sink is used for perf AUX tracing.
>
> Drop the reference inside coresight_get_sink_by_id() after converting
> the device to the corresponding coresight_device. The CoreSight path
> code takes device references it needs when building/using the path.
>
> Found by code review.
Thanks for the report. But..
>
> Signed-off-by: Ma Ke <make24@iscas.ac.cn>
> Cc: stable@vger.kernel.org
> Fixes: 226443925887 ("coresight: Use event attributes for sink selection")
I would rather drop the reference in the etm_setup_aux, to make sure we
are still dealing with a valid device, that has not been removed under
our feet.
Suzuki
> ---
> drivers/hwtracing/coresight/coresight-core.c | 15 ++++++++++++++-
> 1 file changed, 14 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c
> index 46f247f73cf6..2cca4ed83e2c 100644
> --- a/drivers/hwtracing/coresight/coresight-core.c
> +++ b/drivers/hwtracing/coresight/coresight-core.c
> @@ -624,11 +624,24 @@ static int coresight_sink_by_id(struct device *dev, const void *data)
> struct coresight_device *coresight_get_sink_by_id(u32 id)
> {
> struct device *dev = NULL;
> + struct coresight_device *csdev;
>
> dev = bus_find_device(&coresight_bustype, NULL, &id,
> coresight_sink_by_id);
> + if (!dev)
> + return NULL;
> +
> + csdev = to_coresight_device(dev);
> +
> + /*
> + * bus_find_device() returns a device with its reference count
> + * incremented. coresight_get_sink_by_id() only performs a lookup;
> + * the CoreSight path code takes the references it needs when the
> + * path is built, so drop the lookup reference here.
> + */
> + put_device(dev);
>
> - return dev ? to_coresight_device(dev) : NULL;
> + return csdev;
> }
>
> /**
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-05-19 9:06 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-19 8:43 [PATCH] coresight: drop lookup reference in coresight_get_sink_by_id() Ma Ke
2026-05-19 9:06 ` Suzuki K Poulose
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox