[PATCH] Minor improvements for perf script flamegraph

From: Tianyou Li
Date: Tue Jun 03 2025 - 02:17:45 EST


When processing the perf data file generated with multiple events,
the flamegraph script will count all the events regardless of
different event names. If specify the perf data file with -i option,
the script will try to read the header information regardless of
the file name specified, instead it will try to access the perf.data.

This patch tries to add a -e option to specify the event name that
the flamegraph will be generated accordingly. If the -e option omitted,
the behavior remains unchanged. If the -i option specified, the header
information will be read from that file.

Signed-off-by: Tianyou Li <tianyou.li@xxxxxxxxx>
Reviewed-by: Pan Deng <pan.deng@xxxxxxxxx>
Reviewed-by: Zhiguo Zhou <zhiguo.zhou@xxxxxxxxx>
Reviewed-by: Wangyang Guo <wangyang.guo@xxxxxxxxx>
Reviewed-by: Tim Chen <tim.c.chen@xxxxxxxxxxxxxxx>
---
tools/perf/scripts/python/flamegraph.py | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/tools/perf/scripts/python/flamegraph.py b/tools/perf/scripts/python/flamegraph.py
index cf7ce8229a..eb78b93925 100755
--- a/tools/perf/scripts/python/flamegraph.py
+++ b/tools/perf/scripts/python/flamegraph.py
@@ -94,6 +94,11 @@ class FlameGraphCLI:
return child

def process_event(self, event):
+ # ignore events where the event name does not match
+ # the one specified by the user
+ if self.args.event_name and event.get("ev_name") != self.args.event_name:
+ return
+
pid = event.get("sample", {}).get("pid", 0)
# event["dso"] sometimes contains /usr/lib/debug/lib/modules/*/vmlinux
# for user-space processes; let's use pid for kernel or user-space distinction
@@ -123,8 +128,15 @@ class FlameGraphCLI:
return ""

try:
- output = subprocess.check_output(["perf", "report", "--header-only"])
- return output.decode("utf-8")
+ if self.args.input:
+ output = subprocess.check_output(["perf", "script", "--header-only", "-i", self.args.input])
+ else:
+ output = subprocess.check_output(["perf", "report", "--header-only"])
+
+ result = output.decode("utf-8")
+ if self.args.event_name:
+ result += "\nFocused event: " + self.args.event_name
+ return result
except Exception as err: # pylint: disable=broad-except
print("Error reading report header: {}".format(err), file=sys.stderr)
return ""
@@ -235,6 +247,11 @@ if __name__ == "__main__":
default=False,
action="store_true",
help="allow unprompted downloading of HTML template")
+ parser.add_argument("-e", "--event",
+ default="",
+ dest="event_name",
+ type=str,
+ help="specify the event to generate flamegraph for")

cli_args = parser.parse_args()
cli = FlameGraphCLI(cli_args)
--
2.43.5