Lines Matching refs:tchart
202 static struct per_pid *find_create_pid(struct timechart *tchart, int pid) in find_create_pid() argument
204 struct per_pid *cursor = tchart->all_data; in find_create_pid()
214 cursor->next = tchart->all_data; in find_create_pid()
215 tchart->all_data = cursor; in find_create_pid()
232 static void pid_set_comm(struct timechart *tchart, int pid, char *comm) in pid_set_comm() argument
236 p = find_create_pid(tchart, pid); in pid_set_comm()
255 static void pid_fork(struct timechart *tchart, int pid, int ppid, u64 timestamp) in pid_fork() argument
258 p = find_create_pid(tchart, pid); in pid_fork()
259 pp = find_create_pid(tchart, ppid); in pid_fork()
262 pid_set_comm(tchart, pid, pp->current->comm); in pid_fork()
271 static void pid_exit(struct timechart *tchart, int pid, u64 timestamp) in pid_exit() argument
274 p = find_create_pid(tchart, pid); in pid_exit()
280 static void pid_put_sample(struct timechart *tchart, int pid, int type, in pid_put_sample() argument
288 p = find_create_pid(tchart, pid); in pid_put_sample()
328 struct timechart *tchart = container_of(tool, struct timechart, tool); in process_comm_event() local
329 pid_set_comm(tchart, event->comm.tid, event->comm.comm); in process_comm_event()
338 struct timechart *tchart = container_of(tool, struct timechart, tool); in process_fork_event() local
339 pid_fork(tchart, event->fork.pid, event->fork.ppid, event->fork.time); in process_fork_event()
348 struct timechart *tchart = container_of(tool, struct timechart, tool); in process_exit_event() local
349 pid_exit(tchart, event->fork.pid, event->fork.time); in process_exit_event()
363 static void c_state_end(struct timechart *tchart, int cpu, u64 timestamp) in c_state_end() argument
375 pwr->next = tchart->power_events; in c_state_end()
377 tchart->power_events = pwr; in c_state_end()
380 static struct power_event *p_state_end(struct timechart *tchart, int cpu, in p_state_end() argument
393 pwr->next = tchart->power_events; in p_state_end()
395 pwr->start_time = tchart->first_time; in p_state_end()
397 tchart->power_events = pwr; in p_state_end()
401 static void p_state_change(struct timechart *tchart, int cpu, u64 timestamp, u64 new_freq) in p_state_change() argument
408 pwr = p_state_end(tchart, cpu, timestamp); in p_state_change()
415 if ((u64)new_freq > tchart->max_freq) in p_state_change()
416 tchart->max_freq = new_freq; in p_state_change()
418 if (new_freq < tchart->min_freq || tchart->min_freq == 0) in p_state_change()
419 tchart->min_freq = new_freq; in p_state_change()
421 if (new_freq == tchart->max_freq - 1000) in p_state_change()
422 tchart->turbo_frequency = tchart->max_freq; in p_state_change()
425 static void sched_wakeup(struct timechart *tchart, int cpu, u64 timestamp, in sched_wakeup() argument
442 we->next = tchart->wake_events; in sched_wakeup()
443 tchart->wake_events = we; in sched_wakeup()
444 p = find_create_pid(tchart, we->wakee); in sched_wakeup()
451 pid_put_sample(tchart, p->pid, p->current->state, cpu, in sched_wakeup()
458 static void sched_switch(struct timechart *tchart, int cpu, u64 timestamp, in sched_switch() argument
464 prev_p = find_create_pid(tchart, prev_pid); in sched_switch()
466 p = find_create_pid(tchart, next_pid); in sched_switch()
469 pid_put_sample(tchart, prev_pid, TYPE_RUNNING, cpu, in sched_switch()
474 pid_put_sample(tchart, next_pid, p->current->state, cpu, in sched_switch()
569 typedef int (*tracepoint_handler)(struct timechart *tchart,
580 struct timechart *tchart = container_of(tool, struct timechart, tool); in process_sample_event() local
583 if (!tchart->first_time || tchart->first_time > sample->time) in process_sample_event()
584 tchart->first_time = sample->time; in process_sample_event()
585 if (tchart->last_time < sample->time) in process_sample_event()
586 tchart->last_time = sample->time; in process_sample_event()
591 return f(tchart, evsel, sample, in process_sample_event()
599 process_sample_cpu_idle(struct timechart *tchart __maybe_unused, in process_sample_cpu_idle()
608 c_state_end(tchart, cpu_id, sample->time); in process_sample_cpu_idle()
615 process_sample_cpu_frequency(struct timechart *tchart, in process_sample_cpu_frequency() argument
623 p_state_change(tchart, cpu_id, sample->time, state); in process_sample_cpu_frequency()
628 process_sample_sched_wakeup(struct timechart *tchart, in process_sample_sched_wakeup() argument
637 sched_wakeup(tchart, sample->cpu, sample->time, waker, wakee, flags, backtrace); in process_sample_sched_wakeup()
642 process_sample_sched_switch(struct timechart *tchart, in process_sample_sched_switch() argument
651 sched_switch(tchart, sample->cpu, sample->time, prev_pid, next_pid, in process_sample_sched_switch()
658 process_sample_power_start(struct timechart *tchart __maybe_unused, in process_sample_power_start()
671 process_sample_power_end(struct timechart *tchart, in process_sample_power_end() argument
676 c_state_end(tchart, sample->cpu, sample->time); in process_sample_power_end()
681 process_sample_power_frequency(struct timechart *tchart, in process_sample_power_frequency() argument
689 p_state_change(tchart, cpu_id, sample->time, value); in process_sample_power_frequency()
698 static void end_sample_processing(struct timechart *tchart) in end_sample_processing() argument
703 for (cpu = 0; cpu <= tchart->numcpus; cpu++) { in end_sample_processing()
712 pwr->end_time = tchart->last_time; in end_sample_processing()
715 pwr->next = tchart->power_events; in end_sample_processing()
717 tchart->power_events = pwr; in end_sample_processing()
721 pwr = p_state_end(tchart, cpu, tchart->last_time); in end_sample_processing()
726 pwr->state = tchart->min_freq; in end_sample_processing()
730 static int pid_begin_io_sample(struct timechart *tchart, int pid, int type, in pid_begin_io_sample() argument
733 struct per_pid *p = find_create_pid(tchart, pid); in pid_begin_io_sample()
772 static int pid_end_io_sample(struct timechart *tchart, int pid, int type, in pid_end_io_sample() argument
775 struct per_pid *p = find_create_pid(tchart, pid); in pid_end_io_sample()
805 if (sample->end_time - sample->start_time < tchart->min_time) in pid_end_io_sample()
806 sample->end_time = sample->start_time + tchart->min_time; in pid_end_io_sample()
832 prev->end_time + tchart->merge_dist >= sample->start_time) { in pid_end_io_sample()
845 tchart->io_events++; in pid_end_io_sample()
851 process_enter_read(struct timechart *tchart, in process_enter_read() argument
856 return pid_begin_io_sample(tchart, sample->tid, IOTYPE_READ, in process_enter_read()
861 process_exit_read(struct timechart *tchart, in process_exit_read() argument
866 return pid_end_io_sample(tchart, sample->tid, IOTYPE_READ, in process_exit_read()
871 process_enter_write(struct timechart *tchart, in process_enter_write() argument
876 return pid_begin_io_sample(tchart, sample->tid, IOTYPE_WRITE, in process_enter_write()
881 process_exit_write(struct timechart *tchart, in process_exit_write() argument
886 return pid_end_io_sample(tchart, sample->tid, IOTYPE_WRITE, in process_exit_write()
891 process_enter_sync(struct timechart *tchart, in process_enter_sync() argument
896 return pid_begin_io_sample(tchart, sample->tid, IOTYPE_SYNC, in process_enter_sync()
901 process_exit_sync(struct timechart *tchart, in process_exit_sync() argument
906 return pid_end_io_sample(tchart, sample->tid, IOTYPE_SYNC, in process_exit_sync()
911 process_enter_tx(struct timechart *tchart, in process_enter_tx() argument
916 return pid_begin_io_sample(tchart, sample->tid, IOTYPE_TX, in process_enter_tx()
921 process_exit_tx(struct timechart *tchart, in process_exit_tx() argument
926 return pid_end_io_sample(tchart, sample->tid, IOTYPE_TX, in process_exit_tx()
931 process_enter_rx(struct timechart *tchart, in process_enter_rx() argument
936 return pid_begin_io_sample(tchart, sample->tid, IOTYPE_RX, in process_enter_rx()
941 process_exit_rx(struct timechart *tchart, in process_exit_rx() argument
946 return pid_end_io_sample(tchart, sample->tid, IOTYPE_RX, in process_exit_rx()
951 process_enter_poll(struct timechart *tchart, in process_enter_poll() argument
956 return pid_begin_io_sample(tchart, sample->tid, IOTYPE_POLL, in process_enter_poll()
961 process_exit_poll(struct timechart *tchart, in process_exit_poll() argument
966 return pid_end_io_sample(tchart, sample->tid, IOTYPE_POLL, in process_exit_poll()
973 static void sort_pids(struct timechart *tchart) in sort_pids() argument
980 while (tchart->all_data) { in sort_pids()
981 p = tchart->all_data; in sort_pids()
982 tchart->all_data = p->next; in sort_pids()
1015 tchart->all_data = new_list; in sort_pids()
1019 static void draw_c_p_states(struct timechart *tchart) in draw_c_p_states() argument
1022 pwr = tchart->power_events; in draw_c_p_states()
1033 pwr = tchart->power_events; in draw_c_p_states()
1037 pwr->state = tchart->min_freq; in draw_c_p_states()
1044 static void draw_wakeups(struct timechart *tchart) in draw_wakeups() argument
1050 we = tchart->wake_events; in draw_wakeups()
1056 p = tchart->all_data; in draw_wakeups()
1112 static void draw_cpu_usage(struct timechart *tchart) in draw_cpu_usage() argument
1117 p = tchart->all_data; in draw_cpu_usage()
1140 static void draw_io_bars(struct timechart *tchart) in draw_io_bars() argument
1150 p = tchart->all_data; in draw_io_bars()
1164 if (tchart->skip_eagain && in draw_io_bars()
1254 static void draw_process_bars(struct timechart *tchart) in draw_process_bars() argument
1261 Y = 2 * tchart->numcpus + 2; in draw_process_bars()
1263 p = tchart->all_data; in draw_process_bars()
1343 static int determine_display_tasks_filtered(struct timechart *tchart) in determine_display_tasks_filtered() argument
1349 p = tchart->all_data; in determine_display_tasks_filtered()
1353 p->start_time = tchart->first_time; in determine_display_tasks_filtered()
1357 p->end_time = tchart->last_time; in determine_display_tasks_filtered()
1365 c->start_time = tchart->first_time; in determine_display_tasks_filtered()
1374 c->end_time = tchart->last_time; in determine_display_tasks_filtered()
1383 static int determine_display_tasks(struct timechart *tchart, u64 threshold) in determine_display_tasks() argument
1389 p = tchart->all_data; in determine_display_tasks()
1393 p->start_time = tchart->first_time; in determine_display_tasks()
1397 p->end_time = tchart->last_time; in determine_display_tasks()
1407 c->start_time = tchart->first_time; in determine_display_tasks()
1415 c->end_time = tchart->last_time; in determine_display_tasks()
1459 static void write_svg_file(struct timechart *tchart, const char *filename) in write_svg_file() argument
1463 int thresh = tchart->io_events ? BYTES_THRESH : TIME_THRESH; in write_svg_file()
1465 if (tchart->power_only) in write_svg_file()
1466 tchart->proc_num = 0; in write_svg_file()
1472 count = determine_display_tasks_filtered(tchart); in write_svg_file()
1473 else if (tchart->io_events) in write_svg_file()
1474 count = determine_display_io_tasks(tchart, thresh); in write_svg_file()
1476 count = determine_display_tasks(tchart, thresh); in write_svg_file()
1478 } while (!process_filter && thresh && count < tchart->proc_num); in write_svg_file()
1480 if (!tchart->proc_num) in write_svg_file()
1483 if (tchart->io_events) { in write_svg_file()
1484 open_svg(filename, 0, count, tchart->first_time, tchart->last_time); in write_svg_file()
1489 draw_io_bars(tchart); in write_svg_file()
1491 open_svg(filename, tchart->numcpus, count, tchart->first_time, tchart->last_time); in write_svg_file()
1497 for (i = 0; i < tchart->numcpus; i++) in write_svg_file()
1498 svg_cpu_box(i, tchart->max_freq, tchart->turbo_frequency); in write_svg_file()
1500 draw_cpu_usage(tchart); in write_svg_file()
1501 if (tchart->proc_num) in write_svg_file()
1502 draw_process_bars(tchart); in write_svg_file()
1503 if (!tchart->tasks_only) in write_svg_file()
1504 draw_c_p_states(tchart); in write_svg_file()
1505 if (tchart->proc_num) in write_svg_file()
1506 draw_wakeups(tchart); in write_svg_file()
1518 struct timechart *tchart = data; in process_header() local
1522 tchart->numcpus = ph->env.nr_cpus_avail; in process_header()
1526 if (!tchart->topology) in process_header()
1540 static int __cmd_timechart(struct timechart *tchart, const char *output_name) in __cmd_timechart() argument
1606 .force = tchart->force, in __cmd_timechart()
1611 perf_tool__init(&tchart->tool, /*ordered_events=*/true); in __cmd_timechart()
1612 tchart->tool.comm = process_comm_event; in __cmd_timechart()
1613 tchart->tool.fork = process_fork_event; in __cmd_timechart()
1614 tchart->tool.exit = process_exit_event; in __cmd_timechart()
1615 tchart->tool.sample = process_sample_event; in __cmd_timechart()
1617 session = perf_session__new(&data, &tchart->tool); in __cmd_timechart()
1625 tchart, in __cmd_timechart()
1641 end_sample_processing(tchart); in __cmd_timechart()
1643 sort_pids(tchart); in __cmd_timechart()
1645 write_svg_file(tchart, output_name); in __cmd_timechart()
1648 (tchart->last_time - tchart->first_time) / (double)NSEC_PER_SEC, output_name); in __cmd_timechart()
1789 static int timechart__record(struct timechart *tchart, int argc, const char **argv) in timechart__record() argument
1837 if (tchart->power_only) in timechart__record()
1840 if (tchart->tasks_only) { in timechart__record()
1845 if (!tchart->with_backtrace) in timechart__record()
1931 struct timechart tchart = { in cmd_timechart() local
1938 OPT_BOOLEAN('P', "power-only", &tchart.power_only, "output power data only"), in cmd_timechart()
1939 OPT_BOOLEAN('T', "tasks-only", &tchart.tasks_only, "output processes data only"), in cmd_timechart()
1955 OPT_INTEGER('n', "proc-num", &tchart.proc_num, in cmd_timechart()
1957 OPT_BOOLEAN('t', "topology", &tchart.topology, in cmd_timechart()
1959 OPT_BOOLEAN(0, "io-skip-eagain", &tchart.skip_eagain, in cmd_timechart()
1961 OPT_CALLBACK(0, "io-min-time", &tchart.min_time, "time", in cmd_timechart()
1964 OPT_CALLBACK(0, "io-merge-dist", &tchart.merge_dist, "time", in cmd_timechart()
1967 OPT_BOOLEAN('f', "force", &tchart.force, "don't complain, do it"), in cmd_timechart()
1976 OPT_BOOLEAN('I', "io-only", &tchart.io_only, in cmd_timechart()
1978 OPT_BOOLEAN('g', "callchain", &tchart.with_backtrace, "record callchain"), in cmd_timechart()
2009 if (tchart.power_only && tchart.tasks_only) { in cmd_timechart()
2020 if (tchart.power_only && tchart.tasks_only) { in cmd_timechart()
2026 if (tchart.io_only) in cmd_timechart()
2029 ret = timechart__record(&tchart, argc, argv); in cmd_timechart()
2036 ret = __cmd_timechart(&tchart, output_name); in cmd_timechart()