^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) }