diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/builtin-kmem.c | 38 | ||||
| -rw-r--r-- | tools/perf/builtin-sched.c | 94 |
2 files changed, 56 insertions, 76 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index f84d7a3db681..7551a5f834b8 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
| @@ -57,11 +57,6 @@ static struct rb_root root_caller_sorted; | |||
| 57 | static unsigned long total_requested, total_allocated; | 57 | static unsigned long total_requested, total_allocated; |
| 58 | static unsigned long nr_allocs, nr_cross_allocs; | 58 | static unsigned long nr_allocs, nr_cross_allocs; |
| 59 | 59 | ||
| 60 | struct raw_event_sample { | ||
| 61 | u32 size; | ||
| 62 | char data[0]; | ||
| 63 | }; | ||
| 64 | |||
| 65 | #define PATH_SYS_NODE "/sys/devices/system/node" | 60 | #define PATH_SYS_NODE "/sys/devices/system/node" |
| 66 | 61 | ||
| 67 | static void init_cpunode_map(void) | 62 | static void init_cpunode_map(void) |
| @@ -201,7 +196,7 @@ static void insert_caller_stat(unsigned long call_site, | |||
| 201 | } | 196 | } |
| 202 | } | 197 | } |
| 203 | 198 | ||
| 204 | static void process_alloc_event(struct raw_event_sample *raw, | 199 | static void process_alloc_event(void *data, |
| 205 | struct event *event, | 200 | struct event *event, |
| 206 | int cpu, | 201 | int cpu, |
| 207 | u64 timestamp __used, | 202 | u64 timestamp __used, |
| @@ -214,10 +209,10 @@ static void process_alloc_event(struct raw_event_sample *raw, | |||
| 214 | int bytes_alloc; | 209 | int bytes_alloc; |
| 215 | int node1, node2; | 210 | int node1, node2; |
| 216 | 211 | ||
| 217 | ptr = raw_field_value(event, "ptr", raw->data); | 212 | ptr = raw_field_value(event, "ptr", data); |
| 218 | call_site = raw_field_value(event, "call_site", raw->data); | 213 | call_site = raw_field_value(event, "call_site", data); |
| 219 | bytes_req = raw_field_value(event, "bytes_req", raw->data); | 214 | bytes_req = raw_field_value(event, "bytes_req", data); |
| 220 | bytes_alloc = raw_field_value(event, "bytes_alloc", raw->data); | 215 | bytes_alloc = raw_field_value(event, "bytes_alloc", data); |
| 221 | 216 | ||
| 222 | insert_alloc_stat(call_site, ptr, bytes_req, bytes_alloc, cpu); | 217 | insert_alloc_stat(call_site, ptr, bytes_req, bytes_alloc, cpu); |
| 223 | insert_caller_stat(call_site, bytes_req, bytes_alloc); | 218 | insert_caller_stat(call_site, bytes_req, bytes_alloc); |
| @@ -227,7 +222,7 @@ static void process_alloc_event(struct raw_event_sample *raw, | |||
| 227 | 222 | ||
| 228 | if (node) { | 223 | if (node) { |
| 229 | node1 = cpunode_map[cpu]; | 224 | node1 = cpunode_map[cpu]; |
| 230 | node2 = raw_field_value(event, "node", raw->data); | 225 | node2 = raw_field_value(event, "node", data); |
| 231 | if (node1 != node2) | 226 | if (node1 != node2) |
| 232 | nr_cross_allocs++; | 227 | nr_cross_allocs++; |
| 233 | } | 228 | } |
| @@ -262,7 +257,7 @@ static struct alloc_stat *search_alloc_stat(unsigned long ptr, | |||
| 262 | return NULL; | 257 | return NULL; |
| 263 | } | 258 | } |
| 264 | 259 | ||
| 265 | static void process_free_event(struct raw_event_sample *raw, | 260 | static void process_free_event(void *data, |
| 266 | struct event *event, | 261 | struct event *event, |
| 267 | int cpu, | 262 | int cpu, |
| 268 | u64 timestamp __used, | 263 | u64 timestamp __used, |
| @@ -271,7 +266,7 @@ static void process_free_event(struct raw_event_sample *raw, | |||
| 271 | unsigned long ptr; | 266 | unsigned long ptr; |
| 272 | struct alloc_stat *s_alloc, *s_caller; | 267 | struct alloc_stat *s_alloc, *s_caller; |
| 273 | 268 | ||
| 274 | ptr = raw_field_value(event, "ptr", raw->data); | 269 | ptr = raw_field_value(event, "ptr", data); |
| 275 | 270 | ||
| 276 | s_alloc = search_alloc_stat(ptr, 0, &root_alloc_stat, ptr_cmp); | 271 | s_alloc = search_alloc_stat(ptr, 0, &root_alloc_stat, ptr_cmp); |
| 277 | if (!s_alloc) | 272 | if (!s_alloc) |
| @@ -289,35 +284,30 @@ static void process_free_event(struct raw_event_sample *raw, | |||
| 289 | } | 284 | } |
| 290 | 285 | ||
| 291 | static void | 286 | static void |
| 292 | process_raw_event(event_t *raw_event __used, u32 size, void *data, | 287 | process_raw_event(event_t *raw_event __used, void *data, |
| 293 | int cpu, u64 timestamp, struct thread *thread) | 288 | int cpu, u64 timestamp, struct thread *thread) |
| 294 | { | 289 | { |
| 295 | struct raw_event_sample *raw; | ||
| 296 | struct event *event; | 290 | struct event *event; |
| 297 | int type; | 291 | int type; |
| 298 | 292 | ||
| 299 | raw = malloc_or_die(sizeof(*raw)+size); | 293 | type = trace_parse_common_type(data); |
| 300 | raw->size = size; | ||
| 301 | memcpy(raw->data, data, size); | ||
| 302 | |||
| 303 | type = trace_parse_common_type(raw->data); | ||
| 304 | event = trace_find_event(type); | 294 | event = trace_find_event(type); |
| 305 | 295 | ||
| 306 | if (!strcmp(event->name, "kmalloc") || | 296 | if (!strcmp(event->name, "kmalloc") || |
| 307 | !strcmp(event->name, "kmem_cache_alloc")) { | 297 | !strcmp(event->name, "kmem_cache_alloc")) { |
| 308 | process_alloc_event(raw, event, cpu, timestamp, thread, 0); | 298 | process_alloc_event(data, event, cpu, timestamp, thread, 0); |
| 309 | return; | 299 | return; |
| 310 | } | 300 | } |
| 311 | 301 | ||
| 312 | if (!strcmp(event->name, "kmalloc_node") || | 302 | if (!strcmp(event->name, "kmalloc_node") || |
| 313 | !strcmp(event->name, "kmem_cache_alloc_node")) { | 303 | !strcmp(event->name, "kmem_cache_alloc_node")) { |
| 314 | process_alloc_event(raw, event, cpu, timestamp, thread, 1); | 304 | process_alloc_event(data, event, cpu, timestamp, thread, 1); |
| 315 | return; | 305 | return; |
| 316 | } | 306 | } |
| 317 | 307 | ||
| 318 | if (!strcmp(event->name, "kfree") || | 308 | if (!strcmp(event->name, "kfree") || |
| 319 | !strcmp(event->name, "kmem_cache_free")) { | 309 | !strcmp(event->name, "kmem_cache_free")) { |
| 320 | process_free_event(raw, event, cpu, timestamp, thread); | 310 | process_free_event(data, event, cpu, timestamp, thread); |
| 321 | return; | 311 | return; |
| 322 | } | 312 | } |
| 323 | } | 313 | } |
| @@ -349,7 +339,7 @@ static int process_sample_event(event_t *event) | |||
| 349 | 339 | ||
| 350 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); | 340 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); |
| 351 | 341 | ||
| 352 | process_raw_event(event, data.raw_size, data.raw_data, data.cpu, | 342 | process_raw_event(event, data.raw_data, data.cpu, |
| 353 | data.time, thread); | 343 | data.time, thread); |
| 354 | 344 | ||
| 355 | return 0; | 345 | return 0; |
diff --git a/tools/perf/builtin-sched.c b/tools/perf/builtin-sched.c index 4655e16b929b..19f43faa9f81 100644 --- a/tools/perf/builtin-sched.c +++ b/tools/perf/builtin-sched.c | |||
| @@ -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 | ||
| @@ -1356,7 +1351,7 @@ static void sort_lat(void) | |||
| 1356 | static struct trace_sched_handler *trace_handler; | 1351 | static struct trace_sched_handler *trace_handler; |
| 1357 | 1352 | ||
| 1358 | static void | 1353 | static void |
| 1359 | process_sched_wakeup_event(struct raw_event_sample *raw, | 1354 | process_sched_wakeup_event(void *data, |
| 1360 | struct event *event, | 1355 | struct event *event, |
| 1361 | int cpu __used, | 1356 | int cpu __used, |
| 1362 | u64 timestamp __used, | 1357 | u64 timestamp __used, |
| @@ -1364,13 +1359,13 @@ process_sched_wakeup_event(struct raw_event_sample *raw, | |||
| 1364 | { | 1359 | { |
| 1365 | struct trace_wakeup_event wakeup_event; | 1360 | struct trace_wakeup_event wakeup_event; |
| 1366 | 1361 | ||
| 1367 | FILL_COMMON_FIELDS(wakeup_event, event, raw->data); | 1362 | FILL_COMMON_FIELDS(wakeup_event, event, data); |
| 1368 | 1363 | ||
| 1369 | FILL_ARRAY(wakeup_event, comm, event, raw->data); | 1364 | FILL_ARRAY(wakeup_event, comm, event, data); |
| 1370 | FILL_FIELD(wakeup_event, pid, event, raw->data); | 1365 | FILL_FIELD(wakeup_event, pid, event, data); |
| 1371 | FILL_FIELD(wakeup_event, prio, event, raw->data); | 1366 | FILL_FIELD(wakeup_event, prio, event, data); |
| 1372 | FILL_FIELD(wakeup_event, success, event, raw->data); | 1367 | FILL_FIELD(wakeup_event, success, event, data); |
| 1373 | FILL_FIELD(wakeup_event, cpu, event, raw->data); | 1368 | FILL_FIELD(wakeup_event, cpu, event, data); |
| 1374 | 1369 | ||
| 1375 | if (trace_handler->wakeup_event) | 1370 | if (trace_handler->wakeup_event) |
| 1376 | trace_handler->wakeup_event(&wakeup_event, event, cpu, timestamp, thread); | 1371 | trace_handler->wakeup_event(&wakeup_event, event, cpu, timestamp, thread); |
| @@ -1469,7 +1464,7 @@ map_switch_event(struct trace_switch_event *switch_event, | |||
| 1469 | 1464 | ||
| 1470 | 1465 | ||
| 1471 | static void | 1466 | static void |
| 1472 | process_sched_switch_event(struct raw_event_sample *raw, | 1467 | process_sched_switch_event(void *data, |
| 1473 | struct event *event, | 1468 | struct event *event, |
| 1474 | int this_cpu, | 1469 | int this_cpu, |
| 1475 | u64 timestamp __used, | 1470 | u64 timestamp __used, |
| @@ -1477,15 +1472,15 @@ process_sched_switch_event(struct raw_event_sample *raw, | |||
| 1477 | { | 1472 | { |
| 1478 | struct trace_switch_event switch_event; | 1473 | struct trace_switch_event switch_event; |
| 1479 | 1474 | ||
| 1480 | FILL_COMMON_FIELDS(switch_event, event, raw->data); | 1475 | FILL_COMMON_FIELDS(switch_event, event, data); |
| 1481 | 1476 | ||
| 1482 | FILL_ARRAY(switch_event, prev_comm, event, raw->data); | 1477 | FILL_ARRAY(switch_event, prev_comm, event, data); |
| 1483 | FILL_FIELD(switch_event, prev_pid, event, raw->data); | 1478 | FILL_FIELD(switch_event, prev_pid, event, data); |
| 1484 | FILL_FIELD(switch_event, prev_prio, event, raw->data); | 1479 | FILL_FIELD(switch_event, prev_prio, event, data); |
| 1485 | FILL_FIELD(switch_event, prev_state, event, raw->data); | 1480 | FILL_FIELD(switch_event, prev_state, event, data); |
| 1486 | FILL_ARRAY(switch_event, next_comm, event, raw->data); | 1481 | FILL_ARRAY(switch_event, next_comm, event, data); |
| 1487 | FILL_FIELD(switch_event, next_pid, event, raw->data); | 1482 | FILL_FIELD(switch_event, next_pid, event, data); |
| 1488 | FILL_FIELD(switch_event, next_prio, event, raw->data); | 1483 | FILL_FIELD(switch_event, next_prio, event, data); |
| 1489 | 1484 | ||
| 1490 | if (curr_pid[this_cpu] != (u32)-1) { | 1485 | if (curr_pid[this_cpu] != (u32)-1) { |
| 1491 | /* | 1486 | /* |
| @@ -1502,7 +1497,7 @@ process_sched_switch_event(struct raw_event_sample *raw, | |||
| 1502 | } | 1497 | } |
| 1503 | 1498 | ||
| 1504 | static void | 1499 | static void |
| 1505 | process_sched_runtime_event(struct raw_event_sample *raw, | 1500 | process_sched_runtime_event(void *data, |
| 1506 | struct event *event, | 1501 | struct event *event, |
| 1507 | int cpu __used, | 1502 | int cpu __used, |
| 1508 | u64 timestamp __used, | 1503 | u64 timestamp __used, |
| @@ -1510,17 +1505,17 @@ process_sched_runtime_event(struct raw_event_sample *raw, | |||
| 1510 | { | 1505 | { |
| 1511 | struct trace_runtime_event runtime_event; | 1506 | struct trace_runtime_event runtime_event; |
| 1512 | 1507 | ||
| 1513 | FILL_ARRAY(runtime_event, comm, event, raw->data); | 1508 | FILL_ARRAY(runtime_event, comm, event, data); |
| 1514 | FILL_FIELD(runtime_event, pid, event, raw->data); | 1509 | FILL_FIELD(runtime_event, pid, event, data); |
| 1515 | FILL_FIELD(runtime_event, runtime, event, raw->data); | 1510 | FILL_FIELD(runtime_event, runtime, event, data); |
| 1516 | FILL_FIELD(runtime_event, vruntime, event, raw->data); | 1511 | FILL_FIELD(runtime_event, vruntime, event, data); |
| 1517 | 1512 | ||
| 1518 | if (trace_handler->runtime_event) | 1513 | if (trace_handler->runtime_event) |
| 1519 | trace_handler->runtime_event(&runtime_event, event, cpu, timestamp, thread); | 1514 | trace_handler->runtime_event(&runtime_event, event, cpu, timestamp, thread); |
| 1520 | } | 1515 | } |
| 1521 | 1516 | ||
| 1522 | static void | 1517 | static void |
| 1523 | process_sched_fork_event(struct raw_event_sample *raw, | 1518 | process_sched_fork_event(void *data, |
| 1524 | struct event *event, | 1519 | struct event *event, |
| 1525 | int cpu __used, | 1520 | int cpu __used, |
| 1526 | u64 timestamp __used, | 1521 | u64 timestamp __used, |
| @@ -1528,12 +1523,12 @@ process_sched_fork_event(struct raw_event_sample *raw, | |||
| 1528 | { | 1523 | { |
| 1529 | struct trace_fork_event fork_event; | 1524 | struct trace_fork_event fork_event; |
| 1530 | 1525 | ||
| 1531 | FILL_COMMON_FIELDS(fork_event, event, raw->data); | 1526 | FILL_COMMON_FIELDS(fork_event, event, data); |
| 1532 | 1527 | ||
| 1533 | FILL_ARRAY(fork_event, parent_comm, event, raw->data); | 1528 | FILL_ARRAY(fork_event, parent_comm, event, data); |
| 1534 | FILL_FIELD(fork_event, parent_pid, event, raw->data); | 1529 | FILL_FIELD(fork_event, parent_pid, event, data); |
| 1535 | FILL_ARRAY(fork_event, child_comm, event, raw->data); | 1530 | FILL_ARRAY(fork_event, child_comm, event, data); |
| 1536 | FILL_FIELD(fork_event, child_pid, event, raw->data); | 1531 | FILL_FIELD(fork_event, child_pid, event, data); |
| 1537 | 1532 | ||
| 1538 | if (trace_handler->fork_event) | 1533 | if (trace_handler->fork_event) |
| 1539 | trace_handler->fork_event(&fork_event, event, cpu, timestamp, thread); | 1534 | trace_handler->fork_event(&fork_event, event, cpu, timestamp, thread); |
| @@ -1550,7 +1545,7 @@ process_sched_exit_event(struct event *event, | |||
| 1550 | } | 1545 | } |
| 1551 | 1546 | ||
| 1552 | static void | 1547 | static void |
| 1553 | process_sched_migrate_task_event(struct raw_event_sample *raw, | 1548 | process_sched_migrate_task_event(void *data, |
| 1554 | struct event *event, | 1549 | struct event *event, |
| 1555 | int cpu __used, | 1550 | int cpu __used, |
| 1556 | u64 timestamp __used, | 1551 | u64 timestamp __used, |
| @@ -1558,46 +1553,42 @@ process_sched_migrate_task_event(struct raw_event_sample *raw, | |||
| 1558 | { | 1553 | { |
| 1559 | struct trace_migrate_task_event migrate_task_event; | 1554 | struct trace_migrate_task_event migrate_task_event; |
| 1560 | 1555 | ||
| 1561 | FILL_COMMON_FIELDS(migrate_task_event, event, raw->data); | 1556 | FILL_COMMON_FIELDS(migrate_task_event, event, data); |
| 1562 | 1557 | ||
| 1563 | FILL_ARRAY(migrate_task_event, comm, event, raw->data); | 1558 | FILL_ARRAY(migrate_task_event, comm, event, data); |
| 1564 | FILL_FIELD(migrate_task_event, pid, event, raw->data); | 1559 | FILL_FIELD(migrate_task_event, pid, event, data); |
| 1565 | FILL_FIELD(migrate_task_event, prio, event, raw->data); | 1560 | FILL_FIELD(migrate_task_event, prio, event, data); |
| 1566 | FILL_FIELD(migrate_task_event, cpu, event, raw->data); | 1561 | FILL_FIELD(migrate_task_event, cpu, event, data); |
| 1567 | 1562 | ||
| 1568 | if (trace_handler->migrate_task_event) | 1563 | if (trace_handler->migrate_task_event) |
| 1569 | trace_handler->migrate_task_event(&migrate_task_event, event, cpu, timestamp, thread); | 1564 | trace_handler->migrate_task_event(&migrate_task_event, event, cpu, timestamp, thread); |
| 1570 | } | 1565 | } |
| 1571 | 1566 | ||
| 1572 | static void | 1567 | static void |
| 1573 | process_raw_event(event_t *raw_event __used, u32 size, void *data, | 1568 | process_raw_event(event_t *raw_event __used, void *data, |
| 1574 | int cpu, u64 timestamp, struct thread *thread) | 1569 | int cpu, u64 timestamp, struct thread *thread) |
| 1575 | { | 1570 | { |
| 1576 | struct raw_event_sample *raw; | ||
| 1577 | struct event *event; | 1571 | struct event *event; |
| 1578 | int type; | 1572 | int type; |
| 1579 | 1573 | ||
| 1580 | raw = malloc_or_die(sizeof(*raw)+size); | ||
| 1581 | raw->size = size; | ||
| 1582 | memcpy(raw->data, data, size); | ||
| 1583 | 1574 | ||
| 1584 | type = trace_parse_common_type(raw->data); | 1575 | type = trace_parse_common_type(data); |
| 1585 | event = trace_find_event(type); | 1576 | event = trace_find_event(type); |
| 1586 | 1577 | ||
| 1587 | if (!strcmp(event->name, "sched_switch")) | 1578 | if (!strcmp(event->name, "sched_switch")) |
| 1588 | process_sched_switch_event(raw, event, cpu, timestamp, thread); | 1579 | process_sched_switch_event(data, event, cpu, timestamp, thread); |
| 1589 | if (!strcmp(event->name, "sched_stat_runtime")) | 1580 | if (!strcmp(event->name, "sched_stat_runtime")) |
| 1590 | process_sched_runtime_event(raw, event, cpu, timestamp, thread); | 1581 | process_sched_runtime_event(data, event, cpu, timestamp, thread); |
| 1591 | if (!strcmp(event->name, "sched_wakeup")) | 1582 | if (!strcmp(event->name, "sched_wakeup")) |
| 1592 | process_sched_wakeup_event(raw, event, cpu, timestamp, thread); | 1583 | process_sched_wakeup_event(data, event, cpu, timestamp, thread); |
| 1593 | if (!strcmp(event->name, "sched_wakeup_new")) | 1584 | if (!strcmp(event->name, "sched_wakeup_new")) |
| 1594 | process_sched_wakeup_event(raw, event, cpu, timestamp, thread); | 1585 | process_sched_wakeup_event(data, event, cpu, timestamp, thread); |
| 1595 | if (!strcmp(event->name, "sched_process_fork")) | 1586 | if (!strcmp(event->name, "sched_process_fork")) |
| 1596 | process_sched_fork_event(raw, event, cpu, timestamp, thread); | 1587 | process_sched_fork_event(data, event, cpu, timestamp, thread); |
| 1597 | if (!strcmp(event->name, "sched_process_exit")) | 1588 | if (!strcmp(event->name, "sched_process_exit")) |
| 1598 | process_sched_exit_event(event, cpu, timestamp, thread); | 1589 | process_sched_exit_event(event, cpu, timestamp, thread); |
| 1599 | if (!strcmp(event->name, "sched_migrate_task")) | 1590 | if (!strcmp(event->name, "sched_migrate_task")) |
| 1600 | process_sched_migrate_task_event(raw, event, cpu, timestamp, thread); | 1591 | process_sched_migrate_task_event(data, event, cpu, timestamp, thread); |
| 1601 | } | 1592 | } |
| 1602 | 1593 | ||
| 1603 | static int process_sample_event(event_t *event) | 1594 | static int process_sample_event(event_t *event) |
| @@ -1633,8 +1624,7 @@ static int process_sample_event(event_t *event) | |||
| 1633 | if (profile_cpu != -1 && profile_cpu != (int)data.cpu) | 1624 | if (profile_cpu != -1 && profile_cpu != (int)data.cpu) |
| 1634 | return 0; | 1625 | return 0; |
| 1635 | 1626 | ||
| 1636 | process_raw_event(event, data.raw_size, data.raw_data, data.cpu, | 1627 | process_raw_event(event, data.raw_data, data.cpu, data.time, thread); |
| 1637 | data.time, thread); | ||
| 1638 | 1628 | ||
| 1639 | return 0; | 1629 | return 0; |
| 1640 | } | 1630 | } |
