diff options
Diffstat (limited to 'tools/perf/builtin-kmem.c')
-rw-r--r-- | tools/perf/builtin-kmem.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index 547af48deb4f..ce35015f2dc6 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -57,6 +57,11 @@ static unsigned long nr_allocs, nr_cross_allocs; | |||
57 | 57 | ||
58 | #define PATH_SYS_NODE "/sys/devices/system/node" | 58 | #define PATH_SYS_NODE "/sys/devices/system/node" |
59 | 59 | ||
60 | struct perf_kmem { | ||
61 | struct perf_tool tool; | ||
62 | struct perf_session *session; | ||
63 | }; | ||
64 | |||
60 | static void init_cpunode_map(void) | 65 | static void init_cpunode_map(void) |
61 | { | 66 | { |
62 | FILE *fp; | 67 | FILE *fp; |
@@ -278,14 +283,16 @@ static void process_free_event(void *data, | |||
278 | s_alloc->alloc_cpu = -1; | 283 | s_alloc->alloc_cpu = -1; |
279 | } | 284 | } |
280 | 285 | ||
281 | static void process_raw_event(union perf_event *raw_event __used, void *data, | 286 | static void process_raw_event(struct perf_tool *tool, |
287 | union perf_event *raw_event __used, void *data, | ||
282 | int cpu, u64 timestamp, struct thread *thread) | 288 | int cpu, u64 timestamp, struct thread *thread) |
283 | { | 289 | { |
290 | struct perf_kmem *kmem = container_of(tool, struct perf_kmem, tool); | ||
284 | struct event_format *event; | 291 | struct event_format *event; |
285 | int type; | 292 | int type; |
286 | 293 | ||
287 | type = trace_parse_common_type(data); | 294 | type = trace_parse_common_type(kmem->session->pevent, data); |
288 | event = trace_find_event(type); | 295 | event = pevent_find_event(kmem->session->pevent, type); |
289 | 296 | ||
290 | if (!strcmp(event->name, "kmalloc") || | 297 | if (!strcmp(event->name, "kmalloc") || |
291 | !strcmp(event->name, "kmem_cache_alloc")) { | 298 | !strcmp(event->name, "kmem_cache_alloc")) { |
@@ -306,7 +313,7 @@ static void process_raw_event(union perf_event *raw_event __used, void *data, | |||
306 | } | 313 | } |
307 | } | 314 | } |
308 | 315 | ||
309 | static int process_sample_event(struct perf_tool *tool __used, | 316 | static int process_sample_event(struct perf_tool *tool, |
310 | union perf_event *event, | 317 | union perf_event *event, |
311 | struct perf_sample *sample, | 318 | struct perf_sample *sample, |
312 | struct perf_evsel *evsel __used, | 319 | struct perf_evsel *evsel __used, |
@@ -322,16 +329,18 @@ static int process_sample_event(struct perf_tool *tool __used, | |||
322 | 329 | ||
323 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); | 330 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); |
324 | 331 | ||
325 | process_raw_event(event, sample->raw_data, sample->cpu, | 332 | process_raw_event(tool, event, sample->raw_data, sample->cpu, |
326 | sample->time, thread); | 333 | sample->time, thread); |
327 | 334 | ||
328 | return 0; | 335 | return 0; |
329 | } | 336 | } |
330 | 337 | ||
331 | static struct perf_tool perf_kmem = { | 338 | static struct perf_kmem perf_kmem = { |
332 | .sample = process_sample_event, | 339 | .tool = { |
333 | .comm = perf_event__process_comm, | 340 | .sample = process_sample_event, |
334 | .ordered_samples = true, | 341 | .comm = perf_event__process_comm, |
342 | .ordered_samples = true, | ||
343 | }, | ||
335 | }; | 344 | }; |
336 | 345 | ||
337 | static double fragmentation(unsigned long n_req, unsigned long n_alloc) | 346 | static double fragmentation(unsigned long n_req, unsigned long n_alloc) |
@@ -486,11 +495,15 @@ static void sort_result(void) | |||
486 | static int __cmd_kmem(void) | 495 | static int __cmd_kmem(void) |
487 | { | 496 | { |
488 | int err = -EINVAL; | 497 | int err = -EINVAL; |
489 | struct perf_session *session = perf_session__new(input_name, O_RDONLY, | 498 | struct perf_session *session; |
490 | 0, false, &perf_kmem); | 499 | |
500 | session = perf_session__new(input_name, O_RDONLY, 0, false, | ||
501 | &perf_kmem.tool); | ||
491 | if (session == NULL) | 502 | if (session == NULL) |
492 | return -ENOMEM; | 503 | return -ENOMEM; |
493 | 504 | ||
505 | perf_kmem.session = session; | ||
506 | |||
494 | if (perf_session__create_kernel_maps(session) < 0) | 507 | if (perf_session__create_kernel_maps(session) < 0) |
495 | goto out_delete; | 508 | goto out_delete; |
496 | 509 | ||
@@ -498,7 +511,7 @@ static int __cmd_kmem(void) | |||
498 | goto out_delete; | 511 | goto out_delete; |
499 | 512 | ||
500 | setup_pager(); | 513 | setup_pager(); |
501 | err = perf_session__process_events(session, &perf_kmem); | 514 | err = perf_session__process_events(session, &perf_kmem.tool); |
502 | if (err != 0) | 515 | if (err != 0) |
503 | goto out_delete; | 516 | goto out_delete; |
504 | sort_result(); | 517 | sort_result(); |