From: Barry Kasindorf Date: Mon, 14 Jul 2008 22:10:36 +0000 (+0200) Subject: OProfile: Fix buffer synchronization for IBS X-Git-Tag: v2.6.28-rc1~35^2~1 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=9b1f261166f56d4b2c33fdf5aad64edd5e30b46f;p=linux-2.6-omap-h63xx.git 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 Signed-off-by: Robert Richter --- diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index 33bfa60b0c6..6c0c92a745d 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c @@ -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)) {