* [PATCH v5 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores
2024-11-08 20:29 [PATCH v5 0/2] [PATCH v4 0/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen
@ 2024-11-08 20:29 ` Ilkka Koskinen
2024-11-11 12:55 ` Leo Yan
2024-11-08 20:29 ` [PATCH v5 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen
2024-11-13 10:42 ` [PATCH v5 0/2] [PATCH v4 0/2] " James Clark
2 siblings, 1 reply; 5+ messages in thread
From: Ilkka Koskinen @ 2024-11-08 20:29 UTC (permalink / raw)
To: John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward
Cc: Ilkka Koskinen, linux-arm-kernel, linux-perf-users, linux-kernel
Split Data Source Packet handling to prepare adding support for
other implementations.
Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
---
tools/perf/util/arm-spe.c | 42 ++++++++++++++++++++++++++++-----------
1 file changed, 30 insertions(+), 12 deletions(-)
diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c
index dbf13f47879c..3064c3f22806 100644
--- a/tools/perf/util/arm-spe.c
+++ b/tools/perf/util/arm-spe.c
@@ -103,6 +103,18 @@ struct arm_spe_queue {
u32 flags;
};
+struct data_source_handle {
+ const struct midr_range *midr_ranges;
+ void (*ds_synth)(const struct arm_spe_record *record,
+ union perf_mem_data_src *data_src);
+};
+
+#define DS(range, func) \
+ { \
+ .midr_ranges = range, \
+ .ds_synth = arm_spe__synth_##func, \
+ }
+
static void arm_spe_dump(struct arm_spe *spe __maybe_unused,
unsigned char *buf, size_t len)
{
@@ -532,6 +544,10 @@ static void arm_spe__synth_data_source_common(const struct arm_spe_record *recor
}
}
+static const struct data_source_handle data_source_handles[] = {
+ DS(common_ds_encoding_cpus, data_source_common),
+};
+
static void arm_spe__synth_memory_level(const struct arm_spe_record *record,
union perf_mem_data_src *data_src)
{
@@ -555,12 +571,14 @@ static void arm_spe__synth_memory_level(const struct arm_spe_record *record,
data_src->mem_lvl |= PERF_MEM_LVL_REM_CCE1;
}
-static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq)
+static bool arm_spe__synth_ds(struct arm_spe_queue *speq,
+ const struct arm_spe_record *record,
+ union perf_mem_data_src *data_src)
{
struct arm_spe *spe = speq->spe;
- bool is_in_cpu_list;
u64 *metadata = NULL;
- u64 midr = 0;
+ u64 midr;
+ unsigned int i;
/* Metadata version 1 assumes all CPUs are the same (old behavior) */
if (spe->metadata_ver == 1) {
@@ -592,18 +610,20 @@ static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq)
midr = metadata[ARM_SPE_CPU_MIDR];
}
- is_in_cpu_list = is_midr_in_range_list(midr, common_ds_encoding_cpus);
- if (is_in_cpu_list)
- return true;
- else
- return false;
+ for (i = 0; i < ARRAY_SIZE(data_source_handles); i++) {
+ if (is_midr_in_range_list(midr, data_source_handles[i].midr_ranges)) {
+ data_source_handles[i].ds_synth(record, data_src);
+ return true;
+ }
+ }
+
+ return false;
}
static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq,
const struct arm_spe_record *record)
{
union perf_mem_data_src data_src = { .mem_op = PERF_MEM_OP_NA };
- bool is_common = arm_spe__is_common_ds_encoding(speq);
if (record->op & ARM_SPE_OP_LD)
data_src.mem_op = PERF_MEM_OP_LOAD;
@@ -612,9 +632,7 @@ static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq,
else
return 0;
- if (is_common)
- arm_spe__synth_data_source_common(record, &data_src);
- else
+ if (!arm_spe__synth_ds(speq, record, &data_src))
arm_spe__synth_memory_level(record, &data_src);
if (record->type & (ARM_SPE_TLB_ACCESS | ARM_SPE_TLB_MISS)) {
--
2.47.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v5 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores
2024-11-08 20:29 ` [PATCH v5 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores Ilkka Koskinen
@ 2024-11-11 12:55 ` Leo Yan
0 siblings, 0 replies; 5+ messages in thread
From: Leo Yan @ 2024-11-11 12:55 UTC (permalink / raw)
To: Ilkka Koskinen
Cc: John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward,
linux-arm-kernel, linux-perf-users, linux-kernel
On Fri, Nov 08, 2024 at 08:29:45PM +0000, Ilkka Koskinen wrote:
>
> Split Data Source Packet handling to prepare adding support for
> other implementations.
>
> Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
Reviewed-by: Leo Yan <leo.yan@arm.com>
> ---
> tools/perf/util/arm-spe.c | 42 ++++++++++++++++++++++++++++-----------
> 1 file changed, 30 insertions(+), 12 deletions(-)
>
> diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c
> index dbf13f47879c..3064c3f22806 100644
> --- a/tools/perf/util/arm-spe.c
> +++ b/tools/perf/util/arm-spe.c
> @@ -103,6 +103,18 @@ struct arm_spe_queue {
> u32 flags;
> };
>
> +struct data_source_handle {
> + const struct midr_range *midr_ranges;
> + void (*ds_synth)(const struct arm_spe_record *record,
> + union perf_mem_data_src *data_src);
> +};
> +
> +#define DS(range, func) \
> + { \
> + .midr_ranges = range, \
> + .ds_synth = arm_spe__synth_##func, \
> + }
> +
> static void arm_spe_dump(struct arm_spe *spe __maybe_unused,
> unsigned char *buf, size_t len)
> {
> @@ -532,6 +544,10 @@ static void arm_spe__synth_data_source_common(const struct arm_spe_record *recor
> }
> }
>
> +static const struct data_source_handle data_source_handles[] = {
> + DS(common_ds_encoding_cpus, data_source_common),
> +};
> +
> static void arm_spe__synth_memory_level(const struct arm_spe_record *record,
> union perf_mem_data_src *data_src)
> {
> @@ -555,12 +571,14 @@ static void arm_spe__synth_memory_level(const struct arm_spe_record *record,
> data_src->mem_lvl |= PERF_MEM_LVL_REM_CCE1;
> }
>
> -static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq)
> +static bool arm_spe__synth_ds(struct arm_spe_queue *speq,
> + const struct arm_spe_record *record,
> + union perf_mem_data_src *data_src)
> {
> struct arm_spe *spe = speq->spe;
> - bool is_in_cpu_list;
> u64 *metadata = NULL;
> - u64 midr = 0;
> + u64 midr;
> + unsigned int i;
>
> /* Metadata version 1 assumes all CPUs are the same (old behavior) */
> if (spe->metadata_ver == 1) {
> @@ -592,18 +610,20 @@ static bool arm_spe__is_common_ds_encoding(struct arm_spe_queue *speq)
> midr = metadata[ARM_SPE_CPU_MIDR];
> }
>
> - is_in_cpu_list = is_midr_in_range_list(midr, common_ds_encoding_cpus);
> - if (is_in_cpu_list)
> - return true;
> - else
> - return false;
> + for (i = 0; i < ARRAY_SIZE(data_source_handles); i++) {
> + if (is_midr_in_range_list(midr, data_source_handles[i].midr_ranges)) {
> + data_source_handles[i].ds_synth(record, data_src);
> + return true;
> + }
> + }
> +
> + return false;
> }
>
> static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq,
> const struct arm_spe_record *record)
> {
> union perf_mem_data_src data_src = { .mem_op = PERF_MEM_OP_NA };
> - bool is_common = arm_spe__is_common_ds_encoding(speq);
>
> if (record->op & ARM_SPE_OP_LD)
> data_src.mem_op = PERF_MEM_OP_LOAD;
> @@ -612,9 +632,7 @@ static u64 arm_spe__synth_data_source(struct arm_spe_queue *speq,
> else
> return 0;
>
> - if (is_common)
> - arm_spe__synth_data_source_common(record, &data_src);
> - else
> + if (!arm_spe__synth_ds(speq, record, &data_src))
> arm_spe__synth_memory_level(record, &data_src);
>
> if (record->type & (ARM_SPE_TLB_ACCESS | ARM_SPE_TLB_MISS)) {
> --
> 2.47.0
>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v5 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne
2024-11-08 20:29 [PATCH v5 0/2] [PATCH v4 0/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen
2024-11-08 20:29 ` [PATCH v5 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores Ilkka Koskinen
@ 2024-11-08 20:29 ` Ilkka Koskinen
2024-11-13 10:42 ` [PATCH v5 0/2] [PATCH v4 0/2] " James Clark
2 siblings, 0 replies; 5+ messages in thread
From: Ilkka Koskinen @ 2024-11-08 20:29 UTC (permalink / raw)
To: John Garry, Will Deacon, James Clark, Mike Leach, Leo Yan,
Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
Namhyung Kim, Mark Rutland, Alexander Shishkin, Jiri Olsa,
Ian Rogers, Adrian Hunter, Liang, Kan, Graham Woodward
Cc: Ilkka Koskinen, linux-arm-kernel, linux-perf-users, linux-kernel
Decode SPE Data Source packets on AmpereOne. The field is IMPDEF.
Signed-off-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
Reviewed-by: Leo Yan <leo.yan@arm.com>
---
.../util/arm-spe-decoder/arm-spe-decoder.h | 9 ++++
tools/perf/util/arm-spe.c | 44 +++++++++++++++++++
2 files changed, 53 insertions(+)
diff --git a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h
index 358c611eeddb..4bcd627e859f 100644
--- a/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h
+++ b/tools/perf/util/arm-spe-decoder/arm-spe-decoder.h
@@ -67,6 +67,15 @@ enum arm_spe_common_data_source {
ARM_SPE_COMMON_DS_DRAM = 0xe,
};
+enum arm_spe_ampereone_data_source {
+ ARM_SPE_AMPEREONE_LOCAL_CHIP_CACHE_OR_DEVICE = 0x0,
+ ARM_SPE_AMPEREONE_SLC = 0x3,
+ ARM_SPE_AMPEREONE_REMOTE_CHIP_CACHE = 0x5,
+ ARM_SPE_AMPEREONE_DDR = 0x7,
+ ARM_SPE_AMPEREONE_L1D = 0x8,
+ ARM_SPE_AMPEREONE_L2D = 0x9,
+};
+
struct arm_spe_record {
enum arm_spe_sample_type type;
int err;
diff --git a/tools/perf/util/arm-spe.c b/tools/perf/util/arm-spe.c
index 3064c3f22806..12761c39788f 100644
--- a/tools/perf/util/arm-spe.c
+++ b/tools/perf/util/arm-spe.c
@@ -455,6 +455,11 @@ static const struct midr_range common_ds_encoding_cpus[] = {
{},
};
+static const struct midr_range ampereone_ds_encoding_cpus[] = {
+ MIDR_ALL_VERSIONS(MIDR_AMPERE1A),
+ {},
+};
+
static void arm_spe__sample_flags(struct arm_spe_queue *speq)
{
const struct arm_spe_record *record = &speq->decoder->record;
@@ -544,8 +549,47 @@ static void arm_spe__synth_data_source_common(const struct arm_spe_record *recor
}
}
+/*
+ * Source is IMPDEF. Here we convert the source code used on AmpereOne cores
+ * to the common (Neoverse, Cortex) to avoid duplicating the decoding code.
+ */
+static void arm_spe__synth_data_source_ampereone(const struct arm_spe_record *record,
+ union perf_mem_data_src *data_src)
+{
+ struct arm_spe_record common_record;
+
+ switch (record->source) {
+ case ARM_SPE_AMPEREONE_LOCAL_CHIP_CACHE_OR_DEVICE:
+ common_record.source = ARM_SPE_COMMON_DS_PEER_CORE;
+ break;
+ case ARM_SPE_AMPEREONE_SLC:
+ common_record.source = ARM_SPE_COMMON_DS_SYS_CACHE;
+ break;
+ case ARM_SPE_AMPEREONE_REMOTE_CHIP_CACHE:
+ common_record.source = ARM_SPE_COMMON_DS_REMOTE;
+ break;
+ case ARM_SPE_AMPEREONE_DDR:
+ common_record.source = ARM_SPE_COMMON_DS_DRAM;
+ break;
+ case ARM_SPE_AMPEREONE_L1D:
+ common_record.source = ARM_SPE_COMMON_DS_L1D;
+ break;
+ case ARM_SPE_AMPEREONE_L2D:
+ common_record.source = ARM_SPE_COMMON_DS_L2;
+ break;
+ default:
+ pr_warning_once("AmpereOne: Unknown data source (0x%x)\n",
+ record->source);
+ return;
+ }
+
+ common_record.op = record->op;
+ arm_spe__synth_data_source_common(&common_record, data_src);
+}
+
static const struct data_source_handle data_source_handles[] = {
DS(common_ds_encoding_cpus, data_source_common),
+ DS(ampereone_ds_encoding_cpus, data_source_ampereone),
};
static void arm_spe__synth_memory_level(const struct arm_spe_record *record,
--
2.47.0
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH v5 0/2] [PATCH v4 0/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne
2024-11-08 20:29 [PATCH v5 0/2] [PATCH v4 0/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen
2024-11-08 20:29 ` [PATCH v5 1/2] perf arm-spe: Prepare for adding data source packet implementations for other cores Ilkka Koskinen
2024-11-08 20:29 ` [PATCH v5 2/2] perf arm-spe: Add support for SPE Data Source packet on AmpereOne Ilkka Koskinen
@ 2024-11-13 10:42 ` James Clark
2 siblings, 0 replies; 5+ messages in thread
From: James Clark @ 2024-11-13 10:42 UTC (permalink / raw)
To: Ilkka Koskinen
Cc: linux-arm-kernel, linux-perf-users, linux-kernel, John Garry,
Will Deacon, Mike Leach, Leo Yan, Peter Zijlstra, Ingo Molnar,
Arnaldo Carvalho de Melo, Namhyung Kim, Mark Rutland,
Alexander Shishkin, Jiri Olsa, Ian Rogers, Adrian Hunter,
Liang, Kan, Graham Woodward
On 08/11/2024 8:29 pm, Ilkka Koskinen wrote:
> v1:
> * https://lore.kernel.org/all/20241024233035.7979-1-ilkka@os.amperecomputing.com/
>
> v2:
> * Doesn't use read_cpuid_implementor() anymore as that was broken and
> unnecessary.
> * Convert AmpereOne source field to matching common source fields to
> avoid duplicating the code.
> * Rebased on top of perf-tools-next/perf-tools-next (ba993e5ada1d)
> * https://lore.kernel.org/all/20241031213533.11148-1-ilkka@os.amperecomputing.com/
>
> v3:
> * Changed source mapping to simple switch statement
> * Dropped is_xyz() stuff
> * Added table to map midr to data source decoding function
> * https://lore.kernel.org/all/20241106193740.6159-1-ilkka@os.amperecomputing.com/
>
> v4:
> * Split midr/decoding function table
> * Made AmpereOne DS decoding function to ignore unknown sources
> * https://lore.kernel.org/all/20241108010911.58412-1-ilkka@os.amperecomputing.com/
>
> v5:
> * Moved data_source_handles[] to fix the build issue
>
> Ilkka Koskinen (2):
> perf arm-spe: Prepare for adding data source packet implementations
> for other cores
> perf arm-spe: Add support for SPE Data Source packet on AmpereOne
>
> .../util/arm-spe-decoder/arm-spe-decoder.h | 9 ++
> tools/perf/util/arm-spe.c | 86 ++++++++++++++++---
> 2 files changed, 83 insertions(+), 12 deletions(-)
>
Reviewed-by: James Clark <james.clark@linaro.org>
^ permalink raw reply [flat|nested] 5+ messages in thread