]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.19-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 27 Dec 2020 11:42:30 +0000 (12:42 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 27 Dec 2020 11:42:30 +0000 (12:42 +0100)
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

queue-4.19/perf-cs-etm-change-tuple-from-traceid-cpu-to-traceid-metadata.patch [new file with mode: 0644]
queue-4.19/perf-cs-etm-move-definition-of-traceid_list-global-variable-from-header-file.patch [new file with mode: 0644]
queue-4.19/series

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 (file)
index 0000000..61805c0
--- /dev/null
@@ -0,0 +1,164 @@
+From 95c6fe970a0160cb770c5dce9f80311b42d030c0 Mon Sep 17 00:00:00 2001
+From: Leo Yan <leo.yan@linaro.org>
+Date: Tue, 29 Jan 2019 20:28:39 +0800
+Subject: perf cs-etm: Change tuple from traceID-CPU# to traceID-metadata
+
+From: Leo Yan <leo.yan@linaro.org>
+
+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 <leo.yan@linaro.org>
+Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Cc: Jiri Olsa <jolsa@redhat.com>
+Cc: Mike Leach <mike.leach@linaro.org>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: Robert Walker <robert.walker@arm.com>
+Cc: Suzuki K Poulouse <suzuki.poulose@arm.com>
+Cc: coresight ml <coresight@lists.linaro.org>
+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 <acme@redhat.com>
+[Salvatore Bonaccorso: Adjust for context changes in
+tools/perf/util/cs-etm-decoder/cs-etm-decoder.c]
+Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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 (file)
index 0000000..3b9a1ad
--- /dev/null
@@ -0,0 +1,64 @@
+From 168200b6d6ea0cb5765943ec5da5b8149701f36a Mon Sep 17 00:00:00 2001
+From: Leo Yan <leo.yan@linaro.org>
+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 <leo.yan@linaro.org>
+
+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 <tmb@mageia.org>
+Signed-off-by: Leo Yan <leo.yan@linaro.org>
+Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org>
+Reviewed-by: Mike Leach <mike.leach@linaro.org>
+Tested-by: Mike Leach <mike.leach@linaro.org>
+Tested-by: Thomas Backlund <tmb@mageia.org>
+Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Cc: Jiri Olsa <jolsa@redhat.com>
+Cc: Mark Rutland <mark.rutland@arm.com>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
+Cc: Tor Jeremiassen <tor@ti.com>
+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 <acme@redhat.com>
+Signed-off-by: Salvatore Bonaccorso <carnil@debian.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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)
index cedae5474d85984a5b9f84c05b7c4db5bbfbc7ac..1c63b8bedfc5576f783686a0b592565f9b505a5d 100644 (file)
@@ -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