OProfile: Fix buffer synchronization for IBS

The patch is needed since there is some IBS code in add_ibs_begin()
that handles more than one sample per iteration. This requires calling
get_slots() during each loop.

This fixes the current problem, but a proper solution that reworks the
cpu buffer synchronization is needed here in the future.

Signed-off-by: Barry Kasindorf <barry.kasindorf@amd.com>
Signed-off-by: Robert Richter <robert.richter@amd.com>
This commit is contained in:
Barry Kasindorf 2008-07-15 00:10:36 +02:00 committed by Robert Richter
parent 4bd9b9dc97
commit 9b1f261166

View file

@ -564,9 +564,11 @@ void sync_buffer(int cpu)
struct task_struct *new;
unsigned long cookie = 0;
int in_kernel = 1;
unsigned int i;
sync_buffer_state state = sb_buffer_start;
#ifndef CONFIG_OPROFILE_IBS
unsigned int i;
unsigned long available;
#endif
mutex_lock(&buffer_mutex);
@ -574,9 +576,13 @@ void sync_buffer(int cpu)
/* Remember, only we can modify tail_pos */
#ifndef CONFIG_OPROFILE_IBS
available = get_slots(cpu_buf);
for (i = 0; i < available; ++i) {
#else
while (get_slots(cpu_buf)) {
#endif
struct op_sample *s = &cpu_buf->buffer[cpu_buf->tail_pos];
if (is_code(s->eip)) {