Skip to content

Commit df8f618

Browse files
committed
Merge tag 'perf-tools-for-v7.1-2026-04-17' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools
Pull perf tools updates from Namhyung Kim: "perf report: - Add 'comm_nodigit' sort key to combine similar threads that only have different numbers in the comm. In the following example, the 'comm_nodigit' will have samples from all threads starting with "bpfrb/" into an entry "bpfrb/<N>". $ perf report -s comm_nodigit,comm -H ... # # Overhead CommandNoDigit / Command # ........... ........................ # 20.30% swapper 20.30% swapper 13.37% chrome 13.37% chrome 10.07% bpfrb/<N> 7.47% bpfrb/0 0.70% bpfrb/1 0.47% bpfrb/3 0.46% bpfrb/2 0.25% bpfrb/4 0.23% bpfrb/5 0.20% bpfrb/6 0.14% bpfrb/10 0.07% bpfrb/7 - Support flat layout for symfs. The --symfs option is to specify the location of debugging symbol files. The default 'hierarchy' layout would search the symbol file using the same path of the original file under the symfs root. The new 'flat' layout would search only in the root directory. - Update 'simd' sort key for ARM SIMD flags to cover ASE/SME and more predicate flags. perf stat: - Add --pmu-filter option to select specific PMUs. This would be useful when you measure metrics from multiple instance of uncore PMUs with similar names. # perf stat -M cpa_p0_avg_bw Performance counter stats for 'system wide': 19,417,779,115 hisi_sicl0_cpa0/cpa_cycles/ # 0.00 cpa_p0_avg_bw 0 hisi_sicl0_cpa0/cpa_p0_wr_dat/ 0 hisi_sicl0_cpa0/cpa_p0_rd_dat_64b/ 0 hisi_sicl0_cpa0/cpa_p0_rd_dat_32b/ 19,417,751,103 hisi_sicl10_cpa0/cpa_cycles/ # 0.00 cpa_p0_avg_bw 0 hisi_sicl10_cpa0/cpa_p0_wr_dat/ 0 hisi_sicl10_cpa0/cpa_p0_rd_dat_64b/ 0 hisi_sicl10_cpa0/cpa_p0_rd_dat_32b/ 19,417,730,679 hisi_sicl2_cpa0/cpa_cycles/ # 0.31 cpa_p0_avg_bw 75,635,749 hisi_sicl2_cpa0/cpa_p0_wr_dat/ 18,520,640 hisi_sicl2_cpa0/cpa_p0_rd_dat_64b/ 0 hisi_sicl2_cpa0/cpa_p0_rd_dat_32b/ 19,417,674,227 hisi_sicl8_cpa0/cpa_cycles/ # 0.00 cpa_p0_avg_bw 0 hisi_sicl8_cpa0/cpa_p0_wr_dat/ 0 hisi_sicl8_cpa0/cpa_p0_rd_dat_64b/ 0 hisi_sicl8_cpa0/cpa_p0_rd_dat_32b/ 19.417734480 seconds time elapsed With --pmu-filter, users can select only hisi_sicl2_cpa0 PMU. # perf stat --pmu-filter hisi_sicl2_cpa0 -M cpa_p0_avg_bw Performance counter stats for 'system wide': 6,234,093,559 cpa_cycles # 0.60 cpa_p0_avg_bw 50,548,465 cpa_p0_wr_dat 7,552,182 cpa_p0_rd_dat_64b 0 cpa_p0_rd_dat_32b 6.234139320 seconds time elapsed Data type profiling: - Quality improvements by tracking register state more precisely - Ensure array members to get the type - Handle more cases for global variables Vendor event/metric updates: - Update various Intel events and metrics - Add NVIDIA Tegra 410 Olympus events Internal changes: - Verify perf.data header for maliciously crafted files - Update perf test to cover more usages and make them robust - Move a couple of copied kernel headers not to annoy objtool build - Fix a bug in map sorting in name order - Remove some unused codes Misc: - Fix module symbol resolution with non-zero text address - Add -t/--threads option to `perf bench mem mmap` - Track duration of exit*() syscall by `perf trace -s` - Add core.addr2line-timeout and core.addr2line-disable-warn config items" * tag 'perf-tools-for-v7.1-2026-04-17' of git://git.kernel.org/pub/scm/linux/kernel/git/perf/perf-tools: (131 commits) perf loongarch: Fix build failure with CONFIG_LIBDW_DWARF_UNWIND perf annotate: Use jump__delete when freeing LoongArch jumps perf test: Fixes for check branch stack sampling perf test: Fix inet_pton probe failure and unroll call graph perf build: fix "argument list too long" in second location perf header: Add sanity checks to HEADER_BPF_BTF processing perf header: Sanity check HEADER_BPF_PROG_INFO perf header: Sanity check HEADER_PMU_CAPS perf header: Sanity check HEADER_HYBRID_TOPOLOGY perf header: Sanity check HEADER_CACHE perf header: Sanity check HEADER_GROUP_DESC perf header: Sanity check HEADER_PMU_MAPPINGS perf header: Sanity check HEADER_MEM_TOPOLOGY perf header: Sanity check HEADER_NUMA_TOPOLOGY perf header: Sanity check HEADER_CPU_TOPOLOGY perf header: Sanity check HEADER_NRCPUS and HEADER_CPU_DOMAIN_INFO perf header: Bump up the max number of command line args allowed perf header: Validate nr_domains when reading HEADER_CPU_DOMAIN_INFO perf sample: Fix documentation typo perf arm_spe: Improve SIMD flags setting ...
2 parents 8541d8f + 9a683fe commit df8f618

245 files changed

Lines changed: 6797 additions & 1676 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

tools/build/feature/Makefile

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,18 @@ else
104104
endif
105105
endif
106106

107+
ifeq ($(findstring -static,${LDFLAGS}),-static)
108+
PKG_CONFIG += --static
109+
endif
110+
107111
all: $(FILES)
108112

109113
__BUILD = $(CC) $(CFLAGS) -MD -Wall -Werror -o $@ $(patsubst %.bin,%.c,$(@F)) $(LDFLAGS)
110114
BUILD = $(__BUILD) > $(@:.bin=.make.output) 2>&1
111115
BUILD_BFD = $(BUILD) -DPACKAGE='"perf"' -lbfd -ldl
112-
BUILD_ALL = $(BUILD) -fstack-protector-all -O2 -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -lslang $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -ldl -lz -llzma -lzstd -lssl
116+
BUILD_ALL = $(BUILD) -fstack-protector-all -O2 -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -lslang \
117+
$(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -ldl -lz -llzma -lzstd \
118+
$(shell $(PKG_CONFIG) --libs --cflags openssl 2>/dev/null)
113119

114120
__BUILDXX = $(CXX) $(CXXFLAGS) -MD -Wall -Werror -o $@ $(patsubst %.bin,%.cpp,$(@F)) $(LDFLAGS)
115121
BUILDXX = $(__BUILDXX) > $(@:.bin=.make.output) 2>&1
@@ -388,7 +394,7 @@ $(OUTPUT)test-libpfm4.bin:
388394
$(BUILD) -lpfm
389395

390396
$(OUTPUT)test-libopenssl.bin:
391-
$(BUILD) -lssl
397+
$(BUILD) $(shell $(PKG_CONFIG) --libs --cflags openssl 2>/dev/null)
392398

393399
$(OUTPUT)test-bpftool-skeletons.bin:
394400
$(SYSTEM_BPFTOOL) version | grep '^features:.*skeletons' \

tools/lib/perf/cpumap.c

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515

1616
#define MAX_NR_CPUS 4096
1717

18-
void perf_cpu_map__set_nr(struct perf_cpu_map *map, int nr_cpus)
18+
void perf_cpu_map__set_nr(struct perf_cpu_map *map, unsigned int nr_cpus)
1919
{
2020
RC_CHK_ACCESS(map)->nr = nr_cpus;
2121
}
2222

23-
struct perf_cpu_map *perf_cpu_map__alloc(int nr_cpus)
23+
struct perf_cpu_map *perf_cpu_map__alloc(unsigned int nr_cpus)
2424
{
2525
RC_STRUCT(perf_cpu_map) *cpus;
2626
struct perf_cpu_map *result;
@@ -78,23 +78,21 @@ void perf_cpu_map__put(struct perf_cpu_map *map)
7878
static struct perf_cpu_map *cpu_map__new_sysconf(void)
7979
{
8080
struct perf_cpu_map *cpus;
81-
int nr_cpus, nr_cpus_conf;
81+
long nr_cpus, nr_cpus_conf;
8282

8383
nr_cpus = sysconf(_SC_NPROCESSORS_ONLN);
8484
if (nr_cpus < 0)
8585
return NULL;
8686

8787
nr_cpus_conf = sysconf(_SC_NPROCESSORS_CONF);
8888
if (nr_cpus != nr_cpus_conf) {
89-
pr_warning("Number of online CPUs (%d) differs from the number configured (%d) the CPU map will only cover the first %d CPUs.",
89+
pr_warning("Number of online CPUs (%ld) differs from the number configured (%ld) the CPU map will only cover the first %ld CPUs.",
9090
nr_cpus, nr_cpus_conf, nr_cpus);
9191
}
9292

9393
cpus = perf_cpu_map__alloc(nr_cpus);
9494
if (cpus != NULL) {
95-
int i;
96-
97-
for (i = 0; i < nr_cpus; ++i)
95+
for (long i = 0; i < nr_cpus; ++i)
9896
RC_CHK_ACCESS(cpus)->map[i].cpu = i;
9997
}
10098

@@ -132,23 +130,23 @@ static int cmp_cpu(const void *a, const void *b)
132130
return cpu_a->cpu - cpu_b->cpu;
133131
}
134132

135-
static struct perf_cpu __perf_cpu_map__cpu(const struct perf_cpu_map *cpus, int idx)
133+
static struct perf_cpu __perf_cpu_map__cpu(const struct perf_cpu_map *cpus, unsigned int idx)
136134
{
137135
return RC_CHK_ACCESS(cpus)->map[idx];
138136
}
139137

140-
static struct perf_cpu_map *cpu_map__trim_new(int nr_cpus, const struct perf_cpu *tmp_cpus)
138+
static struct perf_cpu_map *cpu_map__trim_new(unsigned int nr_cpus, const struct perf_cpu *tmp_cpus)
141139
{
142140
size_t payload_size = nr_cpus * sizeof(struct perf_cpu);
143141
struct perf_cpu_map *cpus = perf_cpu_map__alloc(nr_cpus);
144-
int i, j;
145142

146143
if (cpus != NULL) {
144+
unsigned int j = 0;
145+
147146
memcpy(RC_CHK_ACCESS(cpus)->map, tmp_cpus, payload_size);
148147
qsort(RC_CHK_ACCESS(cpus)->map, nr_cpus, sizeof(struct perf_cpu), cmp_cpu);
149148
/* Remove dups */
150-
j = 0;
151-
for (i = 0; i < nr_cpus; i++) {
149+
for (unsigned int i = 0; i < nr_cpus; i++) {
152150
if (i == 0 ||
153151
__perf_cpu_map__cpu(cpus, i).cpu !=
154152
__perf_cpu_map__cpu(cpus, i - 1).cpu) {
@@ -167,9 +165,8 @@ struct perf_cpu_map *perf_cpu_map__new(const char *cpu_list)
167165
struct perf_cpu_map *cpus = NULL;
168166
unsigned long start_cpu, end_cpu = 0;
169167
char *p = NULL;
170-
int i, nr_cpus = 0;
168+
unsigned int nr_cpus = 0, max_entries = 0;
171169
struct perf_cpu *tmp_cpus = NULL, *tmp;
172-
int max_entries = 0;
173170

174171
if (!cpu_list)
175172
return perf_cpu_map__new_online_cpus();
@@ -208,9 +205,10 @@ struct perf_cpu_map *perf_cpu_map__new(const char *cpu_list)
208205

209206
for (; start_cpu <= end_cpu; start_cpu++) {
210207
/* check for duplicates */
211-
for (i = 0; i < nr_cpus; i++)
208+
for (unsigned int i = 0; i < nr_cpus; i++) {
212209
if (tmp_cpus[i].cpu == (int16_t)start_cpu)
213210
goto invalid;
211+
}
214212

215213
if (nr_cpus == max_entries) {
216214
max_entries += max(end_cpu - start_cpu + 1, 16UL);
@@ -252,12 +250,12 @@ struct perf_cpu_map *perf_cpu_map__new_int(int cpu)
252250
return cpus;
253251
}
254252

255-
static int __perf_cpu_map__nr(const struct perf_cpu_map *cpus)
253+
static unsigned int __perf_cpu_map__nr(const struct perf_cpu_map *cpus)
256254
{
257255
return RC_CHK_ACCESS(cpus)->nr;
258256
}
259257

260-
struct perf_cpu perf_cpu_map__cpu(const struct perf_cpu_map *cpus, int idx)
258+
struct perf_cpu perf_cpu_map__cpu(const struct perf_cpu_map *cpus, unsigned int idx)
261259
{
262260
struct perf_cpu result = {
263261
.cpu = -1
@@ -269,7 +267,7 @@ struct perf_cpu perf_cpu_map__cpu(const struct perf_cpu_map *cpus, int idx)
269267
return result;
270268
}
271269

272-
int perf_cpu_map__nr(const struct perf_cpu_map *cpus)
270+
unsigned int perf_cpu_map__nr(const struct perf_cpu_map *cpus)
273271
{
274272
return cpus ? __perf_cpu_map__nr(cpus) : 1;
275273
}
@@ -294,7 +292,7 @@ bool perf_cpu_map__is_empty(const struct perf_cpu_map *map)
294292

295293
int perf_cpu_map__idx(const struct perf_cpu_map *cpus, struct perf_cpu cpu)
296294
{
297-
int low, high;
295+
unsigned int low, high;
298296

299297
if (!cpus)
300298
return -1;
@@ -324,7 +322,7 @@ bool perf_cpu_map__has(const struct perf_cpu_map *cpus, struct perf_cpu cpu)
324322

325323
bool perf_cpu_map__equal(const struct perf_cpu_map *lhs, const struct perf_cpu_map *rhs)
326324
{
327-
int nr;
325+
unsigned int nr;
328326

329327
if (lhs == rhs)
330328
return true;
@@ -336,7 +334,7 @@ bool perf_cpu_map__equal(const struct perf_cpu_map *lhs, const struct perf_cpu_m
336334
if (nr != __perf_cpu_map__nr(rhs))
337335
return false;
338336

339-
for (int idx = 0; idx < nr; idx++) {
337+
for (unsigned int idx = 0; idx < nr; idx++) {
340338
if (__perf_cpu_map__cpu(lhs, idx).cpu != __perf_cpu_map__cpu(rhs, idx).cpu)
341339
return false;
342340
}
@@ -353,7 +351,7 @@ struct perf_cpu perf_cpu_map__min(const struct perf_cpu_map *map)
353351
struct perf_cpu cpu, result = {
354352
.cpu = -1
355353
};
356-
int idx;
354+
unsigned int idx;
357355

358356
perf_cpu_map__for_each_cpu_skip_any(cpu, idx, map) {
359357
result = cpu;
@@ -384,7 +382,7 @@ bool perf_cpu_map__is_subset(const struct perf_cpu_map *a, const struct perf_cpu
384382
if (!a || __perf_cpu_map__nr(b) > __perf_cpu_map__nr(a))
385383
return false;
386384

387-
for (int i = 0, j = 0; i < __perf_cpu_map__nr(a); i++) {
385+
for (unsigned int i = 0, j = 0; i < __perf_cpu_map__nr(a); i++) {
388386
if (__perf_cpu_map__cpu(a, i).cpu > __perf_cpu_map__cpu(b, j).cpu)
389387
return false;
390388
if (__perf_cpu_map__cpu(a, i).cpu == __perf_cpu_map__cpu(b, j).cpu) {
@@ -410,8 +408,7 @@ bool perf_cpu_map__is_subset(const struct perf_cpu_map *a, const struct perf_cpu
410408
int perf_cpu_map__merge(struct perf_cpu_map **orig, struct perf_cpu_map *other)
411409
{
412410
struct perf_cpu *tmp_cpus;
413-
int tmp_len;
414-
int i, j, k;
411+
unsigned int tmp_len, i, j, k;
415412
struct perf_cpu_map *merged;
416413

417414
if (perf_cpu_map__is_subset(*orig, other))
@@ -455,7 +452,7 @@ int perf_cpu_map__merge(struct perf_cpu_map **orig, struct perf_cpu_map *other)
455452
struct perf_cpu_map *perf_cpu_map__intersect(struct perf_cpu_map *orig,
456453
struct perf_cpu_map *other)
457454
{
458-
int i, j, k;
455+
unsigned int i, j, k;
459456
struct perf_cpu_map *merged;
460457

461458
if (perf_cpu_map__is_subset(other, orig))

tools/lib/perf/evsel.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus,
127127
struct perf_thread_map *threads)
128128
{
129129
struct perf_cpu cpu;
130-
int idx, thread, err = 0;
130+
unsigned int idx;
131+
int thread, err = 0;
131132

132133
if (cpus == NULL) {
133134
static struct perf_cpu_map *empty_cpu_map;
@@ -460,7 +461,7 @@ int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu_map_idx)
460461
int perf_evsel__enable_thread(struct perf_evsel *evsel, int thread)
461462
{
462463
struct perf_cpu cpu __maybe_unused;
463-
int idx;
464+
unsigned int idx;
464465
int err;
465466

466467
perf_cpu_map__for_each_cpu(cpu, idx, evsel->cpus) {
@@ -499,12 +500,13 @@ int perf_evsel__disable(struct perf_evsel *evsel)
499500

500501
int perf_evsel__apply_filter(struct perf_evsel *evsel, const char *filter)
501502
{
502-
int err = 0, i;
503+
int err = 0;
503504

504-
for (i = 0; i < perf_cpu_map__nr(evsel->cpus) && !err; i++)
505+
for (unsigned int i = 0; i < perf_cpu_map__nr(evsel->cpus) && !err; i++) {
505506
err = perf_evsel__run_ioctl(evsel,
506507
PERF_EVENT_IOC_SET_FILTER,
507508
(void *)filter, i);
509+
}
508510
return err;
509511
}
510512

tools/lib/perf/include/internal/cpumap.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@
1616
DECLARE_RC_STRUCT(perf_cpu_map) {
1717
refcount_t refcnt;
1818
/** Length of the map array. */
19-
int nr;
19+
unsigned int nr;
2020
/** The CPU values. */
2121
struct perf_cpu map[];
2222
};
2323

24-
struct perf_cpu_map *perf_cpu_map__alloc(int nr_cpus);
24+
struct perf_cpu_map *perf_cpu_map__alloc(unsigned int nr_cpus);
2525
int perf_cpu_map__idx(const struct perf_cpu_map *cpus, struct perf_cpu cpu);
2626
bool perf_cpu_map__is_subset(const struct perf_cpu_map *a, const struct perf_cpu_map *b);
2727

28-
void perf_cpu_map__set_nr(struct perf_cpu_map *map, int nr_cpus);
28+
void perf_cpu_map__set_nr(struct perf_cpu_map *map, unsigned int nr_cpus);
2929

3030
static inline refcount_t *perf_cpu_map__refcnt(struct perf_cpu_map *map)
3131
{

tools/lib/perf/include/perf/cpumap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ LIBPERF_API void perf_cpu_map__put(struct perf_cpu_map *map);
4949
* perf_cpu_map__cpu - get the CPU value at the given index. Returns -1 if index
5050
* is invalid.
5151
*/
52-
LIBPERF_API struct perf_cpu perf_cpu_map__cpu(const struct perf_cpu_map *cpus, int idx);
52+
LIBPERF_API struct perf_cpu perf_cpu_map__cpu(const struct perf_cpu_map *cpus, unsigned int idx);
5353
/**
5454
* perf_cpu_map__nr - for an empty map returns 1, as perf_cpu_map__cpu returns a
5555
* cpu of -1 for an invalid index, this makes an empty map
5656
* look like it contains the "any CPU"/dummy value. Otherwise
5757
* the result is the number CPUs in the map plus one if the
5858
* "any CPU"/dummy value is present.
5959
*/
60-
LIBPERF_API int perf_cpu_map__nr(const struct perf_cpu_map *cpus);
60+
LIBPERF_API unsigned int perf_cpu_map__nr(const struct perf_cpu_map *cpus);
6161
/**
6262
* perf_cpu_map__has_any_cpu_or_is_empty - is map either empty or has the "any CPU"/dummy value.
6363
*/

tools/perf/Documentation/perf-annotate.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,11 @@ include::itrace.txt[]
110110
Interleave source code with assembly code. Enabled by default,
111111
disable with --no-source.
112112

113-
--symfs=<directory>::
114-
Look for files with symbols relative to this directory.
113+
--symfs=<directory[,layout]>::
114+
Look for files with symbols relative to this directory. The optional
115+
layout can be 'hierarchy' (default, matches full path) or 'flat'
116+
(only matches base name). This is useful when debug files are stored
117+
in a flat directory structure.
115118

116119
-M::
117120
--disassembler-style=:: Set disassembler style for objdump.

tools/perf/Documentation/perf-bench.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,10 @@ Repeat mmap() invocation this number of times.
274274
--cycles::
275275
Use perf's cpu-cycles event instead of gettimeofday syscall.
276276

277+
-t::
278+
--threads=<NUM>::
279+
Create multiple threads to call mmap/munmap concurrently.
280+
277281
SUITES FOR 'numa'
278282
~~~~~~~~~~~~~~~~~
279283
*mem*::

tools/perf/Documentation/perf-config.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,12 @@ core.*::
210210
Sets a timeout (in milliseconds) for parsing /proc/<pid>/maps files.
211211
Can be overridden by the --proc-map-timeout option on supported
212212
subcommands. The default timeout is 500ms.
213+
addr2line-disable-warn::
214+
When set to 'true' disable all warnings from 'addr2line' output.
215+
Default setting is 'false' to show these warnings.
216+
addr2line-timeout::
217+
Sets a timeout (in milliseconds) for parsing 'addr2line'
218+
output. The default timeout is 5s.
213219

214220
tui.*, gtk.*::
215221
Subcommands that can be configured here are 'top', 'report' and 'annotate'.

tools/perf/Documentation/perf-diff.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,11 @@ OPTIONS
8181
--force::
8282
Don't do ownership validation.
8383

84-
--symfs=<directory>::
85-
Look for files with symbols relative to this directory.
84+
--symfs=<directory[,layout]>::
85+
Look for files with symbols relative to this directory. The optional
86+
layout can be 'hierarchy' (default, matches full path) or 'flat'
87+
(only matches base name). This is useful when debug files are stored
88+
in a flat directory structure.
8689

8790
-b::
8891
--baseline-only::

tools/perf/Documentation/perf-kwork.txt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,11 @@ OPTIONS for 'perf kwork timehist'
169169
--max-stack::
170170
Maximum number of functions to display in backtrace, default 5.
171171

172-
--symfs=<directory>::
173-
Look for files with symbols relative to this directory.
172+
--symfs=<directory[,layout]>::
173+
Look for files with symbols relative to this directory. The optional
174+
layout can be 'hierarchy' (default, matches full path) or 'flat'
175+
(only matches base name). This is useful when debug files are stored
176+
in a flat directory structure.
174177

175178
--time::
176179
Only analyze samples within given time window: <start>,<stop>. Times

0 commit comments

Comments
 (0)