aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-kmem.c
diff options
context:
space:
mode:
authorOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>2009-12-06 06:08:24 -0500
committerIngo Molnar <mingo@elte.hu>2009-12-06 12:15:01 -0500
commit180f95e29aa8782c019caa64ede2a28d8ab62564 (patch)
treeeefd1631820b00992f4495cc8cdba66a9155ee6c /tools/perf/builtin-kmem.c
parent028c515253761084c6594bf9ac9b194b51d87065 (diff)
perf: Make common SAMPLE_EVENT parser
Currently, sample event data is parsed for each commands, and it is assuming that the data is not including other data. (E.g. timechart, trace, etc. can't parse the event if it has PERF_SAMPLE_CALLCHAIN) So, even if we record the superset data for multiple commands at a time, commands can't parse. etc. To fix it, this makes common sample event parser, and use it to parse sample event correctly. (PERF_SAMPLE_READ is unsupported for now though, it seems to be not using.) Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> LKML-Reference: <87hbs48imv.fsf@devron.myhome.or.jp> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/builtin-kmem.c')
-rw-r--r--tools/perf/builtin-kmem.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c
index 047fef74bd52..f218990de0cd 100644
--- a/tools/perf/builtin-kmem.c
+++ b/tools/perf/builtin-kmem.c
@@ -320,35 +320,23 @@ process_raw_event(event_t *raw_event __used, void *more_data,
320 320
321static int process_sample_event(event_t *event) 321static int process_sample_event(event_t *event)
322{ 322{
323 u64 ip = event->ip.ip; 323 struct sample_data data;
324 u64 timestamp = -1; 324 struct thread *thread;
325 u32 cpu = -1;
326 u64 period = 1;
327 void *more_data = event->ip.__more_data;
328 struct thread *thread = threads__findnew(event->ip.pid);
329
330 if (sample_type & PERF_SAMPLE_TIME) {
331 timestamp = *(u64 *)more_data;
332 more_data += sizeof(u64);
333 }
334 325
335 if (sample_type & PERF_SAMPLE_CPU) { 326 memset(&data, 0, sizeof(data));
336 cpu = *(u32 *)more_data; 327 data.time = -1;
337 more_data += sizeof(u32); 328 data.cpu = -1;
338 more_data += sizeof(u32); /* reserved */ 329 data.period = 1;
339 }
340 330
341 if (sample_type & PERF_SAMPLE_PERIOD) { 331 event__parse_sample(event, sample_type, &data);
342 period = *(u64 *)more_data;
343 more_data += sizeof(u64);
344 }
345 332
346 dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", 333 dump_printf("(IP, %d): %d/%d: %p period: %Ld\n",
347 event->header.misc, 334 event->header.misc,
348 event->ip.pid, event->ip.tid, 335 data.pid, data.tid,
349 (void *)(long)ip, 336 (void *)(long)data.ip,
350 (long long)period); 337 (long long)data.period);
351 338
339 thread = threads__findnew(event->ip.pid);
352 if (thread == NULL) { 340 if (thread == NULL) {
353 pr_debug("problem processing %d event, skipping it.\n", 341 pr_debug("problem processing %d event, skipping it.\n",
354 event->header.type); 342 event->header.type);
@@ -357,7 +345,7 @@ static int process_sample_event(event_t *event)
357 345
358 dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); 346 dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid);
359 347
360 process_raw_event(event, more_data, cpu, timestamp, thread); 348 process_raw_event(event, data.raw_data, data.cpu, data.time, thread);
361 349
362 return 0; 350 return 0;
363} 351}