diff options
author | Robert Richter <robert.richter@amd.com> | 2008-11-28 00:33:37 +0300 |
---|---|---|
committer | Robert Richter <robert.richter@amd.com> | 2008-12-10 16:20:15 +0300 |
commit | bf589e32960181fa8cbca7bfdd92265e49dc2dfa (patch) | |
tree | a5690c62071771e2e325cb748d83fb1cc5565daa /drivers/oprofile/cpu_buffer.h | |
parent | 229234ae4a5ed9376b2e0524da04b0e5edadbf76 (diff) | |
download | linux-bf589e32960181fa8cbca7bfdd92265e49dc2dfa.tar.xz |
oprofile: adding cpu_buffer_entries()
This is in preparation for changes in the cpu buffer implementation.
Signed-off-by: Robert Richter <robert.richter@amd.com>
Diffstat (limited to 'drivers/oprofile/cpu_buffer.h')
-rw-r--r-- | drivers/oprofile/cpu_buffer.h | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/oprofile/cpu_buffer.h b/drivers/oprofile/cpu_buffer.h index e6089768ae66..6055b5678394 100644 --- a/drivers/oprofile/cpu_buffer.h +++ b/drivers/oprofile/cpu_buffer.h @@ -81,6 +81,33 @@ struct op_sample *cpu_buffer_read_entry(struct oprofile_cpu_buffer *cpu_buf) return &cpu_buf->buffer[cpu_buf->tail_pos]; } +/* "acquire" as many cpu buffer slots as we can */ +static inline +unsigned long cpu_buffer_entries(struct oprofile_cpu_buffer *b) +{ + unsigned long head = b->head_pos; + unsigned long tail = b->tail_pos; + + /* + * Subtle. This resets the persistent last_task + * and in_kernel values used for switching notes. + * BUT, there is a small window between reading + * head_pos, and this call, that means samples + * can appear at the new head position, but not + * be prefixed with the notes for switching + * kernel mode or a task switch. This small hole + * can lead to mis-attribution or samples where + * we don't know if it's in the kernel or not, + * at the start of an event buffer. + */ + cpu_buffer_reset(b); + + if (head >= tail) + return head - tail; + + return head + (b->buffer_size - tail); +} + /* transient events for the CPU buffer -> event buffer */ #define CPU_IS_KERNEL 1 #define CPU_TRACE_BEGIN 2 |