summaryrefslogtreecommitdiffstats
path: root/drivers/oprofile/buffer_sync.c
diff options
context:
space:
mode:
authorRobert Richter <robert.richter@amd.com>2008-12-30 04:10:46 +0100
committerRobert Richter <robert.richter@amd.com>2009-01-07 22:40:02 +0100
commit2d87b14cf8d0b07720de26d90789d02124141616 (patch)
tree418285e8cd7127c6207ac9a3e1acf8f0f3c2282f /drivers/oprofile/buffer_sync.c
parent2cc28b9f261dd28d69767a34682ce55a27d928ed (diff)
downloadlinux-2d87b14cf8d0b07720de26d90789d02124141616.tar.gz
linux-2d87b14cf8d0b07720de26d90789d02124141616.tar.bz2
linux-2d87b14cf8d0b07720de26d90789d02124141616.zip
oprofile: modify op_cpu_buffer_read_entry()
This implements the support of samples with attached data. Signed-off-by: Robert Richter <robert.richter@amd.com>
Diffstat (limited to 'drivers/oprofile/buffer_sync.c')
-rw-r--r--drivers/oprofile/buffer_sync.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c
index 21fd249b6e0b..908202afbae9 100644
--- a/drivers/oprofile/buffer_sync.c
+++ b/drivers/oprofile/buffer_sync.c
@@ -329,9 +329,10 @@ static void add_ibs_begin(int cpu, int code, struct mm_struct *mm)
int i, count;
unsigned long cookie = 0;
off_t offset;
+ struct op_entry entry;
struct op_sample *sample;
- sample = op_cpu_buffer_read_entry(cpu);
+ sample = op_cpu_buffer_read_entry(&entry, cpu);
if (!sample)
return;
pc = sample->eip;
@@ -370,7 +371,7 @@ static void add_ibs_begin(int cpu, int code, struct mm_struct *mm)
count = IBS_OP_CODE_SIZE; /*IBS OP is 5 int64s*/
for (i = 0; i < count; i++) {
- sample = op_cpu_buffer_read_entry(cpu);
+ sample = op_cpu_buffer_read_entry(&entry, cpu);
if (!sample)
return;
add_event_entry(sample->eip);
@@ -528,6 +529,8 @@ void sync_buffer(int cpu)
sync_buffer_state state = sb_buffer_start;
unsigned int i;
unsigned long available;
+ struct op_entry entry;
+ struct op_sample *sample;
mutex_lock(&buffer_mutex);
@@ -537,19 +540,19 @@ void sync_buffer(int cpu)
available = op_cpu_buffer_entries(cpu);
for (i = 0; i < available; ++i) {
- struct op_sample *s = op_cpu_buffer_read_entry(cpu);
- if (!s)
+ sample = op_cpu_buffer_read_entry(&entry, cpu);
+ if (!sample)
break;
- if (is_code(s->eip)) {
- switch (s->event) {
+ if (is_code(sample->eip)) {
+ switch (sample->event) {
case 0:
case CPU_IS_KERNEL:
/* kernel/userspace switch */
- in_kernel = s->event;
+ in_kernel = sample->event;
if (state == sb_buffer_start)
state = sb_sample_start;
- add_kernel_ctx_switch(s->event);
+ add_kernel_ctx_switch(sample->event);
break;
case CPU_TRACE_BEGIN:
state = sb_bt_start;
@@ -566,7 +569,7 @@ void sync_buffer(int cpu)
default:
/* userspace context switch */
oldmm = mm;
- new = (struct task_struct *)s->event;
+ new = (struct task_struct *)sample->event;
release_mm(oldmm);
mm = take_tasks_mm(new);
if (mm != oldmm)
@@ -581,7 +584,7 @@ void sync_buffer(int cpu)
/* ignore sample */
continue;
- if (add_sample(mm, s, in_kernel))
+ if (add_sample(mm, sample, in_kernel))
continue;
/* ignore backtraces if failed to add a sample */