From a659f325e391424b424ec12a70951487aeb008c9 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 27 Dec 2020 12:42:30 +0100 Subject: [PATCH] 4.19-stable patches added patches: perf-cs-etm-change-tuple-from-traceid-cpu-to-traceid-metadata.patch perf-cs-etm-move-definition-of-traceid_list-global-variable-from-header-file.patch --- ...from-traceid-cpu-to-traceid-metadata.patch | 164 ++++++++++++++++++ ...ist-global-variable-from-header-file.patch | 64 +++++++ queue-4.19/series | 2 + 3 files changed, 230 insertions(+) create mode 100644 queue-4.19/perf-cs-etm-change-tuple-from-traceid-cpu-to-traceid-metadata.patch create mode 100644 queue-4.19/perf-cs-etm-move-definition-of-traceid_list-global-variable-from-header-file.patch diff --git a/queue-4.19/perf-cs-etm-change-tuple-from-traceid-cpu-to-traceid-metadata.patch b/queue-4.19/perf-cs-etm-change-tuple-from-traceid-cpu-to-traceid-metadata.patch new file mode 100644 index 00000000000..61805c05163 --- /dev/null +++ b/queue-4.19/perf-cs-etm-change-tuple-from-traceid-cpu-to-traceid-metadata.patch @@ -0,0 +1,164 @@ +From 95c6fe970a0160cb770c5dce9f80311b42d030c0 Mon Sep 17 00:00:00 2001 +From: Leo Yan +Date: Tue, 29 Jan 2019 20:28:39 +0800 +Subject: perf cs-etm: Change tuple from traceID-CPU# to traceID-metadata + +From: Leo Yan + +commit 95c6fe970a0160cb770c5dce9f80311b42d030c0 upstream. + +If packet processing wants to know the packet is bound with which ETM +version, it needs to access metadata to decide that based on metadata +magic number; but we cannot simply to use CPU logic ID number as index +to access metadata sequential array, especially when system have +hotplugged off CPUs, the metadata array are only allocated for online +CPUs but not offline CPUs, so the CPU logic number doesn't match with +its index in the array. + +This patch is to change tuple from traceID-CPU# to traceID-metadata, +thus it can use the tuple to retrieve metadata pointer according to +traceID. + +For safe accessing metadata fields, this patch provides helper function +cs_etm__get_cpu() which is used to return CPU number according to +traceID; cs_etm_decoder__buffer_packet() is the first consumer for this +helper function. + +Signed-off-by: Leo Yan +Reviewed-by: Mathieu Poirier +Cc: Alexander Shishkin +Cc: Jiri Olsa +Cc: Mike Leach +Cc: Namhyung Kim +Cc: Robert Walker +Cc: Suzuki K Poulouse +Cc: coresight ml +Cc: linux-arm-kernel@lists.infradead.org +Link: http://lkml.kernel.org/r/20190129122842.32041-6-leo.yan@linaro.org +Signed-off-by: Arnaldo Carvalho de Melo +[Salvatore Bonaccorso: Adjust for context changes in +tools/perf/util/cs-etm-decoder/cs-etm-decoder.c] +Signed-off-by: Salvatore Bonaccorso +Signed-off-by: Greg Kroah-Hartman +--- + tools/perf/util/cs-etm-decoder/cs-etm-decoder.c | 8 ++----- + tools/perf/util/cs-etm.c | 26 ++++++++++++++++++------ + tools/perf/util/cs-etm.h | 9 +++++++- + 3 files changed, 31 insertions(+), 12 deletions(-) + +--- a/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c ++++ b/tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +@@ -278,14 +278,12 @@ cs_etm_decoder__buffer_packet(struct cs_ + enum cs_etm_sample_type sample_type) + { + u32 et = 0; +- struct int_node *inode = NULL; ++ int cpu; + + if (decoder->packet_count >= MAX_BUFFER - 1) + return OCSD_RESP_FATAL_SYS_ERR; + +- /* Search the RB tree for the cpu associated with this traceID */ +- inode = intlist__find(traceid_list, trace_chan_id); +- if (!inode) ++ if (cs_etm__get_cpu(trace_chan_id, &cpu) < 0) + return OCSD_RESP_FATAL_SYS_ERR; + + et = decoder->tail; +@@ -296,7 +294,7 @@ cs_etm_decoder__buffer_packet(struct cs_ + decoder->packet_buffer[et].sample_type = sample_type; + decoder->packet_buffer[et].exc = false; + decoder->packet_buffer[et].exc_ret = false; +- decoder->packet_buffer[et].cpu = *((int *)inode->priv); ++ decoder->packet_buffer[et].cpu = cpu; + decoder->packet_buffer[et].start_addr = CS_ETM_INVAL_ADDR; + decoder->packet_buffer[et].end_addr = CS_ETM_INVAL_ADDR; + +--- a/tools/perf/util/cs-etm.c ++++ b/tools/perf/util/cs-etm.c +@@ -91,6 +91,20 @@ static int cs_etm__update_queues(struct + static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, + pid_t tid, u64 time_); + ++int cs_etm__get_cpu(u8 trace_chan_id, int *cpu) ++{ ++ struct int_node *inode; ++ u64 *metadata; ++ ++ inode = intlist__find(traceid_list, trace_chan_id); ++ if (!inode) ++ return -EINVAL; ++ ++ metadata = inode->priv; ++ *cpu = (int)metadata[CS_ETM_CPU]; ++ return 0; ++} ++ + static void cs_etm__packet_dump(const char *pkt_string) + { + const char *color = PERF_COLOR_BLUE; +@@ -230,7 +244,7 @@ static void cs_etm__free(struct perf_ses + cs_etm__free_events(session); + session->auxtrace = NULL; + +- /* First remove all traceID/CPU# nodes for the RB tree */ ++ /* First remove all traceID/metadata nodes for the RB tree */ + intlist__for_each_entry_safe(inode, tmp, traceid_list) + intlist__remove(traceid_list, inode); + /* Then the RB tree itself */ +@@ -1316,9 +1330,9 @@ int cs_etm__process_auxtrace_info(union + 0xffffffff); + + /* +- * Create an RB tree for traceID-CPU# tuple. Since the conversion has +- * to be made for each packet that gets decoded, optimizing access in +- * anything other than a sequential array is worth doing. ++ * Create an RB tree for traceID-metadata tuple. Since the conversion ++ * has to be made for each packet that gets decoded, optimizing access ++ * in anything other than a sequential array is worth doing. + */ + traceid_list = intlist__new(NULL); + if (!traceid_list) { +@@ -1384,8 +1398,8 @@ int cs_etm__process_auxtrace_info(union + err = -EINVAL; + goto err_free_metadata; + } +- /* All good, associate the traceID with the CPU# */ +- inode->priv = &metadata[j][CS_ETM_CPU]; ++ /* All good, associate the traceID with the metadata pointer */ ++ inode->priv = metadata[j]; + } + + /* +--- a/tools/perf/util/cs-etm.h ++++ b/tools/perf/util/cs-etm.h +@@ -53,7 +53,7 @@ enum { + CS_ETMV4_PRIV_MAX, + }; + +-/* RB tree for quick conversion between traceID and CPUs */ ++/* RB tree for quick conversion between traceID and metadata pointers */ + struct intlist *traceid_list; + + #define KiB(x) ((x) * 1024) +@@ -69,6 +69,7 @@ static const u64 __perf_cs_etmv4_magic + #ifdef HAVE_CSTRACE_SUPPORT + int cs_etm__process_auxtrace_info(union perf_event *event, + struct perf_session *session); ++int cs_etm__get_cpu(u8 trace_chan_id, int *cpu); + #else + static inline int + cs_etm__process_auxtrace_info(union perf_event *event __maybe_unused, +@@ -76,6 +77,12 @@ cs_etm__process_auxtrace_info(union perf + { + return -1; + } ++ ++static inline int cs_etm__get_cpu(u8 trace_chan_id __maybe_unused, ++ int *cpu __maybe_unused) ++{ ++ return -1; ++} + #endif + + #endif diff --git a/queue-4.19/perf-cs-etm-move-definition-of-traceid_list-global-variable-from-header-file.patch b/queue-4.19/perf-cs-etm-move-definition-of-traceid_list-global-variable-from-header-file.patch new file mode 100644 index 00000000000..3b9a1ad6039 --- /dev/null +++ b/queue-4.19/perf-cs-etm-move-definition-of-traceid_list-global-variable-from-header-file.patch @@ -0,0 +1,64 @@ +From 168200b6d6ea0cb5765943ec5da5b8149701f36a Mon Sep 17 00:00:00 2001 +From: Leo Yan +Date: Tue, 5 May 2020 21:36:42 +0800 +Subject: perf cs-etm: Move definition of 'traceid_list' global variable from header file + +From: Leo Yan + +commit 168200b6d6ea0cb5765943ec5da5b8149701f36a upstream. + +The variable 'traceid_list' is defined in the header file cs-etm.h, +if multiple C files include cs-etm.h the compiler might complaint for +multiple definition of 'traceid_list'. + +To fix multiple definition error, move the definition of 'traceid_list' +into cs-etm.c. + +Fixes: cd8bfd8c973e ("perf tools: Add processing of coresight metadata") +Reported-by: Thomas Backlund +Signed-off-by: Leo Yan +Reviewed-by: Mathieu Poirier +Reviewed-by: Mike Leach +Tested-by: Mike Leach +Tested-by: Thomas Backlund +Cc: Alexander Shishkin +Cc: Jiri Olsa +Cc: Mark Rutland +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Suzuki Poulouse +Cc: Tor Jeremiassen +Cc: linux-arm-kernel@lists.infradead.org +Link: http://lore.kernel.org/lkml/20200505133642.4756-1-leo.yan@linaro.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Salvatore Bonaccorso +Signed-off-by: Greg Kroah-Hartman +--- + tools/perf/util/cs-etm.c | 3 +++ + tools/perf/util/cs-etm.h | 3 --- + 2 files changed, 3 insertions(+), 3 deletions(-) + +--- a/tools/perf/util/cs-etm.c ++++ b/tools/perf/util/cs-etm.c +@@ -87,6 +87,9 @@ struct cs_etm_queue { + struct cs_etm_packet *packet; + }; + ++/* RB tree for quick conversion between traceID and metadata pointers */ ++static struct intlist *traceid_list; ++ + static int cs_etm__update_queues(struct cs_etm_auxtrace *etm); + static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm, + pid_t tid, u64 time_); +--- a/tools/perf/util/cs-etm.h ++++ b/tools/perf/util/cs-etm.h +@@ -53,9 +53,6 @@ enum { + CS_ETMV4_PRIV_MAX, + }; + +-/* RB tree for quick conversion between traceID and metadata pointers */ +-struct intlist *traceid_list; +- + #define KiB(x) ((x) * 1024) + #define MiB(x) ((x) * 1024 * 1024) + diff --git a/queue-4.19/series b/queue-4.19/series index cedae5474d8..1c63b8bedfc 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -93,3 +93,5 @@ quota-sanity-check-quota-file-headers-on-load.patch media-msi2500-assign-spi-bus-number-dynamically.patch crypto-af_alg-avoid-undefined-behavior-accessing-salg_name.patch md-fix-a-warning-caused-by-a-race-between-concurrent-md_ioctl-s.patch +perf-cs-etm-change-tuple-from-traceid-cpu-to-traceid-metadata.patch +perf-cs-etm-move-definition-of-traceid_list-global-variable-from-header-file.patch -- 2.47.3