diff options
Diffstat (limited to 'drivers/oprofile/buffer_sync.c')
-rw-r--r-- | drivers/oprofile/buffer_sync.c | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index 908202afbae9..d969bb13a252 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c | |||
@@ -1,11 +1,12 @@ | |||
1 | /** | 1 | /** |
2 | * @file buffer_sync.c | 2 | * @file buffer_sync.c |
3 | * | 3 | * |
4 | * @remark Copyright 2002 OProfile authors | 4 | * @remark Copyright 2002-2009 OProfile authors |
5 | * @remark Read the file COPYING | 5 | * @remark Read the file COPYING |
6 | * | 6 | * |
7 | * @author John Levon <levon@movementarian.org> | 7 | * @author John Levon <levon@movementarian.org> |
8 | * @author Barry Kasindorf | 8 | * @author Barry Kasindorf |
9 | * @author Robert Richter <robert.richter@amd.com> | ||
9 | * | 10 | * |
10 | * This is the core of the buffer management. Each | 11 | * This is the core of the buffer management. Each |
11 | * CPU buffer is processed and entered into the | 12 | * CPU buffer is processed and entered into the |
@@ -529,6 +530,7 @@ void sync_buffer(int cpu) | |||
529 | sync_buffer_state state = sb_buffer_start; | 530 | sync_buffer_state state = sb_buffer_start; |
530 | unsigned int i; | 531 | unsigned int i; |
531 | unsigned long available; | 532 | unsigned long available; |
533 | unsigned long flags; | ||
532 | struct op_entry entry; | 534 | struct op_entry entry; |
533 | struct op_sample *sample; | 535 | struct op_sample *sample; |
534 | 536 | ||
@@ -545,38 +547,34 @@ void sync_buffer(int cpu) | |||
545 | break; | 547 | break; |
546 | 548 | ||
547 | if (is_code(sample->eip)) { | 549 | if (is_code(sample->eip)) { |
548 | switch (sample->event) { | 550 | flags = sample->event; |
549 | case 0: | 551 | if (flags & TRACE_BEGIN) { |
550 | case CPU_IS_KERNEL: | 552 | state = sb_bt_start; |
553 | add_trace_begin(); | ||
554 | } | ||
555 | if (flags & KERNEL_CTX_SWITCH) { | ||
551 | /* kernel/userspace switch */ | 556 | /* kernel/userspace switch */ |
552 | in_kernel = sample->event; | 557 | in_kernel = flags & IS_KERNEL; |
553 | if (state == sb_buffer_start) | 558 | if (state == sb_buffer_start) |
554 | state = sb_sample_start; | 559 | state = sb_sample_start; |
555 | add_kernel_ctx_switch(sample->event); | 560 | add_kernel_ctx_switch(flags & IS_KERNEL); |
556 | break; | 561 | } |
557 | case CPU_TRACE_BEGIN: | 562 | if (flags & USER_CTX_SWITCH) { |
558 | state = sb_bt_start; | ||
559 | add_trace_begin(); | ||
560 | break; | ||
561 | #ifdef CONFIG_OPROFILE_IBS | ||
562 | case IBS_FETCH_BEGIN: | ||
563 | add_ibs_begin(cpu, IBS_FETCH_CODE, mm); | ||
564 | break; | ||
565 | case IBS_OP_BEGIN: | ||
566 | add_ibs_begin(cpu, IBS_OP_CODE, mm); | ||
567 | break; | ||
568 | #endif | ||
569 | default: | ||
570 | /* userspace context switch */ | 563 | /* userspace context switch */ |
571 | oldmm = mm; | 564 | oldmm = mm; |
572 | new = (struct task_struct *)sample->event; | 565 | new = (struct task_struct *)sample->data[0]; |
573 | release_mm(oldmm); | 566 | release_mm(oldmm); |
574 | mm = take_tasks_mm(new); | 567 | mm = take_tasks_mm(new); |
575 | if (mm != oldmm) | 568 | if (mm != oldmm) |
576 | cookie = get_exec_dcookie(mm); | 569 | cookie = get_exec_dcookie(mm); |
577 | add_user_ctx_switch(new, cookie); | 570 | add_user_ctx_switch(new, cookie); |
578 | break; | ||
579 | } | 571 | } |
572 | #ifdef CONFIG_OPROFILE_IBS | ||
573 | if (flags & IBS_FETCH_BEGIN) | ||
574 | add_ibs_begin(cpu, IBS_FETCH_CODE, mm); | ||
575 | if (flags & IBS_OP_BEGIN) | ||
576 | add_ibs_begin(cpu, IBS_OP_CODE, mm); | ||
577 | #endif | ||
580 | continue; | 578 | continue; |
581 | } | 579 | } |
582 | 580 | ||