Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
- tools/perf/util/libdw.c | 49 ++++++++++++++++++++++++++++++++++++-----
+ tools/perf/util/libdw.c | 49 ++++++++++++++++++++++++++++++++++++++++++------
1 file changed, 43 insertions(+), 6 deletions(-)
-diff --git a/tools/perf/util/libdw.c b/tools/perf/util/libdw.c
-index 21697788410308..15bf646d104f5a 100644
--- a/tools/perf/util/libdw.c
+++ b/tools/perf/util/libdw.c
-@@ -60,7 +60,10 @@ struct Dwfl *dso__libdw_dwfl(struct dso *dso)
+@@ -60,7 +60,10 @@ struct Dwfl *dso__libdw_dwfl(struct dso
return NULL;
}
/* Assign caller information to the parent. */
if (call_fname)
-@@ -103,12 +107,27 @@ static int libdw_a2l_cb(Dwarf_Die *die, void *_args)
+@@ -103,12 +107,27 @@ static int libdw_a2l_cb(Dwarf_Die *die,
/* Add this symbol to the chain as the leaf. */
if (!args->leaf_srcline_used) {
}
int libdw__addr2line(u64 addr, char **file, unsigned int *line_nr,
-@@ -162,11 +181,29 @@ int libdw__addr2line(u64 addr, char **file, unsigned int *line_nr,
+@@ -162,11 +181,29 @@ int libdw__addr2line(u64 addr, char **fi
.leaf_srcline = srcline_from_fileline(src ?: "<unknown>", lineno),
};
}
return 1;
}
---
-2.53.0
-
--- /dev/null
+From 674dea094ef6594ea1aa0efb074a4646a81350b2 Mon Sep 17 00:00:00 2001
+From: Ian Rogers <irogers@google.com>
+Date: Mon, 4 May 2026 01:12:21 -0700
+Subject: perf srcline: Introduce inline_node__clear_frames()
+
+From: Ian Rogers <irogers@google.com>
+
+commit 674dea094ef6594ea1aa0efb074a4646a81350b2 upstream.
+
+Introduce inline_node__clear_frames() to clean up partial allocations.
+This is a prerequisite for error handling in libdw inline unwinding.
+
+Signed-off-by: Ian Rogers <irogers@google.com>
+Cc: Adrian Hunter <adrian.hunter@intel.com>
+Cc: Ingo Molnar <mingo@redhat.com>
+Cc: James Clark <james.clark@linaro.org>
+Cc: Jiri Olsa <jolsa@kernel.org>
+Cc: Masami Hiramatsu <mhiramat@kernel.org>
+Cc: Namhyung Kim <namhyung@kernel.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Zecheng Li <zli94@ncsu.edu>
+Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ tools/perf/util/srcline.c | 9 ++++++++-
+ tools/perf/util/srcline.h | 1 +
+ 2 files changed, 9 insertions(+), 1 deletion(-)
+
+--- a/tools/perf/util/srcline.c
++++ b/tools/perf/util/srcline.c
+@@ -429,10 +429,13 @@ struct inline_node *dso__parse_addr_inli
+ return addr2inlines(dso_name, addr, dso, sym);
+ }
+
+-void inline_node__delete(struct inline_node *node)
++void inline_node__clear_frames(struct inline_node *node)
+ {
+ struct inline_list *ilist, *tmp;
+
++ if (node == NULL)
++ return;
++
+ list_for_each_entry_safe(ilist, tmp, &node->val, list) {
+ list_del_init(&ilist->list);
+ zfree_srcline(&ilist->srcline);
+@@ -441,7 +444,11 @@ void inline_node__delete(struct inline_n
+ symbol__delete(ilist->symbol);
+ free(ilist);
+ }
++}
+
++void inline_node__delete(struct inline_node *node)
++{
++ inline_node__clear_frames(node);
+ free(node);
+ }
+
+--- a/tools/perf/util/srcline.h
++++ b/tools/perf/util/srcline.h
+@@ -47,6 +47,7 @@ struct inline_node *dso__parse_addr_inli
+ struct symbol *sym);
+ /* free resources associated to the inline node list */
+ void inline_node__delete(struct inline_node *node);
++void inline_node__clear_frames(struct inline_node *node);
+
+ /* insert the inline node list into the DSO, which will take ownership */
+ void inlines__tree_insert(struct rb_root_cached *tree,