linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] perf annotate: Fix sample events lost in stdio mode
@ 2021-03-06  8:28 Yang Jihong
  2021-03-11  8:48 ` Yang Jihong
  0 siblings, 1 reply; 10+ messages in thread
From: Yang Jihong @ 2021-03-06  8:28 UTC (permalink / raw)
  To: peterz, mingo, acme, mark.rutland, alexander.shishkin, jolsa,
	namhyung, yao.jin, gustavoars, mliska, linux-kernel
  Cc: yangjihong1, zhangjinhao2

In hist__find_annotations function, since have a hist_entry per IP for the same
symbol, we free notes->src to signal already processed this symbol in stdio mode;
when annotate, entry will skipped if notes->src is NULL to avoid repeated output.

However, there is a problem, for example, run the following command:

 # perf record -e branch-misses -e branch-instructions -a sleep 1

perf.data file contains different types of sample event.

If the same IP sample event exists in branch-misses and branch-instructions,
this event uses the same symbol. When annotate branch-misses events, notes->src
corresponding to this event is set to null, as a result, when annotate
branch-instructions events, this event is skipped and no annotate is output.

Solution of this patch is to add a u8 member to struct sym_hist and use a bit to
indicate whether the symbol has been processed.
Because different types of event correspond to different sym_hist, no conflict
occurs.
---
 tools/perf/builtin-annotate.c | 22 ++++++++++++++--------
 tools/perf/util/annotate.h    |  4 ++++
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index a23ba6bb99b6..c8c67892ae82 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -372,15 +372,21 @@ static void hists__find_annotations(struct hists *hists,
 			if (next != NULL)
 				nd = next;
 		} else {
-			hist_entry__tty_annotate(he, evsel, ann);
+			struct sym_hist *h = annotated_source__histogram(notes->src,
+									 evsel->idx);
+
+			if (h->processed == 0) {
+				hist_entry__tty_annotate(he, evsel, ann);
+
+				/*
+				 * Since we have a hist_entry per IP for the same
+				 * symbol, set processed flag of evsel in sym_hist
+				 * to signal we already processed this symbol.
+				 */
+				h->processed = 1;
+			}
+
 			nd = rb_next(nd);
-			/*
-			 * Since we have a hist_entry per IP for the same
-			 * symbol, free he->ms.sym->src to signal we already
-			 * processed this symbol.
-			 */
-			zfree(&notes->src->cycles_hist);
-			zfree(&notes->src);
 		}
 	}
 }
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h
index 096cdaf21b01..89872bfdc958 100644
--- a/tools/perf/util/annotate.h
+++ b/tools/perf/util/annotate.h
@@ -228,6 +228,10 @@ void symbol__calc_percent(struct symbol *sym, struct evsel *evsel);
 struct sym_hist {
 	u64		      nr_samples;
 	u64		      period;
+
+	u8		      processed  : 1, /* whether symbol has been processed, used for annotate */
+			      __reserved : 7;
+
 	struct sym_hist_entry addr[];
 };
 
-- 
2.30.GIT


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2021-03-13  2:24 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-06  8:28 [PATCH] perf annotate: Fix sample events lost in stdio mode Yang Jihong
2021-03-11  8:48 ` Yang Jihong
2021-03-11 14:42   ` Namhyung Kim
2021-03-12  3:24     ` Yang Jihong
2021-03-12  5:49       ` Namhyung Kim
2021-03-12  7:18         ` Yang Jihong
2021-03-12  8:39           ` Namhyung Kim
2021-03-12 10:20             ` Yang Jihong
2021-03-13  2:00               ` Yang Jihong
2021-03-13  2:23                 ` Yang Jihong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).