Home Home > GIT Browse > stable
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2019-08-16 22:01:45 +0200
committerJiri Slaby <jslaby@suse.cz>2019-08-16 22:25:10 +0200
commit1d051f575f2f0c4d120afbe3b8134f97dbd49424 (patch)
treeff1142f74e11e481d4ea325f48f95280acf6a54f
parentada1ef75155e483e03d76c2f44ba133eb23d703c (diff)
perf session: Fix loading of compressed data split across
adjacent records (bnc#1012628).
-rw-r--r--patches.kernel.org/5.2.9-099-perf-session-Fix-loading-of-compressed-data-spl.patch137
-rw-r--r--series.conf1
2 files changed, 138 insertions, 0 deletions
diff --git a/patches.kernel.org/5.2.9-099-perf-session-Fix-loading-of-compressed-data-spl.patch b/patches.kernel.org/5.2.9-099-perf-session-Fix-loading-of-compressed-data-spl.patch
new file mode 100644
index 0000000000..7aa2518710
--- /dev/null
+++ b/patches.kernel.org/5.2.9-099-perf-session-Fix-loading-of-compressed-data-spl.patch
@@ -0,0 +1,137 @@
+From: Alexey Budankov <alexey.budankov@linux.intel.com>
+Date: Tue, 9 Jul 2019 17:48:14 +0300
+Subject: [PATCH] perf session: Fix loading of compressed data split across
+ adjacent records
+References: bnc#1012628
+Patch-mainline: 5.2.9
+Git-commit: 872c8ee8f0f47222f7b10da96eea84d0486540a3
+
+[ Upstream commit 872c8ee8f0f47222f7b10da96eea84d0486540a3 ]
+
+Fix decompression failure found during the loading of compressed trace
+collected on larger scale systems (>48 cores).
+
+The error happened due to lack of decompression space for a mmaped
+buffer data chunk split across adjacent PERF_RECORD_COMPRESSED records.
+
+ $ perf report -i bt.16384.data --stats
+ failed to decompress (B): 63869 -> 0 : Destination buffer is too small
+ user stack dump failure
+ Can't parse sample, err = -14
+ 0x2637e436 [0x4080]: failed to process type: 9
+ Error:
+ failed to process sample
+
+ $ perf test 71
+ 71: Zstd perf.data compression/decompression : Ok
+
+Signed-off-by: Alexey Budankov <alexey.budankov@linux.intel.com>
+Acked-by: Jiri Olsa <jolsa@kernel.org>
+Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
+Cc: Andi Kleen <ak@linux.intel.com>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Link: http://lkml.kernel.org/r/4d839e1b-9c48-89c4-9702-a12217420611@linux.intel.com
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+Signed-off-by: Jiri Slaby <jslaby@suse.cz>
+---
+ tools/perf/util/session.c | 22 ++++++++++++++--------
+ tools/perf/util/session.h | 1 +
+ tools/perf/util/zstd.c | 4 ++--
+ 3 files changed, 17 insertions(+), 10 deletions(-)
+
+diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c
+index 2e61dd6a3574..d78984096044 100644
+--- a/tools/perf/util/session.c
++++ b/tools/perf/util/session.c
+@@ -36,10 +36,16 @@ static int perf_session__process_compressed_event(struct perf_session *session,
+ void *src;
+ size_t decomp_size, src_size;
+ u64 decomp_last_rem = 0;
+- size_t decomp_len = session->header.env.comp_mmap_len;
++ size_t mmap_len, decomp_len = session->header.env.comp_mmap_len;
+ struct decomp *decomp, *decomp_last = session->decomp_last;
+
+- decomp = mmap(NULL, sizeof(struct decomp) + decomp_len, PROT_READ|PROT_WRITE,
++ if (decomp_last) {
++ decomp_last_rem = decomp_last->size - decomp_last->head;
++ decomp_len += decomp_last_rem;
++ }
++
++ mmap_len = sizeof(struct decomp) + decomp_len;
++ decomp = mmap(NULL, mmap_len, PROT_READ|PROT_WRITE,
+ MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
+ if (decomp == MAP_FAILED) {
+ pr_err("Couldn't allocate memory for decompression\n");
+@@ -47,10 +53,10 @@ static int perf_session__process_compressed_event(struct perf_session *session,
+ }
+
+ decomp->file_pos = file_offset;
++ decomp->mmap_len = mmap_len;
+ decomp->head = 0;
+
+- if (decomp_last) {
+- decomp_last_rem = decomp_last->size - decomp_last->head;
++ if (decomp_last_rem) {
+ memcpy(decomp->data, &(decomp_last->data[decomp_last->head]), decomp_last_rem);
+ decomp->size = decomp_last_rem;
+ }
+@@ -61,7 +67,7 @@ static int perf_session__process_compressed_event(struct perf_session *session,
+ decomp_size = zstd_decompress_stream(&(session->zstd_data), src, src_size,
+ &(decomp->data[decomp_last_rem]), decomp_len - decomp_last_rem);
+ if (!decomp_size) {
+- munmap(decomp, sizeof(struct decomp) + decomp_len);
++ munmap(decomp, mmap_len);
+ pr_err("Couldn't decompress data\n");
+ return -1;
+ }
+@@ -255,15 +261,15 @@ static void perf_session__delete_threads(struct perf_session *session)
+ static void perf_session__release_decomp_events(struct perf_session *session)
+ {
+ struct decomp *next, *decomp;
+- size_t decomp_len;
++ size_t mmap_len;
+ next = session->decomp;
+- decomp_len = session->header.env.comp_mmap_len;
+ do {
+ decomp = next;
+ if (decomp == NULL)
+ break;
+ next = decomp->next;
+- munmap(decomp, decomp_len + sizeof(struct decomp));
++ mmap_len = decomp->mmap_len;
++ munmap(decomp, mmap_len);
+ } while (1);
+ }
+
+diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h
+index dd8920b745bc..863dbad87849 100644
+--- a/tools/perf/util/session.h
++++ b/tools/perf/util/session.h
+@@ -46,6 +46,7 @@ struct perf_session {
+ struct decomp {
+ struct decomp *next;
+ u64 file_pos;
++ size_t mmap_len;
+ u64 head;
+ size_t size;
+ char data[];
+diff --git a/tools/perf/util/zstd.c b/tools/perf/util/zstd.c
+index 23bdb9884576..d2202392ffdb 100644
+--- a/tools/perf/util/zstd.c
++++ b/tools/perf/util/zstd.c
+@@ -99,8 +99,8 @@ size_t zstd_decompress_stream(struct zstd_data *data, void *src, size_t src_size
+ while (input.pos < input.size) {
+ ret = ZSTD_decompressStream(data->dstream, &output, &input);
+ if (ZSTD_isError(ret)) {
+- pr_err("failed to decompress (B): %ld -> %ld : %s\n",
+- src_size, output.size, ZSTD_getErrorName(ret));
++ pr_err("failed to decompress (B): %ld -> %ld, dst_size %ld : %s\n",
++ src_size, output.size, dst_size, ZSTD_getErrorName(ret));
+ break;
+ }
+ output.dst = dst + output.pos;
+--
+2.22.0
+
diff --git a/series.conf b/series.conf
index 7b3a9cce27..7976f5b16c 100644
--- a/series.conf
+++ b/series.conf
@@ -1119,6 +1119,7 @@
patches.kernel.org/5.2.9-096-perf-script-Fix-off-by-one-in-brstackinsn-IPC-c.patch
patches.kernel.org/5.2.9-097-perf-tools-Fix-proper-buffer-size-for-feature-p.patch
patches.kernel.org/5.2.9-098-perf-stat-Fix-segfault-for-event-group-in-repea.patch
+ patches.kernel.org/5.2.9-099-perf-session-Fix-loading-of-compressed-data-spl.patch
########################################################
# Build fixes that apply to the vanilla kernel too.