summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Hunter <adrian.hunter@intel.com>2022-09-05 10:34:24 +0300
committerArnaldo Carvalho de Melo <acme@redhat.com>2022-10-04 14:55:21 +0300
commit3b7ae354c1fcb783848b46e1c1140a66ba742672 (patch)
tree84daafe4e09035b4cdf3ee2a7523e4a153c53a55
parent65aee81afe7f6a54e2fb2de59e1d6cd47dcf8eb9 (diff)
downloadlinux-3b7ae354c1fcb783848b46e1c1140a66ba742672.tar.xz
perf intel-pt: Remove first line of log dumped on error
Instead of printing "(first line may be sliced)", always remove the first line of the debug log if the buffer has wrapped when dumping on error. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Reviewed-by: Namhyung Kim <namhyung@kernel.org> Cc: Andi Kleen <ak@linux.intel.com> Cc: Ian Rogers <irogers@google.com> Cc: Jiri Olsa <jolsa@kernel.org> Link: https://lore.kernel.org/r/20220905073424.3971-7-adrian.hunter@intel.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/util/intel-pt-decoder/intel-pt-log.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-log.c b/tools/perf/util/intel-pt-decoder/intel-pt-log.c
index 24684edc49f7..ef55d6232cf0 100644
--- a/tools/perf/util/intel-pt-decoder/intel-pt-log.c
+++ b/tools/perf/util/intel-pt-decoder/intel-pt-log.c
@@ -143,16 +143,39 @@ static FILE *log_buf__open(struct log_buf *b, FILE *backend, unsigned int sz)
return file;
}
+static bool remove_first_line(const char **p, size_t *n)
+{
+ for (; *n && **p != '\n'; ++*p, --*n)
+ ;
+ if (*n) {
+ *p += 1;
+ *n -= 1;
+ return true;
+ }
+ return false;
+}
+
+static void write_lines(const char *p, size_t n, FILE *fp, bool *remove_first)
+{
+ if (*remove_first)
+ *remove_first = !remove_first_line(&p, &n);
+ fwrite(p, n, 1, fp);
+}
+
static void log_buf__dump(struct log_buf *b)
{
+ bool remove_first = false;
+
if (!b->buf)
return;
- fflush(f);
- fprintf(b->backend, "Dumping debug log buffer (first line may be sliced)\n");
- if (b->wrapped)
- fwrite(b->buf + b->head, b->buf_sz - b->head, 1, b->backend);
- fwrite(b->buf, b->head, 1, b->backend);
+ fflush(f); /* Could update b->head and b->wrapped */
+ fprintf(b->backend, "Dumping debug log buffer\n");
+ if (b->wrapped) {
+ remove_first = true;
+ write_lines(b->buf + b->head, b->buf_sz - b->head, b->backend, &remove_first);
+ }
+ write_lines(b->buf, b->head, b->backend, &remove_first);
fprintf(b->backend, "End of debug log buffer dump\n");
b->head = 0;