aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/bpf-trace-summary.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2025-10-08 19:24:24 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2025-10-08 19:24:24 -0700
commitec714e371f22f716a04e6ecb2a24988c92b26911 (patch)
tree02ef2ebccd6889590b2b42697b6f83ca22ff8127 /tools/perf/util/bpf-trace-summary.c
parentMerge tag 'pci-v6.18-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel/gi... (diff)
parentperf tools: Fix arm64 libjvmti build by generating unistd_64.h (diff)
downloadlinux-ec714e371f22f716a04e6ecb2a24988c92b26911.tar.gz
linux-ec714e371f22f716a04e6ecb2a24988c92b26911.zip
Merge tag 'perf-tools-for-v6.18-1-2025-10-08' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools
Pull perf tools updates from Arnaldo Carvalho de Melo: - Extended 'perf annotate' with DWARF type information (--code-with-type) integration in the TUI, including a 'T' hotkey to toggle it - Enhanced 'perf bench mem' with new mmap() workloads and control over page/chunk sizes - Fix 'perf stat' error handling to correctly display unsupported events - Improved support for Clang cross-compilation - Refactored LLVM and Capstone disasm for modularity - Introduced the :X modifier to exclude an event from automatic regrouping - Adjusted KVM sampling defaults to use the "cycles" event to prevent failures - Added comprehensive support for decoding PowerPC Dispatch Trace Log (DTL) - Updated Arm SPE tracing logic for better analysis of memory and snoop details - Synchronized Intel PMU events and metrics with TMA 5.1 across multiple processor generations - Converted dependencies like libperl and libtracefs to be opt-in - Handle more Rust symbols in kallsyms ('N', debugging) - Improve the python binding to allow for python based tools to use more of the libraries, add a 'ilist' utility to test those new bindings - Various 'perf test' fixes - Kan Liang no longer a perf tools reviewer * tag 'perf-tools-for-v6.18-1-2025-10-08' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools: (192 commits) perf tools: Fix arm64 libjvmti build by generating unistd_64.h perf tests: Don't retest sections in "Object code reading" perf docs: Document building with Clang perf build: Support build with clang perf test coresight: Dismiss clang warning for unroll loop thread perf test coresight: Dismiss clang warning for thread loop perf test coresight: Dismiss clang warning for memcpy thread perf build: Disable thread safety analysis for perl header perf build: Correct CROSS_ARCH for clang perf python: split Clang options when invoking Popen tools build: Align warning options with perf perf disasm: Remove unused evsel from 'struct annotate_args' perf srcline: Fallback between addr2line implementations perf disasm: Make ins__scnprintf() and ins__is_nop() static perf dso: Clean up read_symbol() error handling perf dso: Support BPF programs in dso__read_symbol() perf dso: Move read_symbol() from llvm/capstone to dso perf llvm: Reduce LLVM initialization perf check: Add libLLVM feature perf parse-events: Fix parsing of >30kb event strings ...
Diffstat (limited to 'tools/perf/util/bpf-trace-summary.c')
-rw-r--r--tools/perf/util/bpf-trace-summary.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/tools/perf/util/bpf-trace-summary.c b/tools/perf/util/bpf-trace-summary.c
index 69fb165da206..8dfe7e678941 100644
--- a/tools/perf/util/bpf-trace-summary.c
+++ b/tools/perf/util/bpf-trace-summary.c
@@ -138,11 +138,14 @@ static bool sc_node_equal(long key1, long key2, void *ctx __maybe_unused)
return key1 == key2;
}
-static int print_common_stats(struct syscall_data *data, FILE *fp)
+static int print_common_stats(struct syscall_data *data, int max_summary, FILE *fp)
{
int printed = 0;
- for (int i = 0; i < data->nr_nodes; i++) {
+ if (max_summary == 0 || max_summary > data->nr_nodes)
+ max_summary = data->nr_nodes;
+
+ for (int i = 0; i < max_summary; i++) {
struct syscall_node *node = &data->nodes[i];
struct syscall_stats *stat = &node->stats;
double total = (double)(stat->total_time) / NSEC_PER_MSEC;
@@ -200,7 +203,7 @@ static int update_thread_stats(struct hashmap *hash, struct syscall_key *map_key
return 0;
}
-static int print_thread_stat(struct syscall_data *data, FILE *fp)
+static int print_thread_stat(struct syscall_data *data, int max_summary, FILE *fp)
{
int printed = 0;
@@ -213,18 +216,18 @@ static int print_thread_stat(struct syscall_data *data, FILE *fp)
printed += fprintf(fp, " (msec) (msec) (msec) (msec) (%%)\n");
printed += fprintf(fp, " --------------- -------- ------ -------- --------- --------- --------- ------\n");
- printed += print_common_stats(data, fp);
+ printed += print_common_stats(data, max_summary, fp);
printed += fprintf(fp, "\n\n");
return printed;
}
-static int print_thread_stats(struct syscall_data **data, int nr_data, FILE *fp)
+static int print_thread_stats(struct syscall_data **data, int nr_data, int max_summary, FILE *fp)
{
int printed = 0;
for (int i = 0; i < nr_data; i++)
- printed += print_thread_stat(data[i], fp);
+ printed += print_thread_stat(data[i], max_summary, fp);
return printed;
}
@@ -277,7 +280,7 @@ static int update_total_stats(struct hashmap *hash, struct syscall_key *map_key,
return 0;
}
-static int print_total_stats(struct syscall_data **data, int nr_data, FILE *fp)
+static int print_total_stats(struct syscall_data **data, int nr_data, int max_summary, FILE *fp)
{
int printed = 0;
int nr_events = 0;
@@ -291,8 +294,11 @@ static int print_total_stats(struct syscall_data **data, int nr_data, FILE *fp)
printed += fprintf(fp, " (msec) (msec) (msec) (msec) (%%)\n");
printed += fprintf(fp, " --------------- -------- ------ -------- --------- --------- --------- ------\n");
- for (int i = 0; i < nr_data; i++)
- printed += print_common_stats(data[i], fp);
+ if (max_summary == 0 || max_summary > nr_data)
+ max_summary = nr_data;
+
+ for (int i = 0; i < max_summary; i++)
+ printed += print_common_stats(data[i], max_summary, fp);
printed += fprintf(fp, "\n\n");
return printed;
@@ -333,7 +339,7 @@ static int update_cgroup_stats(struct hashmap *hash, struct syscall_key *map_key
return 0;
}
-static int print_cgroup_stat(struct syscall_data *data, FILE *fp)
+static int print_cgroup_stat(struct syscall_data *data, int max_summary, FILE *fp)
{
int printed = 0;
struct cgroup *cgrp = __cgroup__find(&cgroups, data->key);
@@ -351,23 +357,23 @@ static int print_cgroup_stat(struct syscall_data *data, FILE *fp)
printed += fprintf(fp, " (msec) (msec) (msec) (msec) (%%)\n");
printed += fprintf(fp, " --------------- -------- ------ -------- --------- --------- --------- ------\n");
- printed += print_common_stats(data, fp);
+ printed += print_common_stats(data, max_summary, fp);
printed += fprintf(fp, "\n\n");
return printed;
}
-static int print_cgroup_stats(struct syscall_data **data, int nr_data, FILE *fp)
+static int print_cgroup_stats(struct syscall_data **data, int nr_data, int max_summary, FILE *fp)
{
int printed = 0;
for (int i = 0; i < nr_data; i++)
- printed += print_cgroup_stat(data[i], fp);
+ printed += print_cgroup_stat(data[i], max_summary, fp);
return printed;
}
-int trace_print_bpf_summary(FILE *fp)
+int trace_print_bpf_summary(FILE *fp, int max_summary)
{
struct bpf_map *map = skel->maps.syscall_stats_map;
struct syscall_key *prev_key, key;
@@ -420,13 +426,13 @@ int trace_print_bpf_summary(FILE *fp)
switch (skel->rodata->aggr_mode) {
case SYSCALL_AGGR_THREAD:
- printed += print_thread_stats(data, nr_data, fp);
+ printed += print_thread_stats(data, nr_data, max_summary, fp);
break;
case SYSCALL_AGGR_CPU:
- printed += print_total_stats(data, nr_data, fp);
+ printed += print_total_stats(data, nr_data, max_summary, fp);
break;
case SYSCALL_AGGR_CGROUP:
- printed += print_cgroup_stats(data, nr_data, fp);
+ printed += print_cgroup_stats(data, nr_data, max_summary, fp);
break;
default:
break;