Lines Matching refs:sched

105 	int (*switch_event)(struct perf_sched *sched, struct perf_evsel *evsel,
108 int (*runtime_event)(struct perf_sched *sched, struct perf_evsel *evsel,
111 int (*wakeup_event)(struct perf_sched *sched, struct perf_evsel *evsel,
115 int (*fork_event)(struct perf_sched *sched, union perf_event *event,
118 int (*migrate_task_event)(struct perf_sched *sched,
185 static void burn_nsecs(struct perf_sched *sched, u64 nsecs) in burn_nsecs() argument
191 } while (T1 + sched->run_measurement_overhead < T0 + nsecs); in burn_nsecs()
204 static void calibrate_run_measurement_overhead(struct perf_sched *sched) in calibrate_run_measurement_overhead() argument
211 burn_nsecs(sched, 0); in calibrate_run_measurement_overhead()
216 sched->run_measurement_overhead = min_delta; in calibrate_run_measurement_overhead()
221 static void calibrate_sleep_measurement_overhead(struct perf_sched *sched) in calibrate_sleep_measurement_overhead() argument
234 sched->sleep_measurement_overhead = min_delta; in calibrate_sleep_measurement_overhead()
267 static void add_sched_event_run(struct perf_sched *sched, struct task_desc *task, in add_sched_event_run() argument
277 sched->nr_run_events_optimized++; in add_sched_event_run()
287 sched->nr_run_events++; in add_sched_event_run()
290 static void add_sched_event_wakeup(struct perf_sched *sched, struct task_desc *task, in add_sched_event_wakeup() argument
301 sched->targetless_wakeups++; in add_sched_event_wakeup()
305 sched->multitarget_wakeups++; in add_sched_event_wakeup()
314 sched->nr_wakeup_events++; in add_sched_event_wakeup()
317 static void add_sched_event_sleep(struct perf_sched *sched, struct task_desc *task, in add_sched_event_sleep() argument
324 sched->nr_sleep_events++; in add_sched_event_sleep()
327 static struct task_desc *register_pid(struct perf_sched *sched, in register_pid() argument
333 if (sched->pid_to_task == NULL) { in register_pid()
336 BUG_ON((sched->pid_to_task = calloc(pid_max, sizeof(struct task_desc *))) == NULL); in register_pid()
339 BUG_ON((sched->pid_to_task = realloc(sched->pid_to_task, (pid + 1) * in register_pid()
342 sched->pid_to_task[pid_max++] = NULL; in register_pid()
345 task = sched->pid_to_task[pid]; in register_pid()
352 task->nr = sched->nr_tasks; in register_pid()
358 add_sched_event_sleep(sched, task, 0, 0); in register_pid()
360 sched->pid_to_task[pid] = task; in register_pid()
361 sched->nr_tasks++; in register_pid()
362 sched->tasks = realloc(sched->tasks, sched->nr_tasks * sizeof(struct task_desc *)); in register_pid()
363 BUG_ON(!sched->tasks); in register_pid()
364 sched->tasks[task->nr] = task; in register_pid()
367 printf("registered task #%ld, PID %ld (%s)\n", sched->nr_tasks, pid, comm); in register_pid()
373 static void print_task_traces(struct perf_sched *sched) in print_task_traces() argument
378 for (i = 0; i < sched->nr_tasks; i++) { in print_task_traces()
379 task = sched->tasks[i]; in print_task_traces()
385 static void add_cross_task_wakeups(struct perf_sched *sched) in add_cross_task_wakeups() argument
390 for (i = 0; i < sched->nr_tasks; i++) { in add_cross_task_wakeups()
391 task1 = sched->tasks[i]; in add_cross_task_wakeups()
393 if (j == sched->nr_tasks) in add_cross_task_wakeups()
395 task2 = sched->tasks[j]; in add_cross_task_wakeups()
396 add_sched_event_wakeup(sched, task1, 0, task2); in add_cross_task_wakeups()
400 static void perf_sched__process_event(struct perf_sched *sched, in perf_sched__process_event() argument
407 burn_nsecs(sched, atom->duration); in perf_sched__process_event()
441 static int self_open_counters(struct perf_sched *sched, unsigned long cur_task) in self_open_counters() argument
460 if (sched->force) { in self_open_counters()
462 limit.rlim_cur += sched->nr_tasks - cur_task; in self_open_counters()
496 struct perf_sched *sched; member
504 struct perf_sched *sched = parms->sched; in thread_func() local
519 ret = pthread_mutex_lock(&sched->start_work_mutex); in thread_func()
521 ret = pthread_mutex_unlock(&sched->start_work_mutex); in thread_func()
528 perf_sched__process_event(sched, this_task->atoms[i]); in thread_func()
536 ret = pthread_mutex_lock(&sched->work_done_wait_mutex); in thread_func()
538 ret = pthread_mutex_unlock(&sched->work_done_wait_mutex); in thread_func()
544 static void create_tasks(struct perf_sched *sched) in create_tasks() argument
556 err = pthread_mutex_lock(&sched->start_work_mutex); in create_tasks()
558 err = pthread_mutex_lock(&sched->work_done_wait_mutex); in create_tasks()
560 for (i = 0; i < sched->nr_tasks; i++) { in create_tasks()
563 parms->task = task = sched->tasks[i]; in create_tasks()
564 parms->sched = sched; in create_tasks()
565 parms->fd = self_open_counters(sched, i); in create_tasks()
575 static void wait_for_tasks(struct perf_sched *sched) in wait_for_tasks() argument
581 sched->start_time = get_nsecs(); in wait_for_tasks()
582 sched->cpu_usage = 0; in wait_for_tasks()
583 pthread_mutex_unlock(&sched->work_done_wait_mutex); in wait_for_tasks()
585 for (i = 0; i < sched->nr_tasks; i++) { in wait_for_tasks()
586 task = sched->tasks[i]; in wait_for_tasks()
591 ret = pthread_mutex_lock(&sched->work_done_wait_mutex); in wait_for_tasks()
596 pthread_mutex_unlock(&sched->start_work_mutex); in wait_for_tasks()
598 for (i = 0; i < sched->nr_tasks; i++) { in wait_for_tasks()
599 task = sched->tasks[i]; in wait_for_tasks()
603 sched->cpu_usage += task->cpu_usage; in wait_for_tasks()
608 if (!sched->runavg_cpu_usage) in wait_for_tasks()
609 sched->runavg_cpu_usage = sched->cpu_usage; in wait_for_tasks()
610sched->runavg_cpu_usage = (sched->runavg_cpu_usage * (sched->replay_repeat - 1) + sched->cpu_usage… in wait_for_tasks()
612 sched->parent_cpu_usage = cpu_usage_1 - cpu_usage_0; in wait_for_tasks()
613 if (!sched->runavg_parent_cpu_usage) in wait_for_tasks()
614 sched->runavg_parent_cpu_usage = sched->parent_cpu_usage; in wait_for_tasks()
615 sched->runavg_parent_cpu_usage = (sched->runavg_parent_cpu_usage * (sched->replay_repeat - 1) + in wait_for_tasks()
616 sched->parent_cpu_usage)/sched->replay_repeat; in wait_for_tasks()
618 ret = pthread_mutex_lock(&sched->start_work_mutex); in wait_for_tasks()
621 for (i = 0; i < sched->nr_tasks; i++) { in wait_for_tasks()
622 task = sched->tasks[i]; in wait_for_tasks()
628 static void run_one_test(struct perf_sched *sched) in run_one_test() argument
633 wait_for_tasks(sched); in run_one_test()
637 sched->sum_runtime += delta; in run_one_test()
638 sched->nr_runs++; in run_one_test()
640 avg_delta = sched->sum_runtime / sched->nr_runs; in run_one_test()
645 sched->sum_fluct += fluct; in run_one_test()
646 if (!sched->run_avg) in run_one_test()
647 sched->run_avg = delta; in run_one_test()
648 sched->run_avg = (sched->run_avg * (sched->replay_repeat - 1) + delta) / sched->replay_repeat; in run_one_test()
650 printf("#%-3ld: %0.3f, ", sched->nr_runs, (double)delta / 1000000.0); in run_one_test()
652 printf("ravg: %0.2f, ", (double)sched->run_avg / 1e6); in run_one_test()
655 (double)sched->cpu_usage / 1e6, (double)sched->runavg_cpu_usage / 1e6); in run_one_test()
663 (double)sched->parent_cpu_usage/1e6, in run_one_test()
664 (double)sched->runavg_parent_cpu_usage/1e6); in run_one_test()
669 if (sched->nr_sleep_corrections) in run_one_test()
670 printf(" (%ld sleep corrections)\n", sched->nr_sleep_corrections); in run_one_test()
671 sched->nr_sleep_corrections = 0; in run_one_test()
674 static void test_calibrations(struct perf_sched *sched) in test_calibrations() argument
679 burn_nsecs(sched, 1e6); in test_calibrations()
692 replay_wakeup_event(struct perf_sched *sched, in replay_wakeup_event() argument
706 waker = register_pid(sched, sample->tid, "<unknown>"); in replay_wakeup_event()
707 wakee = register_pid(sched, pid, comm); in replay_wakeup_event()
709 add_sched_event_wakeup(sched, waker, sample->time, wakee); in replay_wakeup_event()
713 static int replay_switch_event(struct perf_sched *sched, in replay_switch_event() argument
734 timestamp0 = sched->cpu_last_switched[cpu]; in replay_switch_event()
748 prev = register_pid(sched, prev_pid, prev_comm); in replay_switch_event()
749 next = register_pid(sched, next_pid, next_comm); in replay_switch_event()
751 sched->cpu_last_switched[cpu] = timestamp; in replay_switch_event()
753 add_sched_event_run(sched, prev, timestamp, delta); in replay_switch_event()
754 add_sched_event_sleep(sched, prev, timestamp, prev_state); in replay_switch_event()
759 static int replay_fork_event(struct perf_sched *sched, in replay_fork_event() argument
782 register_pid(sched, parent->tid, thread__comm_str(parent)); in replay_fork_event()
783 register_pid(sched, child->tid, thread__comm_str(child)); in replay_fork_event()
861 static int thread_atoms_insert(struct perf_sched *sched, struct thread *thread) in thread_atoms_insert() argument
871 __thread_latency_insert(&sched->atom_root, atoms, &sched->cmp_pid); in thread_atoms_insert()
949 static int latency_switch_event(struct perf_sched *sched, in latency_switch_event() argument
965 timestamp0 = sched->cpu_last_switched[cpu]; in latency_switch_event()
966 sched->cpu_last_switched[cpu] = timestamp; in latency_switch_event()
980 out_events = thread_atoms_search(&sched->atom_root, sched_out, &sched->cmp_pid); in latency_switch_event()
982 if (thread_atoms_insert(sched, sched_out)) in latency_switch_event()
984 out_events = thread_atoms_search(&sched->atom_root, sched_out, &sched->cmp_pid); in latency_switch_event()
993 in_events = thread_atoms_search(&sched->atom_root, sched_in, &sched->cmp_pid); in latency_switch_event()
995 if (thread_atoms_insert(sched, sched_in)) in latency_switch_event()
997 in_events = thread_atoms_search(&sched->atom_root, sched_in, &sched->cmp_pid); in latency_switch_event()
1014 static int latency_runtime_event(struct perf_sched *sched, in latency_runtime_event() argument
1022 struct work_atoms *atoms = thread_atoms_search(&sched->atom_root, thread, &sched->cmp_pid); in latency_runtime_event()
1028 if (thread_atoms_insert(sched, thread)) in latency_runtime_event()
1030 atoms = thread_atoms_search(&sched->atom_root, thread, &sched->cmp_pid); in latency_runtime_event()
1043 static int latency_wakeup_event(struct perf_sched *sched, in latency_wakeup_event() argument
1055 atoms = thread_atoms_search(&sched->atom_root, wakee, &sched->cmp_pid); in latency_wakeup_event()
1057 if (thread_atoms_insert(sched, wakee)) in latency_wakeup_event()
1059 atoms = thread_atoms_search(&sched->atom_root, wakee, &sched->cmp_pid); in latency_wakeup_event()
1083 if (sched->profile_cpu == -1 && atom->state != THREAD_SLEEPING) in latency_wakeup_event()
1086 sched->nr_timestamps++; in latency_wakeup_event()
1088 sched->nr_unordered_timestamps++; in latency_wakeup_event()
1097 static int latency_migrate_task_event(struct perf_sched *sched, in latency_migrate_task_event() argument
1111 if (sched->profile_cpu == -1) in latency_migrate_task_event()
1115 atoms = thread_atoms_search(&sched->atom_root, migrant, &sched->cmp_pid); in latency_migrate_task_event()
1117 if (thread_atoms_insert(sched, migrant)) in latency_migrate_task_event()
1119 register_pid(sched, migrant->tid, thread__comm_str(migrant)); in latency_migrate_task_event()
1120 atoms = thread_atoms_search(&sched->atom_root, migrant, &sched->cmp_pid); in latency_migrate_task_event()
1134 sched->nr_timestamps++; in latency_migrate_task_event()
1137 sched->nr_unordered_timestamps++; in latency_migrate_task_event()
1142 static void output_lat_thread(struct perf_sched *sched, struct work_atoms *work_list) in output_lat_thread() argument
1156 sched->all_runtime += work_list->total_runtime; in output_lat_thread()
1157 sched->all_count += work_list->nb_atoms; in output_lat_thread()
1276 static void perf_sched__sort_lat(struct perf_sched *sched) in perf_sched__sort_lat() argument
1282 node = rb_first(&sched->atom_root); in perf_sched__sort_lat()
1286 rb_erase(node, &sched->atom_root); in perf_sched__sort_lat()
1288 __thread_latency_insert(&sched->sorted_atom_root, data, &sched->sort_list); in perf_sched__sort_lat()
1297 struct perf_sched *sched = container_of(tool, struct perf_sched, tool); in process_sched_wakeup_event() local
1299 if (sched->tp_handler->wakeup_event) in process_sched_wakeup_event()
1300 return sched->tp_handler->wakeup_event(sched, evsel, sample, machine); in process_sched_wakeup_event()
1305 static int map_switch_event(struct perf_sched *sched, struct perf_evsel *evsel, in map_switch_event() argument
1317 if (this_cpu > sched->max_cpu) in map_switch_event()
1318 sched->max_cpu = this_cpu; in map_switch_event()
1320 timestamp0 = sched->cpu_last_switched[this_cpu]; in map_switch_event()
1321 sched->cpu_last_switched[this_cpu] = timestamp; in map_switch_event()
1334 sched->curr_thread[this_cpu] = sched_in; in map_switch_event()
1348 sched_in->shortname[0] = sched->next_shortname1; in map_switch_event()
1349 sched_in->shortname[1] = sched->next_shortname2; in map_switch_event()
1351 if (sched->next_shortname1 < 'Z') { in map_switch_event()
1352 sched->next_shortname1++; in map_switch_event()
1354 sched->next_shortname1 = 'A'; in map_switch_event()
1355 if (sched->next_shortname2 < '9') in map_switch_event()
1356 sched->next_shortname2++; in map_switch_event()
1358 sched->next_shortname2 = '0'; in map_switch_event()
1364 for (cpu = 0; cpu <= sched->max_cpu; cpu++) { in map_switch_event()
1370 if (sched->curr_thread[cpu]) in map_switch_event()
1371 printf("%2s ", sched->curr_thread[cpu]->shortname); in map_switch_event()
1392 struct perf_sched *sched = container_of(tool, struct perf_sched, tool); in process_sched_switch_event() local
1397 if (sched->curr_pid[this_cpu] != (u32)-1) { in process_sched_switch_event()
1402 if (sched->curr_pid[this_cpu] != prev_pid) in process_sched_switch_event()
1403 sched->nr_context_switch_bugs++; in process_sched_switch_event()
1406 if (sched->tp_handler->switch_event) in process_sched_switch_event()
1407 err = sched->tp_handler->switch_event(sched, evsel, sample, machine); in process_sched_switch_event()
1409 sched->curr_pid[this_cpu] = next_pid; in process_sched_switch_event()
1418 struct perf_sched *sched = container_of(tool, struct perf_sched, tool); in process_sched_runtime_event() local
1420 if (sched->tp_handler->runtime_event) in process_sched_runtime_event()
1421 return sched->tp_handler->runtime_event(sched, evsel, sample, machine); in process_sched_runtime_event()
1431 struct perf_sched *sched = container_of(tool, struct perf_sched, tool); in perf_sched__process_fork_event() local
1437 if (sched->tp_handler->fork_event) in perf_sched__process_fork_event()
1438 return sched->tp_handler->fork_event(sched, event, machine); in perf_sched__process_fork_event()
1448 struct perf_sched *sched = container_of(tool, struct perf_sched, tool); in process_sched_migrate_task_event() local
1450 if (sched->tp_handler->migrate_task_event) in process_sched_migrate_task_event()
1451 return sched->tp_handler->migrate_task_event(sched, evsel, sample, machine); in process_sched_migrate_task_event()
1477 static int perf_sched__read_events(struct perf_sched *sched) in perf_sched__read_events() argument
1490 .force = sched->force, in perf_sched__read_events()
1494 session = perf_session__new(&file, false, &sched->tool); in perf_sched__read_events()
1512 sched->nr_events = session->evlist->stats.nr_events[0]; in perf_sched__read_events()
1513 sched->nr_lost_events = session->evlist->stats.total_lost; in perf_sched__read_events()
1514 sched->nr_lost_chunks = session->evlist->stats.nr_events[PERF_RECORD_LOST]; in perf_sched__read_events()
1523 static void print_bad_events(struct perf_sched *sched) in print_bad_events() argument
1525 if (sched->nr_unordered_timestamps && sched->nr_timestamps) { in print_bad_events()
1527 (double)sched->nr_unordered_timestamps/(double)sched->nr_timestamps*100.0, in print_bad_events()
1528 sched->nr_unordered_timestamps, sched->nr_timestamps); in print_bad_events()
1530 if (sched->nr_lost_events && sched->nr_events) { in print_bad_events()
1532 (double)sched->nr_lost_events/(double)sched->nr_events * 100.0, in print_bad_events()
1533 sched->nr_lost_events, sched->nr_events, sched->nr_lost_chunks); in print_bad_events()
1535 if (sched->nr_context_switch_bugs && sched->nr_timestamps) { in print_bad_events()
1537 (double)sched->nr_context_switch_bugs/(double)sched->nr_timestamps*100.0, in print_bad_events()
1538 sched->nr_context_switch_bugs, sched->nr_timestamps); in print_bad_events()
1539 if (sched->nr_lost_events) in print_bad_events()
1545 static int perf_sched__lat(struct perf_sched *sched) in perf_sched__lat() argument
1551 if (perf_sched__read_events(sched)) in perf_sched__lat()
1554 perf_sched__sort_lat(sched); in perf_sched__lat()
1560 next = rb_first(&sched->sorted_atom_root); in perf_sched__lat()
1566 output_lat_thread(sched, work_list); in perf_sched__lat()
1573 (double)sched->all_runtime / 1e6, sched->all_count); in perf_sched__lat()
1577 print_bad_events(sched); in perf_sched__lat()
1583 static int perf_sched__map(struct perf_sched *sched) in perf_sched__map() argument
1585 sched->max_cpu = sysconf(_SC_NPROCESSORS_CONF); in perf_sched__map()
1588 if (perf_sched__read_events(sched)) in perf_sched__map()
1590 print_bad_events(sched); in perf_sched__map()
1594 static int perf_sched__replay(struct perf_sched *sched) in perf_sched__replay() argument
1598 calibrate_run_measurement_overhead(sched); in perf_sched__replay()
1599 calibrate_sleep_measurement_overhead(sched); in perf_sched__replay()
1601 test_calibrations(sched); in perf_sched__replay()
1603 if (perf_sched__read_events(sched)) in perf_sched__replay()
1606 printf("nr_run_events: %ld\n", sched->nr_run_events); in perf_sched__replay()
1607 printf("nr_sleep_events: %ld\n", sched->nr_sleep_events); in perf_sched__replay()
1608 printf("nr_wakeup_events: %ld\n", sched->nr_wakeup_events); in perf_sched__replay()
1610 if (sched->targetless_wakeups) in perf_sched__replay()
1611 printf("target-less wakeups: %ld\n", sched->targetless_wakeups); in perf_sched__replay()
1612 if (sched->multitarget_wakeups) in perf_sched__replay()
1613 printf("multi-target wakeups: %ld\n", sched->multitarget_wakeups); in perf_sched__replay()
1614 if (sched->nr_run_events_optimized) in perf_sched__replay()
1616 sched->nr_run_events_optimized); in perf_sched__replay()
1618 print_task_traces(sched); in perf_sched__replay()
1619 add_cross_task_wakeups(sched); in perf_sched__replay()
1621 create_tasks(sched); in perf_sched__replay()
1623 for (i = 0; i < sched->replay_repeat; i++) in perf_sched__replay()
1624 run_one_test(sched); in perf_sched__replay()
1629 static void setup_sorting(struct perf_sched *sched, const struct option *options, in setup_sorting() argument
1632 char *tmp, *tok, *str = strdup(sched->sort_order); in setup_sorting()
1636 if (sort_dimension__add(tok, &sched->sort_list) < 0) { in setup_sorting()
1644 sort_dimension__add("pid", &sched->cmp_pid); in setup_sorting()
1688 struct perf_sched sched = { in cmd_sched() local
1696 .cmp_pid = LIST_HEAD_INIT(sched.cmp_pid), in cmd_sched()
1697 .sort_list = LIST_HEAD_INIT(sched.sort_list), in cmd_sched()
1707 OPT_STRING('s', "sort", &sched.sort_order, "key[,key2...]", in cmd_sched()
1711 OPT_INTEGER('C', "CPU", &sched.profile_cpu, in cmd_sched()
1718 OPT_UINTEGER('r', "repeat", &sched.replay_repeat, in cmd_sched()
1724 OPT_BOOLEAN('f', "force", &sched.force, "don't complain, do it"), in cmd_sched()
1766 for (i = 0; i < ARRAY_SIZE(sched.curr_pid); i++) in cmd_sched()
1767 sched.curr_pid[i] = -1; in cmd_sched()
1783 sched.tp_handler = &lat_ops; in cmd_sched()
1789 setup_sorting(&sched, latency_options, latency_usage); in cmd_sched()
1790 return perf_sched__lat(&sched); in cmd_sched()
1792 sched.tp_handler = &map_ops; in cmd_sched()
1793 setup_sorting(&sched, latency_options, latency_usage); in cmd_sched()
1794 return perf_sched__map(&sched); in cmd_sched()
1796 sched.tp_handler = &replay_ops; in cmd_sched()
1802 return perf_sched__replay(&sched); in cmd_sched()