From: Yao <dragonlinux@gmail.com>
Cc: yao <dragonlinux@gmail.com>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Arnaldo Carvalho de Melo <acme@kernel.org>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>, Ian Rogers <irogers@google.com>,
Adrian Hunter <adrian.hunter@intel.com>,
James Clark <james.clark@linaro.org>,
Ravi Bangoria <ravi.bangoria@amd.com>,
Jin Yao <yao.jin@linux.intel.com>,
linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH v2] perf annotate: fix annotate crash for fused instructions
Date: Sat, 14 Nov 2026 13:31:21 -0500 [thread overview]
Message-ID: <20261114183124.685561-1-dragonlinux@gmail.com> (raw)
From: yao <dragonlinux@gmail.com>
Function is_fused tries to find the previous fused instruction with the
current conditional jump instruction in the annotate_line list.
disasm_line is the container of annotate_line.
The annotate_line list uses list_head and the head is in annotated_source:
notes->src which is not an annotate_line, so it couldn't walk without
checking the list_head. If so it will read annoted_source neighbour memory
mistakenly and most likely cause crash.
Fix the case where current instruction is a conditional jump and it is
the first instruction in the disassembled list, the original code will
walk to the head and treats it as disasm_line which is not.
-------- backtrace --------
#0 0x564dd8d5d5cd in ui__signal_backtrace setup.c:0
#1 0x7f1737e3e6f0 libc.so.6[3e6f0]
#2 0x7f1737ec10b1 strstr-sse2-unaligned.S:41
#3 0x564dd8d625ef in intel__ins_is_fused annotate-x86.c:0
#4 0x564dd8d4bcde in annotate_browser__refresh annotate.c:0
#5 0x564dd8d49bd6 in __ui_browser__refresh.isra.0 browser.c:0
#6 0x564dd8d4a960 in ui_browser__run ??:0
#7 0x564dd8d4cbcf in __hist_entry__tui_annotate ??:0
#8 0x564dd8d50a91 in do_annotate hists.c:0
#9 0x564dd8d58bb1 in evsel__hists_browse hists.c:0
#10 0x564dd8d5a7fa in evlist__tui_browse_hists ??:0
#11 0x564dd8bf7a98 in cmd_report help.c:109
#12 0x564dd8c713e4 in handle_internal_command help.c:109
#13 0x564dd8bd6ac2 in main ??:0
#14 0x7f1737e27781 libc_start_call_main.h:83
#15 0x7f1737e278b9 in __libc_start_main libc-start.c:127
#16 0x564dd8bd7095 in _start help.c:109
Fixes: 7efbcc8c075c ("perf annotate: Fix fused instr logic for assembly functions")
Signed-off-by: yao <dragonlinux@gmail.com>
---
tools/perf/ui/browsers/annotate.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c
index cf36b5347f72..07449944fa2e 100644
--- a/tools/perf/ui/browsers/annotate.c
+++ b/tools/perf/ui/browsers/annotate.c
@@ -155,17 +155,26 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
static int is_fused(struct annotate_browser *ab, struct disasm_line *cursor)
{
- struct disasm_line *pos = list_prev_entry(cursor, al.node);
+ struct annotation *notes = browser__annotation(&ab->b);
+ struct list_head *node = cursor->al.node.prev;
+ struct disasm_line *pos;
const char *name;
int diff = 1;
- while (pos && pos->al.offset == -1) {
- pos = list_prev_entry(pos, al.node);
+ /*
+ * backwalk to the nearest neighbour instruction till the list head
+ * instructions/non-insn are ordered from head to tail
+ * head is not a annotate_line/disasm_line
+ */
+ for (; node != ¬es->src->source; node = node->prev) {
+ pos = list_entry(node, struct disasm_line, al.node);
+ if (pos->al.offset != -1)
+ break;
if (!annotate_opts.hide_src_code)
diff++;
}
- if (!pos)
+ if (node == ¬es->src->source)
return 0;
if (ins__is_lock(&pos->ins))
--
2.56.1
reply other threads:[~2026-11-14 18:31 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261114183124.685561-1-dragonlinux@gmail.com \
--to=dragonlinux@gmail.com \
--cc=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=ravi.bangoria@amd.com \
--cc=yao.jin@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox