aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/oprofile/buffer_sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/oprofile/buffer_sync.c')
-rw-r--r--drivers/oprofile/buffer_sync.c42
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