diff options
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) | |||
81 | return &cpu_buf->buffer[cpu_buf->tail_pos]; | 81 | return &cpu_buf->buffer[cpu_buf->tail_pos]; |
82 | } | 82 | } |
83 | 83 | ||
84 | /* "acquire" as many cpu buffer slots as we can */ | ||
85 | static inline | ||
86 | unsigned long cpu_buffer_entries(struct oprofile_cpu_buffer *b) | ||
87 | { | ||
88 | unsigned long head = b->head_pos; | ||
89 | unsigned long tail = b->tail_pos; | ||
90 | |||
91 | /* | ||
92 | * Subtle. This resets the persistent last_task | ||
93 | * and in_kernel values used for switching notes. | ||
94 | * BUT, there is a small window between reading | ||
95 | * head_pos, and this call, that means samples | ||
96 | * can appear at the new head position, but not | ||
97 | * be prefixed with the notes for switching | ||
98 | * kernel mode or a task switch. This small hole | ||
99 | * can lead to mis-attribution or samples where | ||
100 | * we don't know if it's in the kernel or not, | ||
101 | * at the start of an event buffer. | ||
102 | */ | ||
103 | cpu_buffer_reset(b); | ||
104 | |||
105 | if (head >= tail) | ||
106 | return head - tail; | ||
107 | |||
108 | return head + (b->buffer_size - tail); | ||
109 | } | ||
110 | |||
84 | /* transient events for the CPU buffer -> event buffer */ | 111 | /* transient events for the CPU buffer -> event buffer */ |
85 | #define CPU_IS_KERNEL 1 | 112 | #define CPU_IS_KERNEL 1 |
86 | #define CPU_TRACE_BEGIN 2 | 113 | #define CPU_TRACE_BEGIN 2 |