From: Carl Worth <carl@os.amperecomputing.com>
The handle is essential for retrieving the AUX_EVENT of each CPU and is
required in perf mode. It has been added to the coresight_path so that
dependent devices can access it from the path when needed.
Fixes: 080ee83cc361 ("Coresight: Change functions to accept the coresight_path")
Signed-off-by: Carl Worth <carl@os.amperecomputing.com>
Co-developed-by: Jie Gan <jie.gan@oss.qualcomm.com>
Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
---
drivers/hwtracing/coresight/coresight-etm-perf.c | 1 +
drivers/hwtracing/coresight/coresight-tmc-etr.c | 3 ++-
include/linux/coresight.h | 10 ++++++----
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c
index f677c08233ba..5c256af6e54a 100644
--- a/drivers/hwtracing/coresight/coresight-etm-perf.c
+++ b/drivers/hwtracing/coresight/coresight-etm-perf.c
@@ -520,6 +520,7 @@ static void etm_event_start(struct perf_event *event, int flags)
goto out;
path = etm_event_cpu_path(event_data, cpu);
+ path->handle = handle;
/* We need a sink, no need to continue without one */
sink = coresight_get_sink(path);
if (WARN_ON_ONCE(!sink))
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index b07fcdb3fe1a..1040f73f0537 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -1327,7 +1327,8 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
struct etr_buf *tmc_etr_get_buffer(struct coresight_device *csdev,
enum cs_mode mode, void *data)
{
- struct perf_output_handle *handle = data;
+ struct coresight_path *path = data;
+ struct perf_output_handle *handle = path->handle;
struct etr_perf_buffer *etr_perf;
switch (mode) {
diff --git a/include/linux/coresight.h b/include/linux/coresight.h
index 6de59ce8ef8c..4591121ae1d4 100644
--- a/include/linux/coresight.h
+++ b/include/linux/coresight.h
@@ -332,12 +332,14 @@ static struct coresight_dev_list (var) = { \
/**
* struct coresight_path - data needed by enable/disable path
- * @path_list: path from source to sink.
- * @trace_id: trace_id of the whole path.
+ * @path_list: path from source to sink.
+ * @trace_id: trace_id of the whole path.
+ * struct perf_output_handle: handle of the aux_event.
*/
struct coresight_path {
- struct list_head path_list;
- u8 trace_id;
+ struct list_head path_list;
+ u8 trace_id;
+ struct perf_output_handle *handle;
};
enum cs_mode {
--
2.34.1
Jie Gan <jie.gan@oss.qualcomm.com> writes: > From: Carl Worth <carl@os.amperecomputing.com> > > The handle is essential for retrieving the AUX_EVENT of each CPU and is > required in perf mode. It has been added to the coresight_path so that > dependent devices can access it from the path when needed. I'd still like to have the original command I used to trigger the bug in the commit message. I really like having reproduction steps captured in commit messages when I look back at commits in the future. So, that was: perf record -e cs_etm//k -C 0-9 dd if=/dev/zero of=/dev/null > /** > * struct coresight_path - data needed by enable/disable path > - * @path_list: path from source to sink. > - * @trace_id: trace_id of the whole path. > + * @path_list: path from source to sink. > + * @trace_id: trace_id of the whole path. > + * struct perf_output_handle: handle of the aux_event. > */ Fixing to "@handle" was mentioned in another comment already. Something about the above still feels a little off to me. It feels like we're throwing new data into a structure just because it happens to be conveniently at hand for the code paths we're needing, and not because it really _belongs_ there. Or, maybe it's the right place for it, and the cause of my concern is that "path" is an overly-narrow name in struct coresight_path? But if a renaming of this structure would improve the code, I'd also be fine with that happening in a subsequent commit, so I won't try to hold up the current series based on that. -Carl
On 9/23/2025 1:31 AM, Carl Worth wrote: > Jie Gan <jie.gan@oss.qualcomm.com> writes: >> From: Carl Worth <carl@os.amperecomputing.com> >> >> The handle is essential for retrieving the AUX_EVENT of each CPU and is >> required in perf mode. It has been added to the coresight_path so that >> dependent devices can access it from the path when needed. > > I'd still like to have the original command I used to trigger the bug in > the commit message. I really like having reproduction steps captured in > commit messages when I look back at commits in the future. So, that was: > > perf record -e cs_etm//k -C 0-9 dd if=/dev/zero of=/dev/null > Sure, I’ll include your commit message in the formal patch series, I think it's V3 since you have submitted two versions, if you're okay with me sending it out. >> /** >> * struct coresight_path - data needed by enable/disable path >> - * @path_list: path from source to sink. >> - * @trace_id: trace_id of the whole path. >> + * @path_list: path from source to sink. >> + * @trace_id: trace_id of the whole path. >> + * struct perf_output_handle: handle of the aux_event. >> */ > > Fixing to "@handle" was mentioned in another comment already. > > Something about the above still feels a little off to me. It feels like > we're throwing new data into a structure just because it happens to be > conveniently at hand for the code paths we're needing, and not because > it really _belongs_ there. > The core idea behind coresight_path is that it can hold all the data potentially needed by any device along the path. For example with the path ETM->Link->ETR->CATU: All the mentioned devices operate by forming a path, for which the system constructs a coresight_path. This 'path' is then passed to each device along the route, allowing any device to directly access the required data from coresight_path instead of receiving it as a separate argument. Imagine a device that requires more than two or three arguments, and you want to pass them through coresight_enable_path or similar functions... For certain coresight_path instances, we may not need the handle or other parameters. Since these values are initialized, it's acceptable to leave them as NULL or 0. > Or, maybe it's the right place for it, and the cause of my concern is > that "path" is an overly-narrow name in struct coresight_path? > It defines the direction of data flow—serving as the path for trace data. Thanks, Jie > But if a renaming of this structure would improve the code, I'd also be > fine with that happening in a subsequent commit, so I won't try to hold > up the current series based on that. > > -Carl
Jie Gan <jie.gan@oss.qualcomm.com> writes: > On 9/23/2025 1:31 AM, Carl Worth wrote: >> I'd still like to have the original command I used to trigger the bug in >> the commit message. I really like having reproduction steps captured in >> commit messages when I look back at commits in the future. So, that was: >> >> perf record -e cs_etm//k -C 0-9 dd if=/dev/zero of=/dev/null > > Sure, I’ll include your commit message in the formal patch series, I > think it's V3 since you have submitted two versions, if you're okay with > me sending it out. Yes. Please do. And thank you. > The core idea behind coresight_path is that it can hold all the data > potentially needed by any device along the path. > > For example with the path ETM->Link->ETR->CATU: OK. That makes sense to me. The name of coresight_path definitely threw me off, since I interpreted it as being a description of the path, not a container for data to be consumed along the path. -Carl
Hi, On Tue, 23 Sept 2025 at 02:49, Jie Gan <jie.gan@oss.qualcomm.com> wrote: > > > > On 9/23/2025 1:31 AM, Carl Worth wrote: > > Jie Gan <jie.gan@oss.qualcomm.com> writes: > >> From: Carl Worth <carl@os.amperecomputing.com> > >> > >> The handle is essential for retrieving the AUX_EVENT of each CPU and is > >> required in perf mode. It has been added to the coresight_path so that > >> dependent devices can access it from the path when needed. > > > > I'd still like to have the original command I used to trigger the bug in > > the commit message. I really like having reproduction steps captured in > > commit messages when I look back at commits in the future. So, that was: > > > > perf record -e cs_etm//k -C 0-9 dd if=/dev/zero of=/dev/null > > > > Sure, I’ll include your commit message in the formal patch series, I > think it's V3 since you have submitted two versions, if you're okay with > me sending it out. > > >> /** > >> * struct coresight_path - data needed by enable/disable path > >> - * @path_list: path from source to sink. > >> - * @trace_id: trace_id of the whole path. > >> + * @path_list: path from source to sink. > >> + * @trace_id: trace_id of the whole path. > >> + * struct perf_output_handle: handle of the aux_event. > >> */ > > > > Fixing to "@handle" was mentioned in another comment already. > > > > Something about the above still feels a little off to me. It feels like > > we're throwing new data into a structure just because it happens to be > > conveniently at hand for the code paths we're needing, and not because > > it really _belongs_ there. > > > This data is perf specific - not path generic; so I agree that this structure should go elsewhere. I would suggest in the csdev (coresight_device) structure itself. We already have some sink specific data in here e.g. perf_sink_id_map. This could then be set/clear in the functions coresight-etm-perf.c file, where there is a significant amount of code dealing with the perf handle and ensuring it is valid and in scope. This can then be set only when appropriate - for source / sink devices and only when in perf mode, and avoid the need to pass the handle around as API call parameters. Regards Mike. > The core idea behind coresight_path is that it can hold all the data > potentially needed by any device along the path. > > For example with the path ETM->Link->ETR->CATU: > > All the mentioned devices operate by forming a path, for which the > system constructs a coresight_path. This 'path' is then passed to each > device along the route, allowing any device to directly access the > required data from coresight_path instead of receiving it as a separate > argument. > > Imagine a device that requires more than two or three arguments, and you > want to pass them through coresight_enable_path or similar functions... > > For certain coresight_path instances, we may not need the handle or > other parameters. Since these values are initialized, it's acceptable to > leave them as NULL or 0. > > > > Or, maybe it's the right place for it, and the cause of my concern is > > that "path" is an overly-narrow name in struct coresight_path? > > > > It defines the direction of data flow—serving as the path for trace data. > > Thanks, > Jie > > > But if a renaming of this structure would improve the code, I'd also be > > fine with that happening in a subsequent commit, so I won't try to hold > > up the current series based on that. > > > > -Carl > -- Mike Leach Principal Engineer, ARM Ltd. Manchester Design Centre. UK
On 24/09/2025 11:21, Mike Leach wrote: > Hi, > > On Tue, 23 Sept 2025 at 02:49, Jie Gan <jie.gan@oss.qualcomm.com> wrote: >> >> >> >> On 9/23/2025 1:31 AM, Carl Worth wrote: >>> Jie Gan <jie.gan@oss.qualcomm.com> writes: >>>> From: Carl Worth <carl@os.amperecomputing.com> >>>> >>>> The handle is essential for retrieving the AUX_EVENT of each CPU and is >>>> required in perf mode. It has been added to the coresight_path so that >>>> dependent devices can access it from the path when needed. >>> >>> I'd still like to have the original command I used to trigger the bug in >>> the commit message. I really like having reproduction steps captured in >>> commit messages when I look back at commits in the future. So, that was: >>> >>> perf record -e cs_etm//k -C 0-9 dd if=/dev/zero of=/dev/null >>> >> >> Sure, I’ll include your commit message in the formal patch series, I >> think it's V3 since you have submitted two versions, if you're okay with >> me sending it out. >> >>>> /** >>>> * struct coresight_path - data needed by enable/disable path >>>> - * @path_list: path from source to sink. >>>> - * @trace_id: trace_id of the whole path. >>>> + * @path_list: path from source to sink. >>>> + * @trace_id: trace_id of the whole path. >>>> + * struct perf_output_handle: handle of the aux_event. >>>> */ >>> >>> Fixing to "@handle" was mentioned in another comment already. >>> >>> Something about the above still feels a little off to me. It feels like >>> we're throwing new data into a structure just because it happens to be >>> conveniently at hand for the code paths we're needing, and not because >>> it really _belongs_ there. >>> >> > This data is perf specific - not path generic; so I agree that this > structure should go elsewhere. > > I would suggest in the csdev (coresight_device) structure itself. We > already have some sink specific data in here e.g. perf_sink_id_map. > > This could then be set/clear in the functions coresight-etm-perf.c > file, where there is a significant amount of code dealing with the > perf handle and ensuring it is valid and in scope. > > This can then be set only when appropriate - for source / sink devices > and only when in perf mode, and avoid the need to pass the handle > around as API call parameters. I think this data is specific to the session we are enabling the device(s) in. e.g., we keep the trace-id in the path. So, I don't mind having this in the path structure. Instead of modifying csdev with additional locking from "etm-perf" it is always cleaner to handle this in the path. Suzuki > > Regards > > Mike. > > > > >> The core idea behind coresight_path is that it can hold all the data >> potentially needed by any device along the path. >> >> For example with the path ETM->Link->ETR->CATU: >> >> All the mentioned devices operate by forming a path, for which the >> system constructs a coresight_path. This 'path' is then passed to each >> device along the route, allowing any device to directly access the >> required data from coresight_path instead of receiving it as a separate >> argument. >> >> Imagine a device that requires more than two or three arguments, and you >> want to pass them through coresight_enable_path or similar functions... >> >> For certain coresight_path instances, we may not need the handle or >> other parameters. Since these values are initialized, it's acceptable to >> leave them as NULL or 0. >> >> >>> Or, maybe it's the right place for it, and the cause of my concern is >>> that "path" is an overly-narrow name in struct coresight_path? >>> >> >> It defines the direction of data flow—serving as the path for trace data. >> >> Thanks, >> Jie >> >>> But if a renaming of this structure would improve the code, I'd also be >>> fine with that happening in a subsequent commit, so I won't try to hold >>> up the current series based on that. >>> >>> -Carl >> > > > -- > Mike Leach > Principal Engineer, ARM Ltd. > Manchester Design Centre. UK
On Mon, Sep 22, 2025 at 03:31:39PM +0800, Jie Gan wrote:
> From: Carl Worth <carl@os.amperecomputing.com>
>
> The handle is essential for retrieving the AUX_EVENT of each CPU and is
> required in perf mode. It has been added to the coresight_path so that
> dependent devices can access it from the path when needed.
>
> Fixes: 080ee83cc361 ("Coresight: Change functions to accept the coresight_path")
> Signed-off-by: Carl Worth <carl@os.amperecomputing.com>
> Co-developed-by: Jie Gan <jie.gan@oss.qualcomm.com>
> Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
> ---
> drivers/hwtracing/coresight/coresight-etm-perf.c | 1 +
> drivers/hwtracing/coresight/coresight-tmc-etr.c | 3 ++-
> include/linux/coresight.h | 10 ++++++----
> 3 files changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c
> index f677c08233ba..5c256af6e54a 100644
> --- a/drivers/hwtracing/coresight/coresight-etm-perf.c
> +++ b/drivers/hwtracing/coresight/coresight-etm-perf.c
> @@ -520,6 +520,7 @@ static void etm_event_start(struct perf_event *event, int flags)
> goto out;
>
> path = etm_event_cpu_path(event_data, cpu);
> + path->handle = handle;
> /* We need a sink, no need to continue without one */
> sink = coresight_get_sink(path);
> if (WARN_ON_ONCE(!sink))
> diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> index b07fcdb3fe1a..1040f73f0537 100644
> --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
> +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> @@ -1327,7 +1327,8 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
> struct etr_buf *tmc_etr_get_buffer(struct coresight_device *csdev,
> enum cs_mode mode, void *data)
> {
> - struct perf_output_handle *handle = data;
> + struct coresight_path *path = data;
> + struct perf_output_handle *handle = path->handle;
> struct etr_perf_buffer *etr_perf;
>
> switch (mode) {
> diff --git a/include/linux/coresight.h b/include/linux/coresight.h
> index 6de59ce8ef8c..4591121ae1d4 100644
> --- a/include/linux/coresight.h
> +++ b/include/linux/coresight.h
> @@ -332,12 +332,14 @@ static struct coresight_dev_list (var) = { \
>
> /**
> * struct coresight_path - data needed by enable/disable path
> - * @path_list: path from source to sink.
> - * @trace_id: trace_id of the whole path.
> + * @path_list: path from source to sink.
> + * @trace_id: trace_id of the whole path.
> + * struct perf_output_handle: handle of the aux_event.
s/struct perf_output_handle/@handle/
Otherwise, LGTM:
Reviewed-by: Leo Yan <leo.yan@arm.com>
> */
> struct coresight_path {
> - struct list_head path_list;
> - u8 trace_id;
> + struct list_head path_list;
> + u8 trace_id;
> + struct perf_output_handle *handle;
> };
>
> enum cs_mode {
>
> --
> 2.34.1
>
>
On 9/22/2025 4:29 PM, Leo Yan wrote:
> On Mon, Sep 22, 2025 at 03:31:39PM +0800, Jie Gan wrote:
>> From: Carl Worth <carl@os.amperecomputing.com>
>>
>> The handle is essential for retrieving the AUX_EVENT of each CPU and is
>> required in perf mode. It has been added to the coresight_path so that
>> dependent devices can access it from the path when needed.
>>
>> Fixes: 080ee83cc361 ("Coresight: Change functions to accept the coresight_path")
>> Signed-off-by: Carl Worth <carl@os.amperecomputing.com>
>> Co-developed-by: Jie Gan <jie.gan@oss.qualcomm.com>
>> Signed-off-by: Jie Gan <jie.gan@oss.qualcomm.com>
>> ---
>> drivers/hwtracing/coresight/coresight-etm-perf.c | 1 +
>> drivers/hwtracing/coresight/coresight-tmc-etr.c | 3 ++-
>> include/linux/coresight.h | 10 ++++++----
>> 3 files changed, 9 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c
>> index f677c08233ba..5c256af6e54a 100644
>> --- a/drivers/hwtracing/coresight/coresight-etm-perf.c
>> +++ b/drivers/hwtracing/coresight/coresight-etm-perf.c
>> @@ -520,6 +520,7 @@ static void etm_event_start(struct perf_event *event, int flags)
>> goto out;
>>
>> path = etm_event_cpu_path(event_data, cpu);
>> + path->handle = handle;
>> /* We need a sink, no need to continue without one */
>> sink = coresight_get_sink(path);
>> if (WARN_ON_ONCE(!sink))
>> diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
>> index b07fcdb3fe1a..1040f73f0537 100644
>> --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
>> +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
>> @@ -1327,7 +1327,8 @@ static int tmc_enable_etr_sink_sysfs(struct coresight_device *csdev)
>> struct etr_buf *tmc_etr_get_buffer(struct coresight_device *csdev,
>> enum cs_mode mode, void *data)
>> {
>> - struct perf_output_handle *handle = data;
>> + struct coresight_path *path = data;
>> + struct perf_output_handle *handle = path->handle;
>> struct etr_perf_buffer *etr_perf;
>>
>> switch (mode) {
>> diff --git a/include/linux/coresight.h b/include/linux/coresight.h
>> index 6de59ce8ef8c..4591121ae1d4 100644
>> --- a/include/linux/coresight.h
>> +++ b/include/linux/coresight.h
>> @@ -332,12 +332,14 @@ static struct coresight_dev_list (var) = { \
>>
>> /**
>> * struct coresight_path - data needed by enable/disable path
>> - * @path_list: path from source to sink.
>> - * @trace_id: trace_id of the whole path.
>> + * @path_list: path from source to sink.
>> + * @trace_id: trace_id of the whole path.
>> + * struct perf_output_handle: handle of the aux_event.
>
> s/struct perf_output_handle/@handle/
Hi Leo,
Thanks for pointing out. I actually missed this error during the code
review...
Jie
>
> Otherwise, LGTM:
>
> Reviewed-by: Leo Yan <leo.yan@arm.com>
>
>> */
>> struct coresight_path {
>> - struct list_head path_list;
>> - u8 trace_id;
>> + struct list_head path_list;
>> + u8 trace_id;
>> + struct perf_output_handle *handle;
>> };
>>
>> enum cs_mode {
>>
>> --
>> 2.34.1
>>
>>
© 2016 - 2026 Red Hat, Inc.