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
next reply other threads:[~2026-11-14 18:31 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-14 18:31 Yao [this message]
2026-11-14 18:37 ` [PATCH v2] perf annotate: fix annotate crash for fused instructions sashiko-bot
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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.