diff options
Diffstat (limited to 'tools/perf/builtin-sched.c')
-rw-r--r-- | tools/perf/builtin-sched.c | 212 |
1 files changed, 98 insertions, 114 deletions
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 26b782f26ee1..7cca7c15b40a 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c | |||
@@ -13,7 +13,6 @@ | |||
13 | #include "util/debug.h" | 13 | #include "util/debug.h" |
14 | #include "util/data_map.h" | 14 | #include "util/data_map.h" |
15 | 15 | ||
16 | #include <sys/types.h> | ||
17 | #include <sys/prctl.h> | 16 | #include <sys/prctl.h> |
18 | 17 | ||
19 | #include <semaphore.h> | 18 | #include <semaphore.h> |
@@ -141,6 +140,7 @@ struct work_atoms { | |||
141 | struct thread *thread; | 140 | struct thread *thread; |
142 | struct rb_node node; | 141 | struct rb_node node; |
143 | u64 max_lat; | 142 | u64 max_lat; |
143 | u64 max_lat_at; | ||
144 | u64 total_lat; | 144 | u64 total_lat; |
145 | u64 nb_atoms; | 145 | u64 nb_atoms; |
146 | u64 total_runtime; | 146 | u64 total_runtime; |
@@ -414,34 +414,33 @@ static u64 get_cpu_usage_nsec_parent(void) | |||
414 | return sum; | 414 | return sum; |
415 | } | 415 | } |
416 | 416 | ||
417 | static u64 get_cpu_usage_nsec_self(void) | 417 | static int self_open_counters(void) |
418 | { | 418 | { |
419 | char filename [] = "/proc/1234567890/sched"; | 419 | struct perf_event_attr attr; |
420 | unsigned long msecs, nsecs; | 420 | int fd; |
421 | char *line = NULL; | ||
422 | u64 total = 0; | ||
423 | size_t len = 0; | ||
424 | ssize_t chars; | ||
425 | FILE *file; | ||
426 | int ret; | ||
427 | 421 | ||
428 | sprintf(filename, "/proc/%d/sched", getpid()); | 422 | memset(&attr, 0, sizeof(attr)); |
429 | file = fopen(filename, "r"); | ||
430 | BUG_ON(!file); | ||
431 | 423 | ||
432 | while ((chars = getline(&line, &len, file)) != -1) { | 424 | attr.type = PERF_TYPE_SOFTWARE; |
433 | ret = sscanf(line, "se.sum_exec_runtime : %ld.%06ld\n", | 425 | attr.config = PERF_COUNT_SW_TASK_CLOCK; |
434 | &msecs, &nsecs); | 426 | |
435 | if (ret == 2) { | 427 | fd = sys_perf_event_open(&attr, 0, -1, -1, 0); |
436 | total = msecs*1e6 + nsecs; | ||
437 | break; | ||
438 | } | ||
439 | } | ||
440 | if (line) | ||
441 | free(line); | ||
442 | fclose(file); | ||
443 | 428 | ||
444 | return total; | 429 | if (fd < 0) |
430 | die("Error: sys_perf_event_open() syscall returned" | ||
431 | "with %d (%s)\n", fd, strerror(errno)); | ||
432 | return fd; | ||
433 | } | ||
434 | |||
435 | static u64 get_cpu_usage_nsec_self(int fd) | ||
436 | { | ||
437 | u64 runtime; | ||
438 | int ret; | ||
439 | |||
440 | ret = read(fd, &runtime, sizeof(runtime)); | ||
441 | BUG_ON(ret != sizeof(runtime)); | ||
442 | |||
443 | return runtime; | ||
445 | } | 444 | } |
446 | 445 | ||
447 | static void *thread_func(void *ctx) | 446 | static void *thread_func(void *ctx) |
@@ -450,9 +449,11 @@ static void *thread_func(void *ctx) | |||
450 | u64 cpu_usage_0, cpu_usage_1; | 449 | u64 cpu_usage_0, cpu_usage_1; |
451 | unsigned long i, ret; | 450 | unsigned long i, ret; |
452 | char comm2[22]; | 451 | char comm2[22]; |
452 | int fd; | ||
453 | 453 | ||
454 | sprintf(comm2, ":%s", this_task->comm); | 454 | sprintf(comm2, ":%s", this_task->comm); |
455 | prctl(PR_SET_NAME, comm2); | 455 | prctl(PR_SET_NAME, comm2); |
456 | fd = self_open_counters(); | ||
456 | 457 | ||
457 | again: | 458 | again: |
458 | ret = sem_post(&this_task->ready_for_work); | 459 | ret = sem_post(&this_task->ready_for_work); |
@@ -462,16 +463,15 @@ again: | |||
462 | ret = pthread_mutex_unlock(&start_work_mutex); | 463 | ret = pthread_mutex_unlock(&start_work_mutex); |
463 | BUG_ON(ret); | 464 | BUG_ON(ret); |
464 | 465 | ||
465 | cpu_usage_0 = get_cpu_usage_nsec_self(); | 466 | cpu_usage_0 = get_cpu_usage_nsec_self(fd); |
466 | 467 | ||
467 | for (i = 0; i < this_task->nr_events; i++) { | 468 | for (i = 0; i < this_task->nr_events; i++) { |
468 | this_task->curr_event = i; | 469 | this_task->curr_event = i; |
469 | process_sched_event(this_task, this_task->atoms[i]); | 470 | process_sched_event(this_task, this_task->atoms[i]); |
470 | } | 471 | } |
471 | 472 | ||
472 | cpu_usage_1 = get_cpu_usage_nsec_self(); | 473 | cpu_usage_1 = get_cpu_usage_nsec_self(fd); |
473 | this_task->cpu_usage = cpu_usage_1 - cpu_usage_0; | 474 | this_task->cpu_usage = cpu_usage_1 - cpu_usage_0; |
474 | |||
475 | ret = sem_post(&this_task->work_done_sem); | 475 | ret = sem_post(&this_task->work_done_sem); |
476 | BUG_ON(ret); | 476 | BUG_ON(ret); |
477 | 477 | ||
@@ -628,11 +628,6 @@ static void test_calibrations(void) | |||
628 | printf("the sleep test took %Ld nsecs\n", T1-T0); | 628 | printf("the sleep test took %Ld nsecs\n", T1-T0); |
629 | } | 629 | } |
630 | 630 | ||
631 | struct raw_event_sample { | ||
632 | u32 size; | ||
633 | char data[0]; | ||
634 | }; | ||
635 | |||
636 | #define FILL_FIELD(ptr, field, event, data) \ | 631 | #define FILL_FIELD(ptr, field, event, data) \ |
637 | ptr.field = (typeof(ptr.field)) raw_field_value(event, #field, data) | 632 | ptr.field = (typeof(ptr.field)) raw_field_value(event, #field, data) |
638 | 633 | ||
@@ -1019,8 +1014,10 @@ add_sched_in_event(struct work_atoms *atoms, u64 timestamp) | |||
1019 | 1014 | ||
1020 | delta = atom->sched_in_time - atom->wake_up_time; | 1015 | delta = atom->sched_in_time - atom->wake_up_time; |
1021 | atoms->total_lat += delta; | 1016 | atoms->total_lat += delta; |
1022 | if (delta > atoms->max_lat) | 1017 | if (delta > atoms->max_lat) { |
1023 | atoms->max_lat = delta; | 1018 | atoms->max_lat = delta; |
1019 | atoms->max_lat_at = timestamp; | ||
1020 | } | ||
1024 | atoms->nb_atoms++; | 1021 | atoms->nb_atoms++; |
1025 | } | 1022 | } |
1026 | 1023 | ||
@@ -1216,10 +1213,11 @@ static void output_lat_thread(struct work_atoms *work_list) | |||
1216 | 1213 | ||
1217 | avg = work_list->total_lat / work_list->nb_atoms; | 1214 | avg = work_list->total_lat / work_list->nb_atoms; |
1218 | 1215 | ||
1219 | printf("|%11.3f ms |%9llu | avg:%9.3f ms | max:%9.3f ms |\n", | 1216 | printf("|%11.3f ms |%9llu | avg:%9.3f ms | max:%9.3f ms | max at: %9.6f s\n", |
1220 | (double)work_list->total_runtime / 1e6, | 1217 | (double)work_list->total_runtime / 1e6, |
1221 | work_list->nb_atoms, (double)avg / 1e6, | 1218 | work_list->nb_atoms, (double)avg / 1e6, |
1222 | (double)work_list->max_lat / 1e6); | 1219 | (double)work_list->max_lat / 1e6, |
1220 | (double)work_list->max_lat_at / 1e9); | ||
1223 | } | 1221 | } |
1224 | 1222 | ||
1225 | static int pid_cmp(struct work_atoms *l, struct work_atoms *r) | 1223 | static int pid_cmp(struct work_atoms *l, struct work_atoms *r) |
@@ -1356,7 +1354,7 @@ static void sort_lat(void) | |||
1356 | static struct trace_sched_handler *trace_handler; | 1354 | static struct trace_sched_handler *trace_handler; |
1357 | 1355 | ||
1358 | static void | 1356 | static void |
1359 | process_sched_wakeup_event(struct raw_event_sample *raw, | 1357 | process_sched_wakeup_event(void *data, |
1360 | struct event *event, | 1358 | struct event *event, |
1361 | int cpu __used, | 1359 | int cpu __used, |
1362 | u64 timestamp __used, | 1360 | u64 timestamp __used, |
@@ -1364,13 +1362,13 @@ process_sched_wakeup_event(struct raw_event_sample *raw, | |||
1364 | { | 1362 | { |
1365 | struct trace_wakeup_event wakeup_event; | 1363 | struct trace_wakeup_event wakeup_event; |
1366 | 1364 | ||
1367 | FILL_COMMON_FIELDS(wakeup_event, event, raw->data); | 1365 | FILL_COMMON_FIELDS(wakeup_event, event, data); |
1368 | 1366 | ||
1369 | FILL_ARRAY(wakeup_event, comm, event, raw->data); | 1367 | FILL_ARRAY(wakeup_event, comm, event, data); |
1370 | FILL_FIELD(wakeup_event, pid, event, raw->data); | 1368 | FILL_FIELD(wakeup_event, pid, event, data); |
1371 | FILL_FIELD(wakeup_event, prio, event, raw->data); | 1369 | FILL_FIELD(wakeup_event, prio, event, data); |
1372 | FILL_FIELD(wakeup_event, success, event, raw->data); | 1370 | FILL_FIELD(wakeup_event, success, event, data); |
1373 | FILL_FIELD(wakeup_event, cpu, event, raw->data); | 1371 | FILL_FIELD(wakeup_event, cpu, event, data); |
1374 | 1372 | ||
1375 | if (trace_handler->wakeup_event) | 1373 | if (trace_handler->wakeup_event) |
1376 | trace_handler->wakeup_event(&wakeup_event, event, cpu, timestamp, thread); | 1374 | trace_handler->wakeup_event(&wakeup_event, event, cpu, timestamp, thread); |
@@ -1469,7 +1467,7 @@ map_switch_event(struct trace_switch_event *switch_event, | |||
1469 | 1467 | ||
1470 | 1468 | ||
1471 | static void | 1469 | static void |
1472 | process_sched_switch_event(struct raw_event_sample *raw, | 1470 | process_sched_switch_event(void *data, |
1473 | struct event *event, | 1471 | struct event *event, |
1474 | int this_cpu, | 1472 | int this_cpu, |
1475 | u64 timestamp __used, | 1473 | u64 timestamp __used, |
@@ -1477,15 +1475,15 @@ process_sched_switch_event(struct raw_event_sample *raw, | |||
1477 | { | 1475 | { |
1478 | struct trace_switch_event switch_event; | 1476 | struct trace_switch_event switch_event; |
1479 | 1477 | ||
1480 | FILL_COMMON_FIELDS(switch_event, event, raw->data); | 1478 | FILL_COMMON_FIELDS(switch_event, event, data); |
1481 | 1479 | ||
1482 | FILL_ARRAY(switch_event, prev_comm, event, raw->data); | 1480 | FILL_ARRAY(switch_event, prev_comm, event, data); |
1483 | FILL_FIELD(switch_event, prev_pid, event, raw->data); | 1481 | FILL_FIELD(switch_event, prev_pid, event, data); |
1484 | FILL_FIELD(switch_event, prev_prio, event, raw->data); | 1482 | FILL_FIELD(switch_event, prev_prio, event, data); |
1485 | FILL_FIELD(switch_event, prev_state, event, raw->data); | 1483 | FILL_FIELD(switch_event, prev_state, event, data); |
1486 | FILL_ARRAY(switch_event, next_comm, event, raw->data); | 1484 | FILL_ARRAY(switch_event, next_comm, event, data); |
1487 | FILL_FIELD(switch_event, next_pid, event, raw->data); | 1485 | FILL_FIELD(switch_event, next_pid, event, data); |
1488 | FILL_FIELD(switch_event, next_prio, event, raw->data); | 1486 | FILL_FIELD(switch_event, next_prio, event, data); |
1489 | 1487 | ||
1490 | if (curr_pid[this_cpu] != (u32)-1) { | 1488 | if (curr_pid[this_cpu] != (u32)-1) { |
1491 | /* | 1489 | /* |
@@ -1502,7 +1500,7 @@ process_sched_switch_event(struct raw_event_sample *raw, | |||
1502 | } | 1500 | } |
1503 | 1501 | ||
1504 | static void | 1502 | static void |
1505 | process_sched_runtime_event(struct raw_event_sample *raw, | 1503 | process_sched_runtime_event(void *data, |
1506 | struct event *event, | 1504 | struct event *event, |
1507 | int cpu __used, | 1505 | int cpu __used, |
1508 | u64 timestamp __used, | 1506 | u64 timestamp __used, |
@@ -1510,17 +1508,17 @@ process_sched_runtime_event(struct raw_event_sample *raw, | |||
1510 | { | 1508 | { |
1511 | struct trace_runtime_event runtime_event; | 1509 | struct trace_runtime_event runtime_event; |
1512 | 1510 | ||
1513 | FILL_ARRAY(runtime_event, comm, event, raw->data); | 1511 | FILL_ARRAY(runtime_event, comm, event, data); |
1514 | FILL_FIELD(runtime_event, pid, event, raw->data); | 1512 | FILL_FIELD(runtime_event, pid, event, data); |
1515 | FILL_FIELD(runtime_event, runtime, event, raw->data); | 1513 | FILL_FIELD(runtime_event, runtime, event, data); |
1516 | FILL_FIELD(runtime_event, vruntime, event, raw->data); | 1514 | FILL_FIELD(runtime_event, vruntime, event, data); |
1517 | 1515 | ||
1518 | if (trace_handler->runtime_event) | 1516 | if (trace_handler->runtime_event) |
1519 | trace_handler->runtime_event(&runtime_event, event, cpu, timestamp, thread); | 1517 | trace_handler->runtime_event(&runtime_event, event, cpu, timestamp, thread); |
1520 | } | 1518 | } |
1521 | 1519 | ||
1522 | static void | 1520 | static void |
1523 | process_sched_fork_event(struct raw_event_sample *raw, | 1521 | process_sched_fork_event(void *data, |
1524 | struct event *event, | 1522 | struct event *event, |
1525 | int cpu __used, | 1523 | int cpu __used, |
1526 | u64 timestamp __used, | 1524 | u64 timestamp __used, |
@@ -1528,12 +1526,12 @@ process_sched_fork_event(struct raw_event_sample *raw, | |||
1528 | { | 1526 | { |
1529 | struct trace_fork_event fork_event; | 1527 | struct trace_fork_event fork_event; |
1530 | 1528 | ||
1531 | FILL_COMMON_FIELDS(fork_event, event, raw->data); | 1529 | FILL_COMMON_FIELDS(fork_event, event, data); |
1532 | 1530 | ||
1533 | FILL_ARRAY(fork_event, parent_comm, event, raw->data); | 1531 | FILL_ARRAY(fork_event, parent_comm, event, data); |
1534 | FILL_FIELD(fork_event, parent_pid, event, raw->data); | 1532 | FILL_FIELD(fork_event, parent_pid, event, data); |
1535 | FILL_ARRAY(fork_event, child_comm, event, raw->data); | 1533 | FILL_ARRAY(fork_event, child_comm, event, data); |
1536 | FILL_FIELD(fork_event, child_pid, event, raw->data); | 1534 | FILL_FIELD(fork_event, child_pid, event, data); |
1537 | 1535 | ||
1538 | if (trace_handler->fork_event) | 1536 | if (trace_handler->fork_event) |
1539 | trace_handler->fork_event(&fork_event, event, cpu, timestamp, thread); | 1537 | trace_handler->fork_event(&fork_event, event, cpu, timestamp, thread); |
@@ -1550,7 +1548,7 @@ process_sched_exit_event(struct event *event, | |||
1550 | } | 1548 | } |
1551 | 1549 | ||
1552 | static void | 1550 | static void |
1553 | process_sched_migrate_task_event(struct raw_event_sample *raw, | 1551 | process_sched_migrate_task_event(void *data, |
1554 | struct event *event, | 1552 | struct event *event, |
1555 | int cpu __used, | 1553 | int cpu __used, |
1556 | u64 timestamp __used, | 1554 | u64 timestamp __used, |
@@ -1558,80 +1556,66 @@ process_sched_migrate_task_event(struct raw_event_sample *raw, | |||
1558 | { | 1556 | { |
1559 | struct trace_migrate_task_event migrate_task_event; | 1557 | struct trace_migrate_task_event migrate_task_event; |
1560 | 1558 | ||
1561 | FILL_COMMON_FIELDS(migrate_task_event, event, raw->data); | 1559 | FILL_COMMON_FIELDS(migrate_task_event, event, data); |
1562 | 1560 | ||
1563 | FILL_ARRAY(migrate_task_event, comm, event, raw->data); | 1561 | FILL_ARRAY(migrate_task_event, comm, event, data); |
1564 | FILL_FIELD(migrate_task_event, pid, event, raw->data); | 1562 | FILL_FIELD(migrate_task_event, pid, event, data); |
1565 | FILL_FIELD(migrate_task_event, prio, event, raw->data); | 1563 | FILL_FIELD(migrate_task_event, prio, event, data); |
1566 | FILL_FIELD(migrate_task_event, cpu, event, raw->data); | 1564 | FILL_FIELD(migrate_task_event, cpu, event, data); |
1567 | 1565 | ||
1568 | if (trace_handler->migrate_task_event) | 1566 | if (trace_handler->migrate_task_event) |
1569 | trace_handler->migrate_task_event(&migrate_task_event, event, cpu, timestamp, thread); | 1567 | trace_handler->migrate_task_event(&migrate_task_event, event, cpu, timestamp, thread); |
1570 | } | 1568 | } |
1571 | 1569 | ||
1572 | static void | 1570 | static void |
1573 | process_raw_event(event_t *raw_event __used, void *more_data, | 1571 | process_raw_event(event_t *raw_event __used, void *data, |
1574 | int cpu, u64 timestamp, struct thread *thread) | 1572 | int cpu, u64 timestamp, struct thread *thread) |
1575 | { | 1573 | { |
1576 | struct raw_event_sample *raw = more_data; | ||
1577 | struct event *event; | 1574 | struct event *event; |
1578 | int type; | 1575 | int type; |
1579 | 1576 | ||
1580 | type = trace_parse_common_type(raw->data); | 1577 | |
1578 | type = trace_parse_common_type(data); | ||
1581 | event = trace_find_event(type); | 1579 | event = trace_find_event(type); |
1582 | 1580 | ||
1583 | if (!strcmp(event->name, "sched_switch")) | 1581 | if (!strcmp(event->name, "sched_switch")) |
1584 | process_sched_switch_event(raw, event, cpu, timestamp, thread); | 1582 | process_sched_switch_event(data, event, cpu, timestamp, thread); |
1585 | if (!strcmp(event->name, "sched_stat_runtime")) | 1583 | if (!strcmp(event->name, "sched_stat_runtime")) |
1586 | process_sched_runtime_event(raw, event, cpu, timestamp, thread); | 1584 | process_sched_runtime_event(data, event, cpu, timestamp, thread); |
1587 | if (!strcmp(event->name, "sched_wakeup")) | 1585 | if (!strcmp(event->name, "sched_wakeup")) |
1588 | process_sched_wakeup_event(raw, event, cpu, timestamp, thread); | 1586 | process_sched_wakeup_event(data, event, cpu, timestamp, thread); |
1589 | if (!strcmp(event->name, "sched_wakeup_new")) | 1587 | if (!strcmp(event->name, "sched_wakeup_new")) |
1590 | process_sched_wakeup_event(raw, event, cpu, timestamp, thread); | 1588 | process_sched_wakeup_event(data, event, cpu, timestamp, thread); |
1591 | if (!strcmp(event->name, "sched_process_fork")) | 1589 | if (!strcmp(event->name, "sched_process_fork")) |
1592 | process_sched_fork_event(raw, event, cpu, timestamp, thread); | 1590 | process_sched_fork_event(data, event, cpu, timestamp, thread); |
1593 | if (!strcmp(event->name, "sched_process_exit")) | 1591 | if (!strcmp(event->name, "sched_process_exit")) |
1594 | process_sched_exit_event(event, cpu, timestamp, thread); | 1592 | process_sched_exit_event(event, cpu, timestamp, thread); |
1595 | if (!strcmp(event->name, "sched_migrate_task")) | 1593 | if (!strcmp(event->name, "sched_migrate_task")) |
1596 | process_sched_migrate_task_event(raw, event, cpu, timestamp, thread); | 1594 | process_sched_migrate_task_event(data, event, cpu, timestamp, thread); |
1597 | } | 1595 | } |
1598 | 1596 | ||
1599 | static int process_sample_event(event_t *event) | 1597 | static int process_sample_event(event_t *event) |
1600 | { | 1598 | { |
1599 | struct sample_data data; | ||
1601 | struct thread *thread; | 1600 | struct thread *thread; |
1602 | u64 ip = event->ip.ip; | ||
1603 | u64 timestamp = -1; | ||
1604 | u32 cpu = -1; | ||
1605 | u64 period = 1; | ||
1606 | void *more_data = event->ip.__more_data; | ||
1607 | 1601 | ||
1608 | if (!(sample_type & PERF_SAMPLE_RAW)) | 1602 | if (!(sample_type & PERF_SAMPLE_RAW)) |
1609 | return 0; | 1603 | return 0; |
1610 | 1604 | ||
1611 | thread = threads__findnew(event->ip.pid); | 1605 | memset(&data, 0, sizeof(data)); |
1606 | data.time = -1; | ||
1607 | data.cpu = -1; | ||
1608 | data.period = -1; | ||
1612 | 1609 | ||
1613 | if (sample_type & PERF_SAMPLE_TIME) { | 1610 | event__parse_sample(event, sample_type, &data); |
1614 | timestamp = *(u64 *)more_data; | ||
1615 | more_data += sizeof(u64); | ||
1616 | } | ||
1617 | |||
1618 | if (sample_type & PERF_SAMPLE_CPU) { | ||
1619 | cpu = *(u32 *)more_data; | ||
1620 | more_data += sizeof(u32); | ||
1621 | more_data += sizeof(u32); /* reserved */ | ||
1622 | } | ||
1623 | |||
1624 | if (sample_type & PERF_SAMPLE_PERIOD) { | ||
1625 | period = *(u64 *)more_data; | ||
1626 | more_data += sizeof(u64); | ||
1627 | } | ||
1628 | 1611 | ||
1629 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", | 1612 | dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", |
1630 | event->header.misc, | 1613 | event->header.misc, |
1631 | event->ip.pid, event->ip.tid, | 1614 | data.pid, data.tid, |
1632 | (void *)(long)ip, | 1615 | (void *)(long)data.ip, |
1633 | (long long)period); | 1616 | (long long)data.period); |
1634 | 1617 | ||
1618 | thread = threads__findnew(data.pid); | ||
1635 | if (thread == NULL) { | 1619 | if (thread == NULL) { |
1636 | pr_debug("problem processing %d event, skipping it.\n", | 1620 | pr_debug("problem processing %d event, skipping it.\n", |
1637 | event->header.type); | 1621 | event->header.type); |
@@ -1640,10 +1624,10 @@ static int process_sample_event(event_t *event) | |||
1640 | 1624 | ||
1641 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); | 1625 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); |
1642 | 1626 | ||
1643 | if (profile_cpu != -1 && profile_cpu != (int) cpu) | 1627 | if (profile_cpu != -1 && profile_cpu != (int)data.cpu) |
1644 | return 0; | 1628 | return 0; |
1645 | 1629 | ||
1646 | process_raw_event(event, more_data, cpu, timestamp, thread); | 1630 | process_raw_event(event, data.raw_data, data.cpu, data.time, thread); |
1647 | 1631 | ||
1648 | return 0; | 1632 | return 0; |
1649 | } | 1633 | } |
@@ -1724,9 +1708,9 @@ static void __cmd_lat(void) | |||
1724 | read_events(); | 1708 | read_events(); |
1725 | sort_lat(); | 1709 | sort_lat(); |
1726 | 1710 | ||
1727 | printf("\n -----------------------------------------------------------------------------------------\n"); | 1711 | printf("\n ---------------------------------------------------------------------------------------------------------------\n"); |
1728 | printf(" Task | Runtime ms | Switches | Average delay ms | Maximum delay ms |\n"); | 1712 | printf(" Task | Runtime ms | Switches | Average delay ms | Maximum delay ms | Maximum delay at |\n"); |
1729 | printf(" -----------------------------------------------------------------------------------------\n"); | 1713 | printf(" ---------------------------------------------------------------------------------------------------------------\n"); |
1730 | 1714 | ||
1731 | next = rb_first(&sorted_atom_root); | 1715 | next = rb_first(&sorted_atom_root); |
1732 | 1716 | ||
@@ -1902,13 +1886,18 @@ static int __cmd_record(int argc, const char **argv) | |||
1902 | 1886 | ||
1903 | int cmd_sched(int argc, const char **argv, const char *prefix __used) | 1887 | int cmd_sched(int argc, const char **argv, const char *prefix __used) |
1904 | { | 1888 | { |
1905 | symbol__init(0); | ||
1906 | |||
1907 | argc = parse_options(argc, argv, sched_options, sched_usage, | 1889 | argc = parse_options(argc, argv, sched_options, sched_usage, |
1908 | PARSE_OPT_STOP_AT_NON_OPTION); | 1890 | PARSE_OPT_STOP_AT_NON_OPTION); |
1909 | if (!argc) | 1891 | if (!argc) |
1910 | usage_with_options(sched_usage, sched_options); | 1892 | usage_with_options(sched_usage, sched_options); |
1911 | 1893 | ||
1894 | /* | ||
1895 | * Aliased to 'perf trace' for now: | ||
1896 | */ | ||
1897 | if (!strcmp(argv[0], "trace")) | ||
1898 | return cmd_trace(argc, argv, prefix); | ||
1899 | |||
1900 | symbol__init(0); | ||
1912 | if (!strncmp(argv[0], "rec", 3)) { | 1901 | if (!strncmp(argv[0], "rec", 3)) { |
1913 | return __cmd_record(argc, argv); | 1902 | return __cmd_record(argc, argv); |
1914 | } else if (!strncmp(argv[0], "lat", 3)) { | 1903 | } else if (!strncmp(argv[0], "lat", 3)) { |
@@ -1932,11 +1921,6 @@ int cmd_sched(int argc, const char **argv, const char *prefix __used) | |||
1932 | usage_with_options(replay_usage, replay_options); | 1921 | usage_with_options(replay_usage, replay_options); |
1933 | } | 1922 | } |
1934 | __cmd_replay(); | 1923 | __cmd_replay(); |
1935 | } else if (!strcmp(argv[0], "trace")) { | ||
1936 | /* | ||
1937 | * Aliased to 'perf trace' for now: | ||
1938 | */ | ||
1939 | return cmd_trace(argc, argv, prefix); | ||
1940 | } else { | 1924 | } else { |
1941 | usage_with_options(sched_usage, sched_options); | 1925 | usage_with_options(sched_usage, sched_options); |
1942 | } | 1926 | } |