Lines Matching +full:measure +full:- +full:delay +full:- +full:time
1 // SPDX-License-Identifier: GPL-2.0
3 * builtin-kwork.c
26 #include <subcmd/parse-options.h>
27 #include <event-parse.h>
67 if (l->cpu > r->cpu) in id_cmp()
69 if (l->cpu < r->cpu) in id_cmp()
70 return -1; in id_cmp()
72 if (l->id > r->id) in id_cmp()
74 if (l->id < r->id) in id_cmp()
75 return -1; in id_cmp()
82 if (l->nr_atoms > r->nr_atoms) in count_cmp()
84 if (l->nr_atoms < r->nr_atoms) in count_cmp()
85 return -1; in count_cmp()
92 if (l->total_runtime > r->total_runtime) in runtime_cmp()
94 if (l->total_runtime < r->total_runtime) in runtime_cmp()
95 return -1; in runtime_cmp()
102 if (l->max_runtime > r->max_runtime) in max_runtime_cmp()
104 if (l->max_runtime < r->max_runtime) in max_runtime_cmp()
105 return -1; in max_runtime_cmp()
114 if (!r->nr_atoms) in avg_latency_cmp()
116 if (!l->nr_atoms) in avg_latency_cmp()
117 return -1; in avg_latency_cmp()
119 avgl = l->total_latency / l->nr_atoms; in avg_latency_cmp()
120 avgr = r->total_latency / r->nr_atoms; in avg_latency_cmp()
125 return -1; in avg_latency_cmp()
132 if (l->max_latency > r->max_latency) in max_latency_cmp()
134 if (l->max_latency < r->max_latency) in max_latency_cmp()
135 return -1; in max_latency_cmp()
142 if (l->cpu_usage > r->cpu_usage) in cpu_usage_cmp()
144 if (l->cpu_usage < r->cpu_usage) in cpu_usage_cmp()
145 return -1; in cpu_usage_cmp()
152 if (l->id < r->id) in id_or_cpu_r_cmp()
154 if (l->id > r->id) in id_or_cpu_r_cmp()
155 return -1; in id_or_cpu_r_cmp()
157 if (l->id != 0) in id_or_cpu_r_cmp()
160 if (l->cpu < r->cpu) in id_or_cpu_r_cmp()
162 if (l->cpu > r->cpu) in id_or_cpu_r_cmp()
163 return -1; in id_or_cpu_r_cmp()
210 if (kwork->report == KWORK_REPORT_LATENCY) in sort_dimension__add()
214 if (!strcmp(available_sorts[i]->name, tok)) { in sort_dimension__add()
215 list_add_tail(&available_sorts[i]->list, list); in sort_dimension__add()
220 return -1; in sort_dimension__add()
227 char *tmp, *tok, *str = strdup(kwork->sort_order); in setup_sorting()
231 if (sort_dimension__add(kwork, tok, &kwork->sort_list) < 0) in setup_sorting()
233 "Unknown --sort key: `%s'", tok); in setup_sorting()
236 pr_debug("Sort order: %s\n", kwork->sort_order); in setup_sorting()
247 list_for_each_entry(page, &kwork->atom_page_list, list) { in atom_new()
248 if (!bitmap_full(page->bitmap, NR_ATOM_PER_PAGE)) { in atom_new()
249 i = find_first_zero_bit(page->bitmap, NR_ATOM_PER_PAGE); in atom_new()
251 atom = &page->atoms[i]; in atom_new()
266 atom = &page->atoms[0]; in atom_new()
267 list_add_tail(&page->list, &kwork->atom_page_list); in atom_new()
270 __set_bit(i, page->bitmap); in atom_new()
271 atom->time = sample->time; in atom_new()
272 atom->prev = NULL; in atom_new()
273 atom->page_addr = page; in atom_new()
274 atom->bit_inpage = i; in atom_new()
280 if (atom->prev != NULL) in atom_free()
281 atom_free(atom->prev); in atom_free()
283 __clear_bit(atom->bit_inpage, in atom_free()
284 ((struct kwork_atom_page *)atom->page_addr)->bitmap); in atom_free()
289 list_del(&atom->list); in atom_del()
302 ret = sort->cmp(l, r); in work_cmp()
316 struct rb_node *node = root->rb_root.rb_node; in work_search()
322 node = node->rb_left; in work_search()
324 node = node->rb_right; in work_search()
326 if (work->name == NULL) in work_search()
327 work->name = key->name; in work_search()
340 struct rb_node **new = &(root->rb_root.rb_node), *parent = NULL; in work_insert()
348 new = &((*new)->rb_left); in work_insert()
350 new = &((*new)->rb_right); in work_insert()
355 rb_link_node(&key->node, parent, new); in work_insert()
356 rb_insert_color_cached(&key->node, root, leftmost); in work_insert()
370 INIT_LIST_HEAD(&work->atom_list[i]); in work_new()
372 work->id = key->id; in work_new()
373 work->cpu = key->cpu; in work_new()
374 work->name = key->name; in work_new()
375 work->class = key->class; in work_new()
398 if (!kwork->summary) in profile_update_timespan()
401 if ((kwork->timestart == 0) || (kwork->timestart > sample->time)) in profile_update_timespan()
402 kwork->timestart = sample->time; in profile_update_timespan()
404 if (kwork->timeend < sample->time) in profile_update_timespan()
405 kwork->timeend = sample->time; in profile_update_timespan()
411 if (kwork->profile_name && work->name && in profile_name_match()
412 (strcmp(work->name, kwork->profile_name) != 0)) { in profile_name_match()
423 int cpu = work->cpu; in profile_event_match()
424 u64 time = sample->time; in profile_event_match() local
425 struct perf_time_interval *ptime = &kwork->ptime; in profile_event_match()
427 if ((kwork->cpu_list != NULL) && !test_bit(cpu, kwork->cpu_bitmap)) in profile_event_match()
430 if (((ptime->start != 0) && (ptime->start > time)) || in profile_event_match()
431 ((ptime->end != 0) && (ptime->end < time))) in profile_event_match()
438 if ((kwork->report != KWORK_REPORT_TOP) && in profile_event_match()
460 BUG_ON(class->work_init == NULL); in work_push_atom()
461 class->work_init(kwork, class, &key, src_type, evsel, sample, machine); in work_push_atom()
465 return -1; in work_push_atom()
467 work = work_findnew(&class->work_root, &key, &kwork->cmp_id); in work_push_atom()
470 return -1; in work_push_atom()
479 dst_atom = list_last_entry_or_null(&work->atom_list[dst_type], in work_push_atom()
482 atom->prev = dst_atom; in work_push_atom()
483 list_del(&dst_atom->list); in work_push_atom()
491 last_atom = list_last_entry_or_null(&work->atom_list[src_type], in work_push_atom()
496 kwork->nr_skipped_events[src_type]++; in work_push_atom()
497 kwork->nr_skipped_events[KWORK_TRACE_MAX]++; in work_push_atom()
501 list_add_tail(&atom->list, &work->atom_list[src_type]); in work_push_atom()
518 BUG_ON(class->work_init == NULL); in work_pop_atom()
519 class->work_init(kwork, class, &key, src_type, evsel, sample, machine); in work_pop_atom()
521 work = work_findnew(&class->work_root, &key, &kwork->cmp_id); in work_pop_atom()
531 atom = list_last_entry_or_null(&work->atom_list[dst_type], in work_pop_atom()
538 list_add_tail(&src_atom->list, &work->atom_list[src_type]); in work_pop_atom()
556 if ((cpu != -1 && work->id == id && work->cpu == cpu) || in find_work_by_id()
557 (cpu == -1 && work->id == id)) in find_work_by_id()
571 list_for_each_entry(class, &kwork->class_list, list) { in get_kwork_class()
572 if (class->type == type) in get_kwork_class()
584 u64 exit_time = sample->time; in report_update_exit_event()
585 u64 entry_time = atom->time; in report_update_exit_event()
588 delta = exit_time - entry_time; in report_update_exit_event()
589 if ((delta > work->max_runtime) || in report_update_exit_event()
590 (work->max_runtime == 0)) { in report_update_exit_event()
591 work->max_runtime = delta; in report_update_exit_event()
592 work->max_runtime_start = entry_time; in report_update_exit_event()
593 work->max_runtime_end = exit_time; in report_update_exit_event()
595 work->total_runtime += delta; in report_update_exit_event()
596 work->nr_atoms++; in report_update_exit_event()
624 return -1; in report_exit_event()
639 u64 entry_time = sample->time; in latency_update_entry_event()
640 u64 raise_time = atom->time; in latency_update_entry_event()
643 delta = entry_time - raise_time; in latency_update_entry_event()
644 if ((delta > work->max_latency) || in latency_update_entry_event()
645 (work->max_latency == 0)) { in latency_update_entry_event()
646 work->max_latency = delta; in latency_update_entry_event()
647 work->max_latency_start = raise_time; in latency_update_entry_event()
648 work->max_latency_end = entry_time; in latency_update_entry_event()
650 work->total_latency += delta; in latency_update_entry_event()
651 work->nr_atoms++; in latency_update_entry_event()
679 return -1; in latency_entry_event()
699 if (!kwork->show_callchain || sample->callchain == NULL) in timehist_save_callchain()
702 /* want main thread for process - has maps */ in timehist_save_callchain()
703 thread = machine__findnew_thread(machine, sample->pid, sample->pid); in timehist_save_callchain()
705 pr_debug("Failed to get thread for pid %d\n", sample->pid); in timehist_save_callchain()
712 NULL, NULL, kwork->max_stack + 2) != 0) { in timehist_save_callchain()
724 sym = node->ms.sym; in timehist_save_callchain()
726 if (!strcmp(sym->name, "__softirqentry_text_start") || in timehist_save_callchain()
727 !strcmp(sym->name, "__do_softirq")) in timehist_save_callchain()
728 sym->ignore = 1; in timehist_save_callchain()
750 timestamp__scnprintf_usec(atom->time, in timehist_print_event()
757 timestamp__scnprintf_usec(sample->time, in timehist_print_event()
764 printf(" [%0*d] ", PRINT_CPU_WIDTH, work->cpu); in timehist_print_event()
769 if (work->class && work->class->work_name) { in timehist_print_event()
770 work->class->work_name(work, kwork_name, in timehist_print_event()
772 printf(" %-*s ", PRINT_KWORK_NAME_WIDTH, kwork_name); in timehist_print_event()
774 printf(" %-*s ", PRINT_KWORK_NAME_WIDTH, ""); in timehist_print_event()
781 (double)(sample->time - atom->time) / NSEC_PER_MSEC); in timehist_print_event()
786 if (atom->prev != NULL) in timehist_print_event()
788 (double)(atom->time - atom->prev->time) / NSEC_PER_MSEC); in timehist_print_event()
795 if (kwork->show_callchain) { in timehist_print_event()
860 ret = -1; in timehist_exit_event()
868 ret = -1; in timehist_exit_event()
873 work->nr_atoms++; in timehist_exit_event()
888 u64 exit_time = sample->time; in top_update_runtime()
889 u64 entry_time = atom->time; in top_update_runtime()
892 delta = exit_time - entry_time; in top_update_runtime()
893 work->total_runtime += delta; in top_update_runtime()
922 return -1; in top_exit_event()
927 sched_work = find_work_by_id(&sched_class->work_root, in top_exit_event()
928 work->id, work->cpu); in top_exit_event()
951 return -1; in top_sched_switch_event()
969 if (kwork->tp_handler->entry_event) in process_irq_handler_entry_event()
970 return kwork->tp_handler->entry_event(kwork, &kwork_irq, in process_irq_handler_entry_event()
982 if (kwork->tp_handler->exit_event) in process_irq_handler_exit_event()
983 return kwork->tp_handler->exit_event(kwork, &kwork_irq, in process_irq_handler_exit_event()
998 return -1; in irq_class_init()
1001 class->work_root = RB_ROOT_CACHED; in irq_class_init()
1013 work->class = class; in irq_work_init()
1014 work->cpu = sample->cpu; in irq_work_init()
1016 if (kwork->report == KWORK_REPORT_TOP) { in irq_work_init()
1017 work->id = evsel__intval_common(evsel, sample, "common_pid"); in irq_work_init()
1018 work->name = NULL; in irq_work_init()
1020 work->id = evsel__intval(evsel, sample, "irq"); in irq_work_init()
1021 work->name = evsel__strval(evsel, sample, "name"); in irq_work_init()
1027 snprintf(buf, len, "%s:%" PRIu64 "", work->name, work->id); in irq_work_name()
1048 if (kwork->tp_handler->raise_event) in process_softirq_raise_event()
1049 return kwork->tp_handler->raise_event(kwork, &kwork_softirq, in process_softirq_raise_event()
1062 if (kwork->tp_handler->entry_event) in process_softirq_entry_event()
1063 return kwork->tp_handler->entry_event(kwork, &kwork_softirq, in process_softirq_entry_event()
1076 if (kwork->tp_handler->exit_event) in process_softirq_exit_event()
1077 return kwork->tp_handler->exit_event(kwork, &kwork_softirq, in process_softirq_exit_event()
1095 return -1; in softirq_class_init()
1098 class->work_root = RB_ROOT_CACHED; in softirq_class_init()
1108 struct tep_print_arg *args = tp_format ? tp_format->print_fmt.args : NULL; in evsel__softirq_name()
1110 if ((args == NULL) || (args->next == NULL)) in evsel__softirq_name()
1113 /* skip softirq field: "REC->vec" */ in evsel__softirq_name()
1114 for (sym = args->next->symbol.symbols; sym != NULL; sym = sym->next) { in evsel__softirq_name()
1115 if ((eval_flag(sym->value) == (unsigned long long)num) && in evsel__softirq_name()
1116 (strlen(sym->str) != 0)) { in evsel__softirq_name()
1125 name = strdup(sym->str); in evsel__softirq_name()
1143 work->class = class; in softirq_work_init()
1144 work->cpu = sample->cpu; in softirq_work_init()
1146 if (kwork->report == KWORK_REPORT_TOP) { in softirq_work_init()
1147 work->id = evsel__intval_common(evsel, sample, "common_pid"); in softirq_work_init()
1148 work->name = NULL; in softirq_work_init()
1151 work->id = num; in softirq_work_init()
1152 work->name = evsel__softirq_name(evsel, num); in softirq_work_init()
1158 snprintf(buf, len, "(s)%s:%" PRIu64 "", work->name, work->id); in softirq_work_name()
1179 if (kwork->tp_handler->raise_event) in process_workqueue_activate_work_event()
1180 return kwork->tp_handler->raise_event(kwork, &kwork_workqueue, in process_workqueue_activate_work_event()
1193 if (kwork->tp_handler->entry_event) in process_workqueue_execute_start_event()
1194 return kwork->tp_handler->entry_event(kwork, &kwork_workqueue, in process_workqueue_execute_start_event()
1207 if (kwork->tp_handler->exit_event) in process_workqueue_execute_end_event()
1208 return kwork->tp_handler->exit_event(kwork, &kwork_workqueue, in process_workqueue_execute_end_event()
1226 return -1; in workqueue_class_init()
1229 class->work_root = RB_ROOT_CACHED; in workqueue_class_init()
1245 work->class = class; in workqueue_work_init()
1246 work->cpu = sample->cpu; in workqueue_work_init()
1247 work->id = evsel__intval(evsel, sample, "work"); in workqueue_work_init()
1248 work->name = function_addr == 0 ? NULL : in workqueue_work_init()
1254 if (work->name != NULL) in workqueue_work_name()
1255 snprintf(buf, len, "(w)%s", work->name); in workqueue_work_name()
1257 snprintf(buf, len, "(w)0x%" PRIx64, work->id); in workqueue_work_name()
1278 if (kwork->tp_handler->sched_switch_event) in process_sched_switch_event()
1279 return kwork->tp_handler->sched_switch_event(kwork, &kwork_sched, in process_sched_switch_event()
1294 return -1; in sched_class_init()
1297 class->work_root = RB_ROOT_CACHED; in sched_class_init()
1309 work->class = class; in sched_work_init()
1310 work->cpu = sample->cpu; in sched_work_init()
1313 work->id = evsel__intval(evsel, sample, "prev_pid"); in sched_work_init()
1314 work->name = strdup(evsel__strval(evsel, sample, "prev_comm")); in sched_work_init()
1316 work->id = evsel__intval(evsel, sample, "next_pid"); in sched_work_init()
1317 work->name = strdup(evsel__strval(evsel, sample, "next_comm")); in sched_work_init()
1323 snprintf(buf, len, "%s", work->name); in sched_work_name()
1360 if (work->class && work->class->work_name) { in report_print_work()
1361 work->class->work_name(work, kwork_name, in report_print_work()
1363 ret += printf(" %-*s |", PRINT_KWORK_NAME_WIDTH, kwork_name); in report_print_work()
1365 ret += printf(" %-*s |", PRINT_KWORK_NAME_WIDTH, ""); in report_print_work()
1371 ret += printf(" %0*d |", PRINT_CPU_WIDTH, work->cpu); in report_print_work()
1376 if (kwork->report == KWORK_REPORT_RUNTIME) { in report_print_work()
1379 (double)work->total_runtime / NSEC_PER_MSEC); in report_print_work()
1380 } else if (kwork->report == KWORK_REPORT_LATENCY) { // avg delay in report_print_work()
1383 (double)work->total_latency / in report_print_work()
1384 work->nr_atoms / NSEC_PER_MSEC); in report_print_work()
1390 ret += printf(" %*" PRIu64 " |", PRINT_COUNT_WIDTH, work->nr_atoms); in report_print_work()
1395 if (kwork->report == KWORK_REPORT_RUNTIME) { in report_print_work()
1396 timestamp__scnprintf_usec(work->max_runtime_start, in report_print_work()
1399 timestamp__scnprintf_usec(work->max_runtime_end, in report_print_work()
1404 (double)work->max_runtime / NSEC_PER_MSEC, in report_print_work()
1409 * max delay, max delay start, max delay end in report_print_work()
1411 else if (kwork->report == KWORK_REPORT_LATENCY) { in report_print_work()
1412 timestamp__scnprintf_usec(work->max_latency_start, in report_print_work()
1415 timestamp__scnprintf_usec(work->max_latency_end, in report_print_work()
1420 (double)work->max_latency / NSEC_PER_MSEC, in report_print_work()
1434 ret = printf(" %-*s | %-*s |", in report_print_header()
1438 if (kwork->report == KWORK_REPORT_RUNTIME) { in report_print_header()
1439 ret += printf(" %-*s |", in report_print_header()
1441 } else if (kwork->report == KWORK_REPORT_LATENCY) { in report_print_header()
1442 ret += printf(" %-*s |", in report_print_header()
1443 PRINT_LATENCY_HEADER_WIDTH, "Avg delay"); in report_print_header()
1446 ret += printf(" %-*s |", PRINT_COUNT_WIDTH, "Count"); in report_print_header()
1448 if (kwork->report == KWORK_REPORT_RUNTIME) { in report_print_header()
1449 ret += printf(" %-*s | %-*s | %-*s |", in report_print_header()
1453 } else if (kwork->report == KWORK_REPORT_LATENCY) { in report_print_header()
1454 ret += printf(" %-*s | %-*s | %-*s |", in report_print_header()
1455 PRINT_LATENCY_HEADER_WIDTH, "Max delay", in report_print_header()
1456 PRINT_TIMESTAMP_HEADER_WIDTH, "Max delay start", in report_print_header()
1457 PRINT_TIMESTAMP_HEADER_WIDTH, "Max delay end"); in report_print_header()
1470 printf(" %-*s %-*s %-*s %-*s %-*s %-*s\n", in timehist_print_header()
1481 printf(" %-*s %-*s %-*s %-*s %-*s %-*s\n", in timehist_print_header()
1503 u64 time = kwork->timeend - kwork->timestart; in print_summary() local
1505 printf(" Total count : %9" PRIu64 "\n", kwork->all_count); in print_summary()
1507 (double)kwork->all_runtime / NSEC_PER_MSEC, in print_summary()
1508 time == 0 ? 0 : (double)kwork->all_runtime / time); in print_summary()
1509 printf(" Total time span (msec) : %9.3f\n", in print_summary()
1510 (double)time / NSEC_PER_MSEC); in print_summary()
1533 if ((kwork->nr_skipped_events[KWORK_TRACE_MAX] != 0) && in print_skipped_events()
1534 (kwork->nr_events != 0)) { in print_skipped_events()
1536 (double)kwork->nr_skipped_events[KWORK_TRACE_MAX] / in print_skipped_events()
1537 (double)kwork->nr_events * 100.0, in print_skipped_events()
1538 kwork->nr_skipped_events[KWORK_TRACE_MAX]); in print_skipped_events()
1542 kwork->nr_skipped_events[i], in print_skipped_events()
1544 (i == KWORK_TRACE_MAX - 1) ? ")\n" : ", "); in print_skipped_events()
1550 nr_list_entry(&kwork->atom_page_list)); in print_skipped_events()
1555 if ((kwork->nr_lost_events != 0) && (kwork->nr_events != 0)) { in print_bad_events()
1557 (double)kwork->nr_lost_events / in print_bad_events()
1558 (double)kwork->nr_events * 100.0, in print_bad_events()
1559 kwork->nr_lost_events, kwork->nr_events, in print_bad_events()
1560 kwork->nr_lost_chunks); in print_bad_events()
1570 struct kwork_top_stat *stat = &kwork->top_stat; in top_print_per_cpu_load()
1573 total = stat->cpus_runtime[i].total; in top_print_per_cpu_load()
1574 load = stat->cpus_runtime[i].load; in top_print_per_cpu_load()
1575 if (test_bit(i, stat->all_cpus_bitmap) && total) { in top_print_per_cpu_load()
1580 printf("%%Cpu%-*d[%.*s%.*s %*.*f%%]\n", in top_print_per_cpu_load()
1583 PRINT_CPU_USAGE_HIST_WIDTH - load_width, in top_print_per_cpu_load()
1594 struct kwork_top_stat *stat = &kwork->top_stat; in top_print_cpu_usage()
1595 u64 idle_time = stat->cpus_runtime[MAX_NR_CPUS].idle; in top_print_cpu_usage()
1596 u64 hardirq_time = stat->cpus_runtime[MAX_NR_CPUS].irq; in top_print_cpu_usage()
1597 u64 softirq_time = stat->cpus_runtime[MAX_NR_CPUS].softirq; in top_print_cpu_usage()
1598 int cpus_nr = bitmap_weight(stat->all_cpus_bitmap, MAX_NR_CPUS); in top_print_cpu_usage()
1599 u64 cpus_total_time = stat->cpus_runtime[MAX_NR_CPUS].total; in top_print_cpu_usage()
1624 ret = printf(" %*s %s%*s%s %*s %*s %-*s", in top_print_header()
1627 kwork->use_bpf ? " " : "", in top_print_header()
1628 kwork->use_bpf ? PRINT_PID_WIDTH : 0, in top_print_header()
1629 kwork->use_bpf ? "SPID" : "", in top_print_header()
1630 kwork->use_bpf ? " " : "", in top_print_header()
1648 ret += printf(" %*" PRIu64 " ", PRINT_PID_WIDTH, work->id); in top_print_work()
1653 if (kwork->use_bpf) in top_print_work()
1654 ret += printf(" %*d ", PRINT_PID_WIDTH, work->tgid); in top_print_work()
1661 (double)work->cpu_usage / 100); in top_print_work()
1668 (double)work->total_runtime / NSEC_PER_MSEC); in top_print_work()
1673 if (kwork->use_bpf) in top_print_work()
1675 work->is_kthread ? "[" : "", in top_print_work()
1676 work->name, in top_print_work()
1677 work->is_kthread ? "]" : ""); in top_print_work()
1679 ret += printf(" %-*s", PRINT_TASK_NAME_WIDTH, work->name); in top_print_work()
1691 pr_debug("Sorting %s ...\n", class->name); in work_sort()
1699 work_insert(&kwork->sorted_work_root, in work_sort()
1700 data, &kwork->sort_list); in work_sort()
1708 list_for_each_entry(class, &kwork->class_list, list) in perf_kwork__sort()
1709 work_sort(kwork, class, &class->work_root); in perf_kwork__sort()
1738 switch (kwork->report) { in perf_kwork__check_config()
1740 kwork->tp_handler = &report_ops; in perf_kwork__check_config()
1743 kwork->tp_handler = &latency_ops; in perf_kwork__check_config()
1746 kwork->tp_handler = &timehist_ops; in perf_kwork__check_config()
1749 kwork->tp_handler = &top_ops; in perf_kwork__check_config()
1752 pr_debug("Invalid report type %d\n", kwork->report); in perf_kwork__check_config()
1753 return -1; in perf_kwork__check_config()
1756 list_for_each_entry(class, &kwork->class_list, list) in perf_kwork__check_config()
1757 if ((class->class_init != NULL) && in perf_kwork__check_config()
1758 (class->class_init(class, session) != 0)) in perf_kwork__check_config()
1759 return -1; in perf_kwork__check_config()
1761 if (kwork->cpu_list != NULL) { in perf_kwork__check_config()
1763 kwork->cpu_list, in perf_kwork__check_config()
1764 kwork->cpu_bitmap); in perf_kwork__check_config()
1767 return -1; in perf_kwork__check_config()
1771 if (kwork->time_str != NULL) { in perf_kwork__check_config()
1772 ret = perf_time__parse_str(&kwork->ptime, kwork->time_str); in perf_kwork__check_config()
1774 pr_err("Invalid time span\n"); in perf_kwork__check_config()
1775 return -1; in perf_kwork__check_config()
1779 list_for_each_entry(evsel, &session->evlist->core.entries, core.node) { in perf_kwork__check_config()
1780 if (kwork->show_callchain && !evsel__has_callchain(evsel)) { in perf_kwork__check_config()
1782 kwork->show_callchain = 0; in perf_kwork__check_config()
1792 int ret = -1; in perf_kwork__read_events()
1798 .force = kwork->force, in perf_kwork__read_events()
1801 session = perf_session__new(&data, &kwork->tool); in perf_kwork__read_events()
1807 symbol__init(&session->header.env); in perf_kwork__read_events()
1812 if (session->tevent.pevent && in perf_kwork__read_events()
1813 tep_set_function_resolver(session->tevent.pevent, in perf_kwork__read_events()
1815 &session->machines.host) < 0) { in perf_kwork__read_events()
1820 if (kwork->report == KWORK_REPORT_TIMEHIST) in perf_kwork__read_events()
1829 kwork->nr_events = session->evlist->stats.nr_events[0]; in perf_kwork__read_events()
1830 kwork->nr_lost_events = session->evlist->stats.total_lost; in perf_kwork__read_events()
1831 kwork->nr_lost_chunks = session->evlist->stats.nr_events[PERF_RECORD_LOST]; in perf_kwork__read_events()
1845 count = nr_list_entry(&work->atom_list[i]); in process_skipped_events()
1846 kwork->nr_skipped_events[i] += count; in process_skipped_events()
1847 kwork->nr_skipped_events[KWORK_TRACE_MAX] += count; in process_skipped_events()
1861 work_insert(&class->work_root, work, &kwork->cmp_id); in perf_kwork_add_work()
1883 return -1; in perf_kwork__report_bpf()
1909 if (kwork->use_bpf) in perf_kwork__report()
1915 return -1; in perf_kwork__report()
1922 next = rb_first_cached(&kwork->sorted_work_root); in perf_kwork__report()
1927 if (work->nr_atoms != 0) { in perf_kwork__report()
1929 if (kwork->summary) { in perf_kwork__report()
1930 kwork->all_runtime += work->total_runtime; in perf_kwork__report()
1931 kwork->all_count += work->nr_atoms; in perf_kwork__report()
1938 if (kwork->summary) { in perf_kwork__report()
1963 if (evsel->handler != NULL) { in perf_kwork__process_tracepoint_sample()
1964 tracepoint_handler f = evsel->handler; in perf_kwork__process_tracepoint_sample()
1977 kwork->tool.comm = perf_event__process_comm; in perf_kwork__timehist()
1978 kwork->tool.exit = perf_event__process_exit; in perf_kwork__timehist()
1979 kwork->tool.fork = perf_event__process_fork; in perf_kwork__timehist()
1980 kwork->tool.attr = perf_event__process_attr; in perf_kwork__timehist()
1981 kwork->tool.tracing_data = perf_event__process_tracing_data; in perf_kwork__timehist()
1982 kwork->tool.build_id = perf_event__process_build_id; in perf_kwork__timehist()
1983 kwork->tool.ordered_events = true; in perf_kwork__timehist()
1984 kwork->tool.ordering_requires_timestamps = true; in perf_kwork__timehist()
1985 symbol_conf.use_callchain = kwork->show_callchain; in perf_kwork__timehist()
1989 return -1; in perf_kwork__timehist()
2002 struct kwork_top_stat *stat = &kwork->top_stat; in top_calc_total_runtime()
2008 next = rb_first_cached(&class->work_root); in top_calc_total_runtime()
2011 BUG_ON(work->cpu >= MAX_NR_CPUS); in top_calc_total_runtime()
2012 stat->cpus_runtime[work->cpu].total += work->total_runtime; in top_calc_total_runtime()
2013 stat->cpus_runtime[MAX_NR_CPUS].total += work->total_runtime; in top_calc_total_runtime()
2021 struct kwork_top_stat *stat = &kwork->top_stat; in top_calc_idle_time()
2023 if (work->id == 0) { in top_calc_idle_time()
2024 stat->cpus_runtime[work->cpu].idle += work->total_runtime; in top_calc_idle_time()
2025 stat->cpus_runtime[MAX_NR_CPUS].idle += work->total_runtime; in top_calc_idle_time()
2033 struct kwork_top_stat *stat = &kwork->top_stat; in top_calc_irq_runtime()
2036 stat->cpus_runtime[work->cpu].irq += work->total_runtime; in top_calc_irq_runtime()
2037 stat->cpus_runtime[MAX_NR_CPUS].irq += work->total_runtime; in top_calc_irq_runtime()
2039 stat->cpus_runtime[work->cpu].softirq += work->total_runtime; in top_calc_irq_runtime()
2040 stat->cpus_runtime[MAX_NR_CPUS].softirq += work->total_runtime; in top_calc_irq_runtime()
2057 data = find_work_by_id(&class->work_root, in top_subtract_irq_runtime()
2058 work->id, work->cpu); in top_subtract_irq_runtime()
2062 if (work->total_runtime > data->total_runtime) { in top_subtract_irq_runtime()
2063 work->total_runtime -= data->total_runtime; in top_subtract_irq_runtime()
2074 struct kwork_top_stat *stat = &kwork->top_stat; in top_calc_cpu_usage()
2080 next = rb_first_cached(&class->work_root); in top_calc_cpu_usage()
2084 if (work->total_runtime == 0) in top_calc_cpu_usage()
2087 __set_bit(work->cpu, stat->all_cpus_bitmap); in top_calc_cpu_usage()
2091 work->cpu_usage = work->total_runtime * 10000 / in top_calc_cpu_usage()
2092 stat->cpus_runtime[work->cpu].total; in top_calc_cpu_usage()
2103 struct kwork_top_stat *stat = &kwork->top_stat; in top_calc_load_runtime()
2105 if (work->id != 0) { in top_calc_load_runtime()
2106 stat->cpus_runtime[work->cpu].load += work->total_runtime; in top_calc_load_runtime()
2107 stat->cpus_runtime[MAX_NR_CPUS].load += work->total_runtime; in top_calc_load_runtime()
2124 node = rb_first_cached(&class->work_root); in top_merge_tasks()
2128 rb_erase_cached(node, &class->work_root); in top_merge_tasks()
2134 cpu = data->cpu; in top_merge_tasks()
2135 merged_work = find_work_by_id(&merged_root, data->id, in top_merge_tasks()
2136 data->id == 0 ? cpu : -1); in top_merge_tasks()
2138 work_insert(&merged_root, data, &kwork->cmp_id); in top_merge_tasks()
2140 merged_work->total_runtime += data->total_runtime; in top_merge_tasks()
2141 merged_work->cpu_usage += data->cpu_usage; in top_merge_tasks()
2159 next = rb_first_cached(&kwork->sorted_work_root); in perf_kwork__top_report()
2164 if (work->total_runtime == 0) in perf_kwork__top_report()
2185 return -1; in perf_kwork__top_bpf()
2213 return -1; in perf_kwork__top()
2215 kwork->top_stat.cpus_runtime = cpus_runtime; in perf_kwork__top()
2216 bitmap_zero(kwork->top_stat.all_cpus_bitmap, MAX_NR_CPUS); in perf_kwork__top()
2218 if (kwork->use_bpf) in perf_kwork__top()
2235 zfree(&kwork->top_stat.cpus_runtime); in perf_kwork__top()
2250 if (kwork->event_list_str == NULL) in setup_event_list()
2251 kwork->event_list_str = "irq, softirq, workqueue"; in setup_event_list()
2253 str = strdup(kwork->event_list_str); in setup_event_list()
2258 if (strcmp(tok, class->name) == 0) { in setup_event_list()
2259 list_add_tail(&class->list, &kwork->class_list); in setup_event_list()
2265 "Unknown --event key: `%s'", tok); in setup_event_list()
2271 list_for_each_entry(class, &kwork->class_list, list) in setup_event_list()
2272 pr_debug(" %s", class->name); in setup_event_list()
2285 "-a", in perf_kwork__record()
2286 "-R", in perf_kwork__record()
2287 "-m", "1024", in perf_kwork__record()
2288 "-c", "1", in perf_kwork__record()
2291 rec_argc = ARRAY_SIZE(record_args) + argc - 1; in perf_kwork__record()
2293 list_for_each_entry(class, &kwork->class_list, list) in perf_kwork__record()
2294 rec_argc += 2 * class->nr_tracepoints; in perf_kwork__record()
2298 return -ENOMEM; in perf_kwork__record()
2303 list_for_each_entry(class, &kwork->class_list, list) { in perf_kwork__record()
2304 for (j = 0; j < class->nr_tracepoints; j++) { in perf_kwork__record()
2305 rec_argv[i++] = strdup("-e"); in perf_kwork__record()
2306 rec_argv[i++] = strdup(class->tp_handlers[j].name); in perf_kwork__record()
2357 OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, in cmd_kwork()
2371 OPT_STRING(0, "time", &kwork.time_str, "str", in cmd_kwork()
2372 "Time span for analysis (start,stop)"), in cmd_kwork()
2375 OPT_BOOLEAN('S', "with-summary", &kwork.summary, in cmd_kwork()
2378 OPT_BOOLEAN('b', "use-bpf", &kwork.use_bpf, in cmd_kwork()
2379 "Use BPF to measure kwork runtime"), in cmd_kwork()
2390 OPT_STRING(0, "time", &kwork.time_str, "str", in cmd_kwork()
2391 "Time span for analysis (start,stop)"), in cmd_kwork()
2395 OPT_BOOLEAN('b', "use-bpf", &kwork.use_bpf, in cmd_kwork()
2396 "Use BPF to measure kwork latency"), in cmd_kwork()
2405 OPT_BOOLEAN('g', "call-graph", &kwork.show_callchain, in cmd_kwork()
2407 OPT_UINTEGER(0, "max-stack", &kwork.max_stack, in cmd_kwork()
2411 OPT_STRING(0, "time", &kwork.time_str, "str", in cmd_kwork()
2412 "Time span for analysis (start,stop)"), in cmd_kwork()
2428 OPT_STRING(0, "time", &kwork.time_str, "str", in cmd_kwork()
2429 "Time span for analysis (start,stop)"), in cmd_kwork()
2433 OPT_BOOLEAN('b', "use-bpf", &kwork.use_bpf, in cmd_kwork()
2434 "Use BPF to measure task cpu usage"), in cmd_kwork()