Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) #include "util/debug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) #include "util/dso.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) #include "util/event.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) #include "util/map.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) #include "util/symbol.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include "util/sort.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include "util/evsel.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #include "util/evlist.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include "util/machine.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include "util/thread.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include "util/parse-events.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include "tests/tests.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include "tests/hists_common.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) struct sample {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	u32 pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	u64 ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 	struct thread *thread;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 	struct map *map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 	struct symbol *sym;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) /* For the numbers, see hists_common.c */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) static struct sample fake_samples[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	/* perf [kernel] schedule() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	{ .pid = FAKE_PID_PERF1, .ip = FAKE_IP_KERNEL_SCHEDULE, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	/* perf [perf]   main() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	{ .pid = FAKE_PID_PERF1, .ip = FAKE_IP_PERF_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	/* perf [perf]   cmd_record() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	{ .pid = FAKE_PID_PERF1, .ip = FAKE_IP_PERF_CMD_RECORD, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	/* perf [libc]   malloc() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	{ .pid = FAKE_PID_PERF1, .ip = FAKE_IP_LIBC_MALLOC, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 	/* perf [libc]   free() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	{ .pid = FAKE_PID_PERF1, .ip = FAKE_IP_LIBC_FREE, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	/* perf [perf]   main() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	{ .pid = FAKE_PID_PERF2, .ip = FAKE_IP_PERF_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	/* perf [kernel] page_fault() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	{ .pid = FAKE_PID_PERF2, .ip = FAKE_IP_KERNEL_PAGE_FAULT, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	/* bash [bash]   main() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	{ .pid = FAKE_PID_BASH,  .ip = FAKE_IP_BASH_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	/* bash [bash]   xmalloc() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	{ .pid = FAKE_PID_BASH,  .ip = FAKE_IP_BASH_XMALLOC, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	/* bash [kernel] page_fault() */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	{ .pid = FAKE_PID_BASH,  .ip = FAKE_IP_KERNEL_PAGE_FAULT, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50)  * Will be casted to struct ip_callchain which has all 64 bit entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)  * of nr and ips[].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) static u64 fake_callchains[][10] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	/*   schedule => run_command => main */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	{ 3, FAKE_IP_KERNEL_SCHEDULE, FAKE_IP_PERF_RUN_COMMAND, FAKE_IP_PERF_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	/*   main  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	{ 1, FAKE_IP_PERF_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	/*   cmd_record => run_command => main */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	{ 3, FAKE_IP_PERF_CMD_RECORD, FAKE_IP_PERF_RUN_COMMAND, FAKE_IP_PERF_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	/*   malloc => cmd_record => run_command => main */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	{ 4, FAKE_IP_LIBC_MALLOC, FAKE_IP_PERF_CMD_RECORD, FAKE_IP_PERF_RUN_COMMAND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	     FAKE_IP_PERF_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	/*   free => cmd_record => run_command => main */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	{ 4, FAKE_IP_LIBC_FREE, FAKE_IP_PERF_CMD_RECORD, FAKE_IP_PERF_RUN_COMMAND,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	     FAKE_IP_PERF_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	/*   main */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	{ 1, FAKE_IP_PERF_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	/*   page_fault => sys_perf_event_open => run_command => main */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	{ 4, FAKE_IP_KERNEL_PAGE_FAULT, FAKE_IP_KERNEL_SYS_PERF_EVENT_OPEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	     FAKE_IP_PERF_RUN_COMMAND, FAKE_IP_PERF_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	/*   main */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	{ 1, FAKE_IP_BASH_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	/*   xmalloc => malloc => xmalloc => malloc => xmalloc => main */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	{ 6, FAKE_IP_BASH_XMALLOC, FAKE_IP_LIBC_MALLOC, FAKE_IP_BASH_XMALLOC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	     FAKE_IP_LIBC_MALLOC, FAKE_IP_BASH_XMALLOC, FAKE_IP_BASH_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	/*   page_fault => malloc => main */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	{ 3, FAKE_IP_KERNEL_PAGE_FAULT, FAKE_IP_LIBC_MALLOC, FAKE_IP_BASH_MAIN, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) static int add_hist_entries(struct hists *hists, struct machine *machine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	struct addr_location al;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	struct evsel *evsel = hists_to_evsel(hists);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	struct perf_sample sample = { .period = 1000, };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	size_t i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	for (i = 0; i < ARRAY_SIZE(fake_samples); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		struct hist_entry_iter iter = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 			.evsel = evsel,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 			.sample	= &sample,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 			.hide_unresolved = false,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 		};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 		if (symbol_conf.cumulate_callchain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 			iter.ops = &hist_iter_cumulative;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 		else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 			iter.ops = &hist_iter_normal;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		sample.cpumode = PERF_RECORD_MISC_USER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		sample.pid = fake_samples[i].pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 		sample.tid = fake_samples[i].pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 		sample.ip = fake_samples[i].ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 		sample.callchain = (struct ip_callchain *)fake_callchains[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 		if (machine__resolve(machine, &al, &sample) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		if (hist_entry_iter__add(&iter, &al, sysctl_perf_event_max_stack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 					 NULL) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 			addr_location__put(&al);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 			goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 		fake_samples[i].thread = al.thread;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 		fake_samples[i].map = al.map;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 		fake_samples[i].sym = al.sym;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	return TEST_OK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	pr_debug("Not enough memory for adding a hist entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	return TEST_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) static void del_hist_entries(struct hists *hists)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	struct hist_entry *he;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	struct rb_root_cached *root_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	struct rb_root_cached *root_out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	struct rb_node *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	if (hists__has(hists, need_collapse))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 		root_in = &hists->entries_collapsed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 		root_in = hists->entries_in;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	root_out = &hists->entries;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	while (!RB_EMPTY_ROOT(&root_out->rb_root)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 		node = rb_first_cached(root_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 		he = rb_entry(node, struct hist_entry, rb_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 		rb_erase_cached(node, root_out);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		rb_erase_cached(&he->rb_node_in, root_in);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		hist_entry__delete(he);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) typedef int (*test_fn_t)(struct evsel *, struct machine *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define COMM(he)  (thread__comm_str(he->thread))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define DSO(he)   (he->ms.map->dso->short_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define SYM(he)   (he->ms.sym->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define CPU(he)   (he->cpu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define PID(he)   (he->thread->tid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define DEPTH(he) (he->callchain->max_depth)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define CDSO(cl)  (cl->ms.map->dso->short_name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define CSYM(cl)  (cl->ms.sym->name)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) struct result {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	u64 children;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	u64 self;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	const char *comm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	const char *dso;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	const char *sym;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) struct callchain_result {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	u64 nr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		const char *dso;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 		const char *sym;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	} node[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) static int do_test(struct hists *hists, struct result *expected, size_t nr_expected,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		   struct callchain_result *expected_callchain, size_t nr_callchain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	char buf[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	size_t i, c;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	struct hist_entry *he;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	struct rb_root *root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	struct rb_node *node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	struct callchain_node *cnode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	struct callchain_list *clist;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	 * adding and deleting hist entries must be done outside of this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	 * function since TEST_ASSERT_VAL() returns in case of failure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	hists__collapse_resort(hists, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	evsel__output_resort(hists_to_evsel(hists), NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	if (verbose > 2) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		pr_info("use callchain: %d, cumulate callchain: %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 			symbol_conf.use_callchain,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 			symbol_conf.cumulate_callchain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		print_hists_out(hists);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	root = &hists->entries.rb_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	for (node = rb_first(root), i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	     node && (he = rb_entry(node, struct hist_entry, rb_node));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	     node = rb_next(node), i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 		scnprintf(buf, sizeof(buf), "Invalid hist entry #%zd", i);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 		TEST_ASSERT_VAL("Incorrect number of hist entry",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 				i < nr_expected);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		TEST_ASSERT_VAL(buf, he->stat.period == expected[i].self &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 				!strcmp(COMM(he), expected[i].comm) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 				!strcmp(DSO(he), expected[i].dso) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 				!strcmp(SYM(he), expected[i].sym));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 		if (symbol_conf.cumulate_callchain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 			TEST_ASSERT_VAL(buf, he->stat_acc->period == expected[i].children);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 		if (!symbol_conf.use_callchain)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 			continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 		/* check callchain entries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 		root = &he->callchain->node.rb_root;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		TEST_ASSERT_VAL("callchains expected", !RB_EMPTY_ROOT(root));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 		cnode = rb_entry(rb_first(root), struct callchain_node, rb_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 		c = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 		list_for_each_entry(clist, &cnode->val, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 			scnprintf(buf, sizeof(buf), "Invalid callchain entry #%zd/%zd", i, c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 			TEST_ASSERT_VAL("Incorrect number of callchain entry",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 					c < expected_callchain[i].nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 			TEST_ASSERT_VAL(buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 				!strcmp(CDSO(clist), expected_callchain[i].node[c].dso) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 				!strcmp(CSYM(clist), expected_callchain[i].node[c].sym));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 			c++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 		/* TODO: handle multiple child nodes properly */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 		TEST_ASSERT_VAL("Incorrect number of callchain entry",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 				c <= expected_callchain[i].nr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	TEST_ASSERT_VAL("Incorrect number of hist entry",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 			i == nr_expected);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 	TEST_ASSERT_VAL("Incorrect number of callchain entry",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 			!symbol_conf.use_callchain || nr_expected == nr_callchain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) /* NO callchain + NO children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) static int test1(struct evsel *evsel, struct machine *machine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	struct hists *hists = evsel__hists(evsel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	 * expected output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	 * Overhead  Command  Shared Object          Symbol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	 * ========  =======  =============  ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	 *   20.00%     perf  perf           [.] main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	 *   10.00%     bash  [kernel]       [k] page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	 *   10.00%     bash  bash           [.] main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	 *   10.00%     bash  bash           [.] xmalloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	 *   10.00%     perf  [kernel]       [k] page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	 *   10.00%     perf  [kernel]       [k] schedule
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	 *   10.00%     perf  libc           [.] free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	 *   10.00%     perf  libc           [.] malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	 *   10.00%     perf  perf           [.] cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	struct result expected[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 		{ 0, 2000, "perf", "perf",     "main" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 		{ 0, 1000, "bash", "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 		{ 0, 1000, "bash", "bash",     "main" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 		{ 0, 1000, "bash", "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 		{ 0, 1000, "perf", "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 		{ 0, 1000, "perf", "[kernel]", "schedule" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 		{ 0, 1000, "perf", "libc",     "free" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 		{ 0, 1000, "perf", "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 		{ 0, 1000, "perf", "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	symbol_conf.use_callchain = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	symbol_conf.cumulate_callchain = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	evsel__reset_sample_bit(evsel, CALLCHAIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	setup_sorting(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	callchain_register_param(&callchain_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	err = add_hist_entries(hists, machine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	err = do_test(hists, expected, ARRAY_SIZE(expected), NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	del_hist_entries(hists);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	reset_output_field();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) /* callcain + NO children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) static int test2(struct evsel *evsel, struct machine *machine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	struct hists *hists = evsel__hists(evsel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	 * expected output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	 * Overhead  Command  Shared Object          Symbol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	 * ========  =======  =============  ==============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	 *   20.00%     perf  perf           [.] main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	 *              --- main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	 *   10.00%     bash  [kernel]       [k] page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	 *              --- page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	 *                  malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	 *   10.00%     bash  bash           [.] main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	 *              --- main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	 *   10.00%     bash  bash           [.] xmalloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	 *              --- xmalloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	 *                  malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 	 *                  xmalloc     <--- NOTE: there's a cycle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	 *                  malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	 *                  xmalloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	 *   10.00%     perf  [kernel]       [k] page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	 *              --- page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 	 *                  sys_perf_event_open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	 *   10.00%     perf  [kernel]       [k] schedule
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 	 *              --- schedule
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	 *   10.00%     perf  libc           [.] free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	 *              --- free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 	 *                  cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	 *   10.00%     perf  libc           [.] malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	 *              --- malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	 *                  cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	 *   10.00%     perf  perf           [.] cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 	 *              --- cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 	struct result expected[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 		{ 0, 2000, "perf", "perf",     "main" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 		{ 0, 1000, "bash", "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 		{ 0, 1000, "bash", "bash",     "main" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 		{ 0, 1000, "bash", "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 		{ 0, 1000, "perf", "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 		{ 0, 1000, "perf", "[kernel]", "schedule" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 		{ 0, 1000, "perf", "libc",     "free" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 		{ 0, 1000, "perf", "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 		{ 0, 1000, "perf", "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	struct callchain_result expected_callchain[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 			1, {	{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 			3, {	{ "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 				{ "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 				{ "bash",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 			1, {	{ "bash",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 			6, {	{ "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 				{ "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 				{ "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 				{ "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 				{ "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 				{ "bash",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 			4, {	{ "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 				{ "[kernel]", "sys_perf_event_open" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 			3, {	{ "[kernel]", "schedule" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 			4, {	{ "libc",     "free" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 				{ "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 			4, {	{ "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 				{ "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 			3, {	{ "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 	symbol_conf.use_callchain = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 	symbol_conf.cumulate_callchain = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 	evsel__set_sample_bit(evsel, CALLCHAIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 	setup_sorting(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	callchain_register_param(&callchain_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	err = add_hist_entries(hists, machine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 	err = do_test(hists, expected, ARRAY_SIZE(expected),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 		      expected_callchain, ARRAY_SIZE(expected_callchain));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	del_hist_entries(hists);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	reset_output_field();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) /* NO callchain + children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) static int test3(struct evsel *evsel, struct machine *machine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	struct hists *hists = evsel__hists(evsel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 	 * expected output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	 * Children      Self  Command  Shared Object                   Symbol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	 * ========  ========  =======  =============  =======================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	 *   70.00%    20.00%     perf  perf           [.] main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 	 *   50.00%     0.00%     perf  perf           [.] run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	 *   30.00%    10.00%     bash  bash           [.] main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	 *   30.00%    10.00%     perf  perf           [.] cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	 *   20.00%     0.00%     bash  libc           [.] malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 	 *   10.00%    10.00%     bash  [kernel]       [k] page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	 *   10.00%    10.00%     bash  bash           [.] xmalloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 	 *   10.00%    10.00%     perf  [kernel]       [k] page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	 *   10.00%    10.00%     perf  libc           [.] malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 	 *   10.00%    10.00%     perf  [kernel]       [k] schedule
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 	 *   10.00%    10.00%     perf  libc           [.] free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	 *   10.00%     0.00%     perf  [kernel]       [k] sys_perf_event_open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 	struct result expected[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 		{ 7000, 2000, "perf", "perf",     "main" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 		{ 5000,    0, "perf", "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 		{ 3000, 1000, "bash", "bash",     "main" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 		{ 3000, 1000, "perf", "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 		{ 2000,    0, "bash", "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 		{ 1000, 1000, "bash", "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 		{ 1000, 1000, "bash", "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 		{ 1000, 1000, "perf", "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 		{ 1000, 1000, "perf", "[kernel]", "schedule" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 		{ 1000, 1000, "perf", "libc",     "free" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 		{ 1000, 1000, "perf", "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 		{ 1000,    0, "perf", "[kernel]", "sys_perf_event_open" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 	symbol_conf.use_callchain = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 	symbol_conf.cumulate_callchain = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) 	evsel__reset_sample_bit(evsel, CALLCHAIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 	setup_sorting(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 	callchain_register_param(&callchain_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 	err = add_hist_entries(hists, machine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 	err = do_test(hists, expected, ARRAY_SIZE(expected), NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 	del_hist_entries(hists);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 	reset_output_field();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) /* callchain + children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) static int test4(struct evsel *evsel, struct machine *machine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 	struct hists *hists = evsel__hists(evsel);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 	 * expected output:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 	 * Children      Self  Command  Shared Object                   Symbol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) 	 * ========  ========  =======  =============  =======================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 	 *   70.00%    20.00%     perf  perf           [.] main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 	 *              --- main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 	 *   50.00%     0.00%     perf  perf           [.] run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 	 *              --- run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 	 *   30.00%    10.00%     bash  bash           [.] main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 	 *              --- main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 	 *   30.00%    10.00%     perf  perf           [.] cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 	 *              --- cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 	 *   20.00%     0.00%     bash  libc           [.] malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) 	 *              --- malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 	 *                 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 	 *                 |--50.00%-- xmalloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) 	 *                 |           main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 	 *                  --50.00%-- main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 	 *   10.00%    10.00%     bash  [kernel]       [k] page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 	 *              --- page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 	 *                  malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 	 *   10.00%    10.00%     bash  bash           [.] xmalloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 	 *              --- xmalloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 	 *                  malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 	 *                  xmalloc     <--- NOTE: there's a cycle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 	 *                  malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 	 *                  xmalloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 	 *   10.00%     0.00%     perf  [kernel]       [k] sys_perf_event_open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 	 *              --- sys_perf_event_open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 	 *   10.00%    10.00%     perf  [kernel]       [k] page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 	 *              --- page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 	 *                  sys_perf_event_open
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 	 *   10.00%    10.00%     perf  [kernel]       [k] schedule
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 	 *              --- schedule
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 	 *   10.00%    10.00%     perf  libc           [.] free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 	 *              --- free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) 	 *                  cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) 	 *   10.00%    10.00%     perf  libc           [.] malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 	 *              |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 	 *              --- malloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 	 *                  cmd_record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 	 *                  run_command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) 	 *                  main
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 	 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) 	struct result expected[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 		{ 7000, 2000, "perf", "perf",     "main" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 		{ 5000,    0, "perf", "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 		{ 3000, 1000, "bash", "bash",     "main" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 		{ 3000, 1000, "perf", "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 		{ 2000,    0, "bash", "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) 		{ 1000, 1000, "bash", "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 		{ 1000, 1000, "bash", "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) 		{ 1000,    0, "perf", "[kernel]", "sys_perf_event_open" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) 		{ 1000, 1000, "perf", "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 		{ 1000, 1000, "perf", "[kernel]", "schedule" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 		{ 1000, 1000, "perf", "libc",     "free" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 		{ 1000, 1000, "perf", "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 	struct callchain_result expected_callchain[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 			1, {	{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 			2, {	{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 			1, {	{ "bash",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) 			3, {	{ "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 			4, {	{ "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) 				{ "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) 				{ "bash",     "main" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 				{ "bash",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 			3, {	{ "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) 				{ "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 				{ "bash",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 			6, {	{ "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) 				{ "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) 				{ "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) 				{ "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) 				{ "bash",     "xmalloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) 				{ "bash",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) 			3, {	{ "[kernel]", "sys_perf_event_open" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) 			4, {	{ "[kernel]", "page_fault" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) 				{ "[kernel]", "sys_perf_event_open" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) 			3, {	{ "[kernel]", "schedule" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 			4, {	{ "libc",     "free" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) 				{ "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 		{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) 			4, {	{ "libc",     "malloc" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) 				{ "perf",     "cmd_record" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) 				{ "perf",     "run_command" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) 				{ "perf",     "main" }, },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) 		},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) 	symbol_conf.use_callchain = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) 	symbol_conf.cumulate_callchain = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) 	evsel__set_sample_bit(evsel, CALLCHAIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) 	setup_sorting(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) 	callchain_param = callchain_param_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) 	callchain_register_param(&callchain_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) 	err = add_hist_entries(hists, machine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) 	err = do_test(hists, expected, ARRAY_SIZE(expected),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) 		      expected_callchain, ARRAY_SIZE(expected_callchain));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) 	del_hist_entries(hists);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) 	reset_output_field();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) int test__hists_cumulate(struct test *test __maybe_unused, int subtest __maybe_unused)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) 	int err = TEST_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) 	struct machines machines;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) 	struct machine *machine;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) 	struct evsel *evsel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) 	struct evlist *evlist = evlist__new();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) 	size_t i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) 	test_fn_t testcases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) 		test1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) 		test2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) 		test3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 		test4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) 	TEST_ASSERT_VAL("No memory", evlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) 	err = parse_events(evlist, "cpu-clock", NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) 	if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) 	err = TEST_FAIL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 	machines__init(&machines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) 	/* setup threads/dso/map/symbols also */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) 	machine = setup_fake_machine(&machines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) 	if (!machine)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) 		goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) 	if (verbose > 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) 		machine__fprintf(machine, stderr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) 	evsel = evlist__first(evlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) 	for (i = 0; i < ARRAY_SIZE(testcases); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) 		err = testcases[i](evsel, machine);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) 		if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) 			break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 	/* tear down everything */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) 	evlist__delete(evlist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) 	machines__exit(&machines);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) 	return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) }