* [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure @ 2024-03-28 5:58 Yang Jihong 2024-03-28 5:58 ` [PATCH 2/2] perf evsel: Use evsel__name_is() helper Yang Jihong 2024-03-28 16:02 ` [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure Ian Rogers 0 siblings, 2 replies; 8+ messages in thread From: Yang Jihong @ 2024-03-28 5:58 UTC (permalink / raw) To: peterz, mingo, acme, namhyung, mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, kan.liang, james.clark, linux-perf-users, linux-kernel Cc: yangjihong When perf-sched enables the call-graph recording, sample_type of dummy event does not have PERF_SAMPLE_CALLCHAIN, timehist_check_attr() checks that the evsel does not have a callchain, and set show_callchain to 0. Currently perf sched timehist only saves callchain when processing sched:sched_switch event, timehist_check_attr() only needs to determine whether the event has PERF_SAMPLE_CALLCHAIN. Before: # perf sched record -g true [ perf record: Woken up 0 times to write data ] [ perf record: Captured and wrote 4.153 MB perf.data (7536 samples) ] # perf sched timehist Samples do not have callchains. time cpu task name wait time sch delay run time [tid/pid] (msec) (msec) (msec) --------------- ------ ------------------------------ --------- --------- --------- 147851.826019 [0000] perf[285035] 0.000 0.000 0.000 147851.826029 [0000] migration/0[15] 0.000 0.003 0.009 147851.826063 [0001] perf[285035] 0.000 0.000 0.000 147851.826069 [0001] migration/1[21] 0.000 0.003 0.006 <SNIP> After: # perf sched record -g true [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 2.572 MB perf.data (822 samples) ] # perf sched timehist time cpu task name wait time sch delay run time [tid/pid] (msec) (msec) (msec) --------------- ------ ------------------------------ --------- --------- --------- 144193.035164 [0000] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion 144193.035174 [0000] migration/0[15] 0.000 0.003 0.009 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork 144193.035207 [0001] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion 144193.035214 [0001] migration/1[21] 0.000 0.003 0.007 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork <SNIP> Signed-off-by: Yang Jihong <yangjihong@bytedance.com> --- tools/perf/builtin-sched.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index b248c433529a..1bfb22347371 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -2963,8 +2963,11 @@ static int timehist_check_attr(struct perf_sched *sched, return -1; } - if (sched->show_callchain && !evsel__has_callchain(evsel)) { - pr_info("Samples do not have callchains.\n"); + /* only need to save callchain related to sched_switch event */ + if (sched->show_callchain && + evsel__name_is(evsel, "sched:sched_switch") && + !evsel__has_callchain(evsel)) { + pr_info("Samples of sched_switch event do not have callchains.\n"); sched->show_callchain = 0; symbol_conf.use_callchain = 0; } -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/2] perf evsel: Use evsel__name_is() helper 2024-03-28 5:58 [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure Yang Jihong @ 2024-03-28 5:58 ` Yang Jihong 2024-03-28 16:06 ` Ian Rogers 2024-03-28 16:02 ` [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure Ian Rogers 1 sibling, 1 reply; 8+ messages in thread From: Yang Jihong @ 2024-03-28 5:58 UTC (permalink / raw) To: peterz, mingo, acme, namhyung, mark.rutland, alexander.shishkin, jolsa, irogers, adrian.hunter, kan.liang, james.clark, linux-perf-users, linux-kernel Cc: yangjihong Code cleanup, replace strcmp(evsel__name(evsel, {NAME})) with evsel__name_is() helper. No functional change. Signed-off-by: Yang Jihong <yangjihong@bytedance.com> --- tools/perf/builtin-kmem.c | 2 +- tools/perf/builtin-sched.c | 4 +-- tools/perf/builtin-script.c | 2 +- tools/perf/builtin-trace.c | 4 +-- tools/perf/tests/evsel-roundtrip-name.c | 4 +-- tools/perf/tests/parse-events.c | 39 +++++++++---------------- 6 files changed, 22 insertions(+), 33 deletions(-) diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 9714327fd0ea..6fd95be5032b 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c @@ -1408,7 +1408,7 @@ static int __cmd_kmem(struct perf_session *session) } evlist__for_each_entry(session->evlist, evsel) { - if (!strcmp(evsel__name(evsel), "kmem:mm_page_alloc") && + if (evsel__name_is(evsel, "kmem:mm_page_alloc") && evsel__field(evsel, "pfn")) { use_pfn = true; break; diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 1bfb22347371..0fce7d8986c0 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c @@ -2148,7 +2148,7 @@ static bool is_idle_sample(struct perf_sample *sample, struct evsel *evsel) { /* pid 0 == swapper == idle task */ - if (strcmp(evsel__name(evsel), "sched:sched_switch") == 0) + if (evsel__name_is(evsel, "sched:sched_switch")) return evsel__intval(evsel, sample, "prev_pid") == 0; return sample->pid == 0; @@ -2375,7 +2375,7 @@ static bool timehist_skip_sample(struct perf_sched *sched, } if (sched->idle_hist) { - if (strcmp(evsel__name(evsel), "sched:sched_switch")) + if (!evsel__name_is(evsel, "sched:sched_switch")) rc = true; else if (evsel__intval(evsel, sample, "prev_pid") != 0 && evsel__intval(evsel, sample, "next_pid") != 0) diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 37088cc0ff1b..cc981531ec00 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -3471,7 +3471,7 @@ static int check_ev_match(char *dir_name, char *scriptname, match = 0; evlist__for_each_entry(session->evlist, pos) { - if (!strcmp(evsel__name(pos), evname)) { + if (evsel__name_is(pos, evname)) { match = 1; break; } diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 90eaff8c0f6e..9b93807a1906 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c @@ -4902,7 +4902,7 @@ int cmd_trace(int argc, const char **argv) goto out; } trace.syscalls.events.bpf_output = evlist__last(trace.evlist); - assert(!strcmp(evsel__name(trace.syscalls.events.bpf_output), "__augmented_syscalls__")); + assert(evsel__name_is(trace.syscalls.events.bpf_output), "__augmented_syscalls__"); skip_augmentation: #endif err = -1; @@ -4959,7 +4959,7 @@ int cmd_trace(int argc, const char **argv) */ if (trace.syscalls.events.bpf_output) { evlist__for_each_entry(trace.evlist, evsel) { - bool raw_syscalls_sys_exit = strcmp(evsel__name(evsel), "raw_syscalls:sys_exit") == 0; + bool raw_syscalls_sys_exit = evsel__name_is(evsel, "raw_syscalls:sys_exit"); if (raw_syscalls_sys_exit) { trace.raw_augmented_syscalls = true; diff --git a/tools/perf/tests/evsel-roundtrip-name.c b/tools/perf/tests/evsel-roundtrip-name.c index 15ff86f9da0b..1922cac13a24 100644 --- a/tools/perf/tests/evsel-roundtrip-name.c +++ b/tools/perf/tests/evsel-roundtrip-name.c @@ -37,7 +37,7 @@ static int perf_evsel__roundtrip_cache_name_test(void) continue; } evlist__for_each_entry(evlist, evsel) { - if (strcmp(evsel__name(evsel), name)) { + if (!evsel__name_is(evsel, name)) { pr_debug("%s != %s\n", evsel__name(evsel), name); ret = TEST_FAIL; } @@ -71,7 +71,7 @@ static int perf_evsel__name_array_test(const char *const names[], int nr_names) continue; } evlist__for_each_entry(evlist, evsel) { - if (strcmp(evsel__name(evsel), names[i])) { + if (!evsel__name_is(evsel, names[i])) { pr_debug("%s != %s\n", evsel__name(evsel), names[i]); ret = TEST_FAIL; } diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c index feb5727584d1..0b70451451b3 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -470,8 +470,7 @@ static int test__checkevent_breakpoint_modifier(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "mem:0:u")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:u")); return test__checkevent_breakpoint(evlist); } @@ -484,8 +483,7 @@ static int test__checkevent_breakpoint_x_modifier(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "mem:0:x:k")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:x:k")); return test__checkevent_breakpoint_x(evlist); } @@ -498,8 +496,7 @@ static int test__checkevent_breakpoint_r_modifier(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "mem:0:r:hp")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:r:hp")); return test__checkevent_breakpoint_r(evlist); } @@ -512,8 +509,7 @@ static int test__checkevent_breakpoint_w_modifier(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "mem:0:w:up")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:w:up")); return test__checkevent_breakpoint_w(evlist); } @@ -526,8 +522,7 @@ static int test__checkevent_breakpoint_rw_modifier(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "mem:0:rw:kp")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:rw:kp")); return test__checkevent_breakpoint_rw(evlist); } @@ -540,8 +535,7 @@ static int test__checkevent_breakpoint_modifier_name(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "breakpoint")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); return test__checkevent_breakpoint(evlist); } @@ -554,8 +548,7 @@ static int test__checkevent_breakpoint_x_modifier_name(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "breakpoint")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); return test__checkevent_breakpoint_x(evlist); } @@ -568,8 +561,7 @@ static int test__checkevent_breakpoint_r_modifier_name(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "breakpoint")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); return test__checkevent_breakpoint_r(evlist); } @@ -582,8 +574,7 @@ static int test__checkevent_breakpoint_w_modifier_name(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "breakpoint")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); return test__checkevent_breakpoint_w(evlist); } @@ -596,8 +587,7 @@ static int test__checkevent_breakpoint_rw_modifier_name(struct evlist *evlist) TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "breakpoint")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); return test__checkevent_breakpoint_rw(evlist); } @@ -609,12 +599,12 @@ static int test__checkevent_breakpoint_2_events(struct evlist *evlist) TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type); - TEST_ASSERT_VAL("wrong name", !strcmp(evsel__name(evsel), "breakpoint1")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint1")); evsel = evsel__next(evsel); TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type); - TEST_ASSERT_VAL("wrong name", !strcmp(evsel__name(evsel), "breakpoint2")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint2")); return TEST_OK; } @@ -691,15 +681,14 @@ static int test__checkevent_pmu_name(struct evlist *evlist) TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); TEST_ASSERT_VAL("wrong config", test_config(evsel, 1)); - TEST_ASSERT_VAL("wrong name", !strcmp(evsel__name(evsel), "krava")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "krava")); /* cpu/config=2/u" */ evsel = evsel__next(evsel); TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); TEST_ASSERT_VAL("wrong config", test_config(evsel, 2)); - TEST_ASSERT_VAL("wrong name", - !strcmp(evsel__name(evsel), "cpu/config=2/u")); + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "cpu/config=2/u")); return TEST_OK; } -- 2.25.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/2] perf evsel: Use evsel__name_is() helper 2024-03-28 5:58 ` [PATCH 2/2] perf evsel: Use evsel__name_is() helper Yang Jihong @ 2024-03-28 16:06 ` Ian Rogers 0 siblings, 0 replies; 8+ messages in thread From: Ian Rogers @ 2024-03-28 16:06 UTC (permalink / raw) To: Yang Jihong Cc: peterz, mingo, acme, namhyung, mark.rutland, alexander.shishkin, jolsa, adrian.hunter, kan.liang, james.clark, linux-perf-users, linux-kernel On Wed, Mar 27, 2024 at 10:59 PM Yang Jihong <yangjihong@bytedance.com> wrote: > > Code cleanup, replace strcmp(evsel__name(evsel, {NAME})) with > evsel__name_is() helper. > > No functional change. > > Signed-off-by: Yang Jihong <yangjihong@bytedance.com> Reviewed-by: Ian Rogers <irogers@google.com> Thanks, Ian > --- > tools/perf/builtin-kmem.c | 2 +- > tools/perf/builtin-sched.c | 4 +-- > tools/perf/builtin-script.c | 2 +- > tools/perf/builtin-trace.c | 4 +-- > tools/perf/tests/evsel-roundtrip-name.c | 4 +-- > tools/perf/tests/parse-events.c | 39 +++++++++---------------- > 6 files changed, 22 insertions(+), 33 deletions(-) > > diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c > index 9714327fd0ea..6fd95be5032b 100644 > --- a/tools/perf/builtin-kmem.c > +++ b/tools/perf/builtin-kmem.c > @@ -1408,7 +1408,7 @@ static int __cmd_kmem(struct perf_session *session) > } > > evlist__for_each_entry(session->evlist, evsel) { > - if (!strcmp(evsel__name(evsel), "kmem:mm_page_alloc") && > + if (evsel__name_is(evsel, "kmem:mm_page_alloc") && > evsel__field(evsel, "pfn")) { > use_pfn = true; > break; > diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c > index 1bfb22347371..0fce7d8986c0 100644 > --- a/tools/perf/builtin-sched.c > +++ b/tools/perf/builtin-sched.c > @@ -2148,7 +2148,7 @@ static bool is_idle_sample(struct perf_sample *sample, > struct evsel *evsel) > { > /* pid 0 == swapper == idle task */ > - if (strcmp(evsel__name(evsel), "sched:sched_switch") == 0) > + if (evsel__name_is(evsel, "sched:sched_switch")) > return evsel__intval(evsel, sample, "prev_pid") == 0; > > return sample->pid == 0; > @@ -2375,7 +2375,7 @@ static bool timehist_skip_sample(struct perf_sched *sched, > } > > if (sched->idle_hist) { > - if (strcmp(evsel__name(evsel), "sched:sched_switch")) > + if (!evsel__name_is(evsel, "sched:sched_switch")) > rc = true; > else if (evsel__intval(evsel, sample, "prev_pid") != 0 && > evsel__intval(evsel, sample, "next_pid") != 0) > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c > index 37088cc0ff1b..cc981531ec00 100644 > --- a/tools/perf/builtin-script.c > +++ b/tools/perf/builtin-script.c > @@ -3471,7 +3471,7 @@ static int check_ev_match(char *dir_name, char *scriptname, > > match = 0; > evlist__for_each_entry(session->evlist, pos) { > - if (!strcmp(evsel__name(pos), evname)) { > + if (evsel__name_is(pos, evname)) { > match = 1; > break; > } > diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c > index 90eaff8c0f6e..9b93807a1906 100644 > --- a/tools/perf/builtin-trace.c > +++ b/tools/perf/builtin-trace.c > @@ -4902,7 +4902,7 @@ int cmd_trace(int argc, const char **argv) > goto out; > } > trace.syscalls.events.bpf_output = evlist__last(trace.evlist); > - assert(!strcmp(evsel__name(trace.syscalls.events.bpf_output), "__augmented_syscalls__")); > + assert(evsel__name_is(trace.syscalls.events.bpf_output), "__augmented_syscalls__"); > skip_augmentation: > #endif > err = -1; > @@ -4959,7 +4959,7 @@ int cmd_trace(int argc, const char **argv) > */ > if (trace.syscalls.events.bpf_output) { > evlist__for_each_entry(trace.evlist, evsel) { > - bool raw_syscalls_sys_exit = strcmp(evsel__name(evsel), "raw_syscalls:sys_exit") == 0; > + bool raw_syscalls_sys_exit = evsel__name_is(evsel, "raw_syscalls:sys_exit"); > > if (raw_syscalls_sys_exit) { > trace.raw_augmented_syscalls = true; > diff --git a/tools/perf/tests/evsel-roundtrip-name.c b/tools/perf/tests/evsel-roundtrip-name.c > index 15ff86f9da0b..1922cac13a24 100644 > --- a/tools/perf/tests/evsel-roundtrip-name.c > +++ b/tools/perf/tests/evsel-roundtrip-name.c > @@ -37,7 +37,7 @@ static int perf_evsel__roundtrip_cache_name_test(void) > continue; > } > evlist__for_each_entry(evlist, evsel) { > - if (strcmp(evsel__name(evsel), name)) { > + if (!evsel__name_is(evsel, name)) { > pr_debug("%s != %s\n", evsel__name(evsel), name); > ret = TEST_FAIL; > } > @@ -71,7 +71,7 @@ static int perf_evsel__name_array_test(const char *const names[], int nr_names) > continue; > } > evlist__for_each_entry(evlist, evsel) { > - if (strcmp(evsel__name(evsel), names[i])) { > + if (!evsel__name_is(evsel, names[i])) { > pr_debug("%s != %s\n", evsel__name(evsel), names[i]); > ret = TEST_FAIL; > } > diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c > index feb5727584d1..0b70451451b3 100644 > --- a/tools/perf/tests/parse-events.c > +++ b/tools/perf/tests/parse-events.c > @@ -470,8 +470,7 @@ static int test__checkevent_breakpoint_modifier(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "mem:0:u")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:u")); > > return test__checkevent_breakpoint(evlist); > } > @@ -484,8 +483,7 @@ static int test__checkevent_breakpoint_x_modifier(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "mem:0:x:k")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:x:k")); > > return test__checkevent_breakpoint_x(evlist); > } > @@ -498,8 +496,7 @@ static int test__checkevent_breakpoint_r_modifier(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "mem:0:r:hp")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:r:hp")); > > return test__checkevent_breakpoint_r(evlist); > } > @@ -512,8 +509,7 @@ static int test__checkevent_breakpoint_w_modifier(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "mem:0:w:up")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:w:up")); > > return test__checkevent_breakpoint_w(evlist); > } > @@ -526,8 +522,7 @@ static int test__checkevent_breakpoint_rw_modifier(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "mem:0:rw:kp")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "mem:0:rw:kp")); > > return test__checkevent_breakpoint_rw(evlist); > } > @@ -540,8 +535,7 @@ static int test__checkevent_breakpoint_modifier_name(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "breakpoint")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); > > return test__checkevent_breakpoint(evlist); > } > @@ -554,8 +548,7 @@ static int test__checkevent_breakpoint_x_modifier_name(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", !evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "breakpoint")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); > > return test__checkevent_breakpoint_x(evlist); > } > @@ -568,8 +561,7 @@ static int test__checkevent_breakpoint_r_modifier_name(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", !evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "breakpoint")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); > > return test__checkevent_breakpoint_r(evlist); > } > @@ -582,8 +574,7 @@ static int test__checkevent_breakpoint_w_modifier_name(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "breakpoint")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); > > return test__checkevent_breakpoint_w(evlist); > } > @@ -596,8 +587,7 @@ static int test__checkevent_breakpoint_rw_modifier_name(struct evlist *evlist) > TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->core.attr.exclude_kernel); > TEST_ASSERT_VAL("wrong exclude_hv", evsel->core.attr.exclude_hv); > TEST_ASSERT_VAL("wrong precise_ip", evsel->core.attr.precise_ip); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "breakpoint")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint")); > > return test__checkevent_breakpoint_rw(evlist); > } > @@ -609,12 +599,12 @@ static int test__checkevent_breakpoint_2_events(struct evlist *evlist) > TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); > > TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type); > - TEST_ASSERT_VAL("wrong name", !strcmp(evsel__name(evsel), "breakpoint1")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint1")); > > evsel = evsel__next(evsel); > > TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->core.attr.type); > - TEST_ASSERT_VAL("wrong name", !strcmp(evsel__name(evsel), "breakpoint2")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "breakpoint2")); > > return TEST_OK; > } > @@ -691,15 +681,14 @@ static int test__checkevent_pmu_name(struct evlist *evlist) > TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); > TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); > TEST_ASSERT_VAL("wrong config", test_config(evsel, 1)); > - TEST_ASSERT_VAL("wrong name", !strcmp(evsel__name(evsel), "krava")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "krava")); > > /* cpu/config=2/u" */ > evsel = evsel__next(evsel); > TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries); > TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->core.attr.type); > TEST_ASSERT_VAL("wrong config", test_config(evsel, 2)); > - TEST_ASSERT_VAL("wrong name", > - !strcmp(evsel__name(evsel), "cpu/config=2/u")); > + TEST_ASSERT_VAL("wrong name", evsel__name_is(evsel, "cpu/config=2/u")); > > return TEST_OK; > } > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure 2024-03-28 5:58 [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure Yang Jihong 2024-03-28 5:58 ` [PATCH 2/2] perf evsel: Use evsel__name_is() helper Yang Jihong @ 2024-03-28 16:02 ` Ian Rogers 2024-03-29 3:02 ` [External] " Yang Jihong 1 sibling, 1 reply; 8+ messages in thread From: Ian Rogers @ 2024-03-28 16:02 UTC (permalink / raw) To: Yang Jihong Cc: peterz, mingo, acme, namhyung, mark.rutland, alexander.shishkin, jolsa, adrian.hunter, kan.liang, james.clark, linux-perf-users, linux-kernel On Wed, Mar 27, 2024 at 10:59 PM Yang Jihong <yangjihong@bytedance.com> wrote: > > When perf-sched enables the call-graph recording, sample_type of dummy > event does not have PERF_SAMPLE_CALLCHAIN, timehist_check_attr() checks > that the evsel does not have a callchain, and set show_callchain to 0. > > Currently perf sched timehist only saves callchain when processing > sched:sched_switch event, timehist_check_attr() only needs to determine > whether the event has PERF_SAMPLE_CALLCHAIN. > > Before: > # perf sched record -g true > [ perf record: Woken up 0 times to write data ] > [ perf record: Captured and wrote 4.153 MB perf.data (7536 samples) ] > # perf sched timehist > Samples do not have callchains. > time cpu task name wait time sch delay run time > [tid/pid] (msec) (msec) (msec) > --------------- ------ ------------------------------ --------- --------- --------- > 147851.826019 [0000] perf[285035] 0.000 0.000 0.000 > 147851.826029 [0000] migration/0[15] 0.000 0.003 0.009 > 147851.826063 [0001] perf[285035] 0.000 0.000 0.000 > 147851.826069 [0001] migration/1[21] 0.000 0.003 0.006 > <SNIP> > > After: > # perf sched record -g true > [ perf record: Woken up 1 times to write data ] > [ perf record: Captured and wrote 2.572 MB perf.data (822 samples) ] > # perf sched timehist > time cpu task name wait time sch delay run time > [tid/pid] (msec) (msec) (msec) > --------------- ------ ------------------------------ --------- --------- --------- > 144193.035164 [0000] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion > 144193.035174 [0000] migration/0[15] 0.000 0.003 0.009 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork > 144193.035207 [0001] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion > 144193.035214 [0001] migration/1[21] 0.000 0.003 0.007 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork > <SNIP> This looks good, should there be a Fixes tag for the sake of backports? Thanks, Ian > Signed-off-by: Yang Jihong <yangjihong@bytedance.com> > --- > tools/perf/builtin-sched.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c > index b248c433529a..1bfb22347371 100644 > --- a/tools/perf/builtin-sched.c > +++ b/tools/perf/builtin-sched.c > @@ -2963,8 +2963,11 @@ static int timehist_check_attr(struct perf_sched *sched, > return -1; > } > > - if (sched->show_callchain && !evsel__has_callchain(evsel)) { > - pr_info("Samples do not have callchains.\n"); > + /* only need to save callchain related to sched_switch event */ > + if (sched->show_callchain && > + evsel__name_is(evsel, "sched:sched_switch") && > + !evsel__has_callchain(evsel)) { > + pr_info("Samples of sched_switch event do not have callchains.\n"); > sched->show_callchain = 0; > symbol_conf.use_callchain = 0; > } > -- > 2.25.1 > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [External] Re: [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure 2024-03-28 16:02 ` [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure Ian Rogers @ 2024-03-29 3:02 ` Yang Jihong 2024-03-29 16:08 ` Ian Rogers 0 siblings, 1 reply; 8+ messages in thread From: Yang Jihong @ 2024-03-29 3:02 UTC (permalink / raw) To: Ian Rogers Cc: peterz, mingo, acme, namhyung, mark.rutland, alexander.shishkin, jolsa, adrian.hunter, kan.liang, james.clark, linux-perf-users, linux-kernel Hello, Sorry, due to the new email settings, the last reply email was in html format, resend it now. On 3/29/24 00:02, Ian Rogers wrote: > On Wed, Mar 27, 2024 at 10:59 PM Yang Jihong <yangjihong@bytedance.com> wrote: >> >> When perf-sched enables the call-graph recording, sample_type of dummy >> event does not have PERF_SAMPLE_CALLCHAIN, timehist_check_attr() checks >> that the evsel does not have a callchain, and set show_callchain to 0. >> >> Currently perf sched timehist only saves callchain when processing >> sched:sched_switch event, timehist_check_attr() only needs to determine >> whether the event has PERF_SAMPLE_CALLCHAIN. >> >> Before: >> # perf sched record -g true >> [ perf record: Woken up 0 times to write data ] >> [ perf record: Captured and wrote 4.153 MB perf.data (7536 samples) ] >> # perf sched timehist >> Samples do not have callchains. >> time cpu task name wait time sch delay run time >> [tid/pid] (msec) (msec) (msec) >> --------------- ------ ------------------------------ --------- --------- --------- >> 147851.826019 [0000] perf[285035] 0.000 0.000 0.000 >> 147851.826029 [0000] migration/0[15] 0.000 0.003 0.009 >> 147851.826063 [0001] perf[285035] 0.000 0.000 0.000 >> 147851.826069 [0001] migration/1[21] 0.000 0.003 0.006 >> <SNIP> >> >> After: >> # perf sched record -g true >> [ perf record: Woken up 1 times to write data ] >> [ perf record: Captured and wrote 2.572 MB perf.data (822 samples) ] >> # perf sched timehist >> time cpu task name wait time sch delay run time >> [tid/pid] (msec) (msec) (msec) >> --------------- ------ ------------------------------ --------- --------- --------- >> 144193.035164 [0000] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion >> 144193.035174 [0000] migration/0[15] 0.000 0.003 0.009 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork >> 144193.035207 [0001] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion >> 144193.035214 [0001] migration/1[21] 0.000 0.003 0.007 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork >> <SNIP> > > This looks good, should there be a Fixes tag for the sake of backports? > The direct cause is commit 9c95e4ef0657 ("perf evlist: Add evlist__findnew_tracking_event() helper"). perf-record uses evlist__add_aux_dummy() to replace evlist__add_dummy() to add a dummy event. The difference is that evlist__add_aux_dummy() sets no_aux_samples to true (this is expected behavior, for dummy event, no need to sample aux data), resulting in evsel__config() not adding the PERF_SAMPLE_CALLCHAIN bit to dummy's sample_type. In summary, the direct cause is the problem introduced by commit 9c95e4ef0657 ("perf evlist: Add evlist__findnew_tracking_event() helper"), but the root cause is the timehist_check_attr() logic problem, The dummy event itself does not need to have PERF_SAMPLE_CALLCHAIN, so there is no need to check it. So, maybe add fixes-tag: Fixes: 9c95e4ef0657 ("perf evlist: Add evlist__findnew_tracking_event() helper") If it is ok, I will send v2 version with this fixes-tag. Thanks, Yang ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [External] Re: [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure 2024-03-29 3:02 ` [External] " Yang Jihong @ 2024-03-29 16:08 ` Ian Rogers 2024-03-30 14:48 ` Arnaldo Carvalho de Melo 0 siblings, 1 reply; 8+ messages in thread From: Ian Rogers @ 2024-03-29 16:08 UTC (permalink / raw) To: Yang Jihong Cc: peterz, mingo, acme, namhyung, mark.rutland, alexander.shishkin, jolsa, adrian.hunter, kan.liang, james.clark, linux-perf-users, linux-kernel On Thu, Mar 28, 2024 at 8:02 PM Yang Jihong <yangjihong@bytedance.com> wrote: > > Hello, > > Sorry, due to the new email settings, the last reply email was in html > format, resend it now. > > On 3/29/24 00:02, Ian Rogers wrote: > > On Wed, Mar 27, 2024 at 10:59 PM Yang Jihong <yangjihong@bytedance.com> wrote: > >> > >> When perf-sched enables the call-graph recording, sample_type of dummy > >> event does not have PERF_SAMPLE_CALLCHAIN, timehist_check_attr() checks > >> that the evsel does not have a callchain, and set show_callchain to 0. > >> > >> Currently perf sched timehist only saves callchain when processing > >> sched:sched_switch event, timehist_check_attr() only needs to determine > >> whether the event has PERF_SAMPLE_CALLCHAIN. > >> > >> Before: > >> # perf sched record -g true > >> [ perf record: Woken up 0 times to write data ] > >> [ perf record: Captured and wrote 4.153 MB perf.data (7536 samples) ] > >> # perf sched timehist > >> Samples do not have callchains. > >> time cpu task name wait time sch delay run time > >> [tid/pid] (msec) (msec) (msec) > >> --------------- ------ ------------------------------ --------- --------- --------- > >> 147851.826019 [0000] perf[285035] 0.000 0.000 0.000 > >> 147851.826029 [0000] migration/0[15] 0.000 0.003 0.009 > >> 147851.826063 [0001] perf[285035] 0.000 0.000 0.000 > >> 147851.826069 [0001] migration/1[21] 0.000 0.003 0.006 > >> <SNIP> > >> > >> After: > >> # perf sched record -g true > >> [ perf record: Woken up 1 times to write data ] > >> [ perf record: Captured and wrote 2.572 MB perf.data (822 samples) ] > >> # perf sched timehist > >> time cpu task name wait time sch delay run time > >> [tid/pid] (msec) (msec) (msec) > >> --------------- ------ ------------------------------ --------- --------- --------- > >> 144193.035164 [0000] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion > >> 144193.035174 [0000] migration/0[15] 0.000 0.003 0.009 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork > >> 144193.035207 [0001] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion > >> 144193.035214 [0001] migration/1[21] 0.000 0.003 0.007 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork > >> <SNIP> > > > > This looks good, should there be a Fixes tag for the sake of backports? > > > The direct cause is commit 9c95e4ef0657 ("perf evlist: Add > evlist__findnew_tracking_event() helper"). perf-record uses > evlist__add_aux_dummy() to replace evlist__add_dummy() to add a dummy > event. The difference is that evlist__add_aux_dummy() sets > no_aux_samples to true (this is expected behavior, for dummy event, no > need to sample aux data), resulting in evsel__config() not adding the > PERF_SAMPLE_CALLCHAIN bit to dummy's sample_type. > > In summary, the direct cause is the problem introduced by commit > 9c95e4ef0657 ("perf evlist: Add evlist__findnew_tracking_event() > helper"), but the root cause is the timehist_check_attr() logic problem, > The dummy event itself does not need to have PERF_SAMPLE_CALLCHAIN, so > there is no need to check it. > > > So, maybe add fixes-tag: > > Fixes: 9c95e4ef0657 ("perf evlist: Add evlist__findnew_tracking_event() > helper") > > If it is ok, I will send v2 version with this fixes-tag. I think the maintainer can add the fixes tag when they add the reviewed-by tag: Reviewed-by: Ian Rogers <irogers@google.com> Thanks, Ian > Thanks, > Yang ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [External] Re: [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure 2024-03-29 16:08 ` Ian Rogers @ 2024-03-30 14:48 ` Arnaldo Carvalho de Melo 2024-04-01 1:50 ` Yang Jihong 0 siblings, 1 reply; 8+ messages in thread From: Arnaldo Carvalho de Melo @ 2024-03-30 14:48 UTC (permalink / raw) To: Ian Rogers Cc: Yang Jihong, peterz, mingo, namhyung, mark.rutland, alexander.shishkin, jolsa, adrian.hunter, kan.liang, james.clark, linux-perf-users, linux-kernel On Fri, Mar 29, 2024 at 09:08:01AM -0700, Ian Rogers wrote: > On Thu, Mar 28, 2024 at 8:02 PM Yang Jihong <yangjihong@bytedance.com> wrote: > > > > Hello, > > > > Sorry, due to the new email settings, the last reply email was in html > > format, resend it now. > > > > On 3/29/24 00:02, Ian Rogers wrote: > > > On Wed, Mar 27, 2024 at 10:59 PM Yang Jihong <yangjihong@bytedance.com> wrote: > > >> > > >> When perf-sched enables the call-graph recording, sample_type of dummy > > >> event does not have PERF_SAMPLE_CALLCHAIN, timehist_check_attr() checks > > >> that the evsel does not have a callchain, and set show_callchain to 0. > > >> > > >> Currently perf sched timehist only saves callchain when processing > > >> sched:sched_switch event, timehist_check_attr() only needs to determine > > >> whether the event has PERF_SAMPLE_CALLCHAIN. > > >> > > >> Before: > > >> # perf sched record -g true > > >> [ perf record: Woken up 0 times to write data ] > > >> [ perf record: Captured and wrote 4.153 MB perf.data (7536 samples) ] > > >> # perf sched timehist > > >> Samples do not have callchains. > > >> time cpu task name wait time sch delay run time > > >> [tid/pid] (msec) (msec) (msec) > > >> --------------- ------ ------------------------------ --------- --------- --------- > > >> 147851.826019 [0000] perf[285035] 0.000 0.000 0.000 > > >> 147851.826029 [0000] migration/0[15] 0.000 0.003 0.009 > > >> 147851.826063 [0001] perf[285035] 0.000 0.000 0.000 > > >> 147851.826069 [0001] migration/1[21] 0.000 0.003 0.006 > > >> <SNIP> > > >> > > >> After: > > >> # perf sched record -g true > > >> [ perf record: Woken up 1 times to write data ] > > >> [ perf record: Captured and wrote 2.572 MB perf.data (822 samples) ] > > >> # perf sched timehist > > >> time cpu task name wait time sch delay run time > > >> [tid/pid] (msec) (msec) (msec) > > >> --------------- ------ ------------------------------ --------- --------- --------- > > >> 144193.035164 [0000] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion > > >> 144193.035174 [0000] migration/0[15] 0.000 0.003 0.009 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork > > >> 144193.035207 [0001] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion > > >> 144193.035214 [0001] migration/1[21] 0.000 0.003 0.007 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork > > >> <SNIP> > > > > > > This looks good, should there be a Fixes tag for the sake of backports? > > > > > The direct cause is commit 9c95e4ef0657 ("perf evlist: Add > > evlist__findnew_tracking_event() helper"). perf-record uses > > evlist__add_aux_dummy() to replace evlist__add_dummy() to add a dummy > > event. The difference is that evlist__add_aux_dummy() sets > > no_aux_samples to true (this is expected behavior, for dummy event, no > > need to sample aux data), resulting in evsel__config() not adding the > > PERF_SAMPLE_CALLCHAIN bit to dummy's sample_type. > > > > In summary, the direct cause is the problem introduced by commit > > 9c95e4ef0657 ("perf evlist: Add evlist__findnew_tracking_event() > > helper"), but the root cause is the timehist_check_attr() logic problem, > > The dummy event itself does not need to have PERF_SAMPLE_CALLCHAIN, so > > there is no need to check it. > > > > > > So, maybe add fixes-tag: > > > > Fixes: 9c95e4ef0657 ("perf evlist: Add evlist__findnew_tracking_event() > > helper") > > > > If it is ok, I will send v2 version with this fixes-tag. > > I think the maintainer can add the fixes tag when they add the reviewed-by tag: I usually do this, but if the submitter does it I'll have just to check that it is the right tag, helps a bit in processing. - Arnaldo > Reviewed-by: Ian Rogers <irogers@google.com> > > Thanks, > Ian > > > Thanks, > > Yang ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [External] Re: [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure 2024-03-30 14:48 ` Arnaldo Carvalho de Melo @ 2024-04-01 1:50 ` Yang Jihong 0 siblings, 0 replies; 8+ messages in thread From: Yang Jihong @ 2024-04-01 1:50 UTC (permalink / raw) To: Arnaldo Carvalho de Melo, Ian Rogers Cc: peterz, mingo, namhyung, mark.rutland, alexander.shishkin, jolsa, adrian.hunter, kan.liang, james.clark, linux-perf-users, linux-kernel Hello, On 3/30/24 22:48, Arnaldo Carvalho de Melo wrote: > On Fri, Mar 29, 2024 at 09:08:01AM -0700, Ian Rogers wrote: >> On Thu, Mar 28, 2024 at 8:02 PM Yang Jihong <yangjihong@bytedance.com> wrote: >>> >>> Hello, >>> >>> Sorry, due to the new email settings, the last reply email was in html >>> format, resend it now. >>> >>> On 3/29/24 00:02, Ian Rogers wrote: >>>> On Wed, Mar 27, 2024 at 10:59 PM Yang Jihong <yangjihong@bytedance.com> wrote: >>>>> >>>>> When perf-sched enables the call-graph recording, sample_type of dummy >>>>> event does not have PERF_SAMPLE_CALLCHAIN, timehist_check_attr() checks >>>>> that the evsel does not have a callchain, and set show_callchain to 0. >>>>> >>>>> Currently perf sched timehist only saves callchain when processing >>>>> sched:sched_switch event, timehist_check_attr() only needs to determine >>>>> whether the event has PERF_SAMPLE_CALLCHAIN. >>>>> >>>>> Before: >>>>> # perf sched record -g true >>>>> [ perf record: Woken up 0 times to write data ] >>>>> [ perf record: Captured and wrote 4.153 MB perf.data (7536 samples) ] >>>>> # perf sched timehist >>>>> Samples do not have callchains. >>>>> time cpu task name wait time sch delay run time >>>>> [tid/pid] (msec) (msec) (msec) >>>>> --------------- ------ ------------------------------ --------- --------- --------- >>>>> 147851.826019 [0000] perf[285035] 0.000 0.000 0.000 >>>>> 147851.826029 [0000] migration/0[15] 0.000 0.003 0.009 >>>>> 147851.826063 [0001] perf[285035] 0.000 0.000 0.000 >>>>> 147851.826069 [0001] migration/1[21] 0.000 0.003 0.006 >>>>> <SNIP> >>>>> >>>>> After: >>>>> # perf sched record -g true >>>>> [ perf record: Woken up 1 times to write data ] >>>>> [ perf record: Captured and wrote 2.572 MB perf.data (822 samples) ] >>>>> # perf sched timehist >>>>> time cpu task name wait time sch delay run time >>>>> [tid/pid] (msec) (msec) (msec) >>>>> --------------- ------ ------------------------------ --------- --------- --------- >>>>> 144193.035164 [0000] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion >>>>> 144193.035174 [0000] migration/0[15] 0.000 0.003 0.009 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork >>>>> 144193.035207 [0001] perf[277062] 0.000 0.000 0.000 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- preempt_schedule_common <- __cond_resched <- __wait_for_common <- wait_for_completion >>>>> 144193.035214 [0001] migration/1[21] 0.000 0.003 0.007 __traceiter_sched_switch <- __traceiter_sched_switch <- __sched_text_start <- smpboot_thread_fn <- kthread <- ret_from_fork >>>>> <SNIP> >>>> >>>> This looks good, should there be a Fixes tag for the sake of backports? >>>> >>> The direct cause is commit 9c95e4ef0657 ("perf evlist: Add >>> evlist__findnew_tracking_event() helper"). perf-record uses >>> evlist__add_aux_dummy() to replace evlist__add_dummy() to add a dummy >>> event. The difference is that evlist__add_aux_dummy() sets >>> no_aux_samples to true (this is expected behavior, for dummy event, no >>> need to sample aux data), resulting in evsel__config() not adding the >>> PERF_SAMPLE_CALLCHAIN bit to dummy's sample_type. >>> >>> In summary, the direct cause is the problem introduced by commit >>> 9c95e4ef0657 ("perf evlist: Add evlist__findnew_tracking_event() >>> helper"), but the root cause is the timehist_check_attr() logic problem, >>> The dummy event itself does not need to have PERF_SAMPLE_CALLCHAIN, so >>> there is no need to check it. >>> >>> >>> So, maybe add fixes-tag: >>> >>> Fixes: 9c95e4ef0657 ("perf evlist: Add evlist__findnew_tracking_event() >>> helper") >>> >>> If it is ok, I will send v2 version with this fixes-tag. >> >> I think the maintainer can add the fixes tag when they add the reviewed-by tag: > > I usually do this, but if the submitter does it I'll have just to check > that it is the right tag, helps a bit in processing. Okay, will send v2 version. > > - Arnaldo > >> Reviewed-by: Ian Rogers <irogers@google.com> Thanks for reviewed-by tag. Thanks, Yang ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-04-01 1:50 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2024-03-28 5:58 [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure Yang Jihong 2024-03-28 5:58 ` [PATCH 2/2] perf evsel: Use evsel__name_is() helper Yang Jihong 2024-03-28 16:06 ` Ian Rogers 2024-03-28 16:02 ` [PATCH 1/2] perf sched timehist: Fix -g/--call-graph option failure Ian Rogers 2024-03-29 3:02 ` [External] " Yang Jihong 2024-03-29 16:08 ` Ian Rogers 2024-03-30 14:48 ` Arnaldo Carvalho de Melo 2024-04-01 1:50 ` Yang Jihong
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.