diff options
author | Barry Kasindorf <barry.kasindorf@amd.com> | 2008-07-14 18:10:36 -0400 |
---|---|---|
committer | Robert Richter <robert.richter@amd.com> | 2008-10-20 07:44:21 -0400 |
commit | 9b1f261166f56d4b2c33fdf5aad64edd5e30b46f (patch) | |
tree | 748011b45dc178a218df9146921ca027fa99b2cc /drivers/oprofile/buffer_sync.c | |
parent | 4bd9b9dc97e344670e9e5762399a07dcd5f15311 (diff) |
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>
Diffstat (limited to 'drivers/oprofile/buffer_sync.c')
-rw-r--r-- | drivers/oprofile/buffer_sync.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c index 33bfa60b0c66..6c0c92a745dd 100644 --- a/drivers/oprofile/buffer_sync.c +++ b/drivers/oprofile/buffer_sync.c | |||
@@ -564,9 +564,11 @@ void sync_buffer(int cpu) | |||
564 | struct task_struct *new; | 564 | struct task_struct *new; |
565 | unsigned long cookie = 0; | 565 | unsigned long cookie = 0; |
566 | int in_kernel = 1; | 566 | int in_kernel = 1; |
567 | unsigned int i; | ||
568 | sync_buffer_state state = sb_buffer_start; | 567 | sync_buffer_state state = sb_buffer_start; |
568 | #ifndef CONFIG_OPROFILE_IBS | ||
569 | unsigned int i; | ||
569 | unsigned long available; | 570 | unsigned long available; |
571 | #endif | ||
570 | 572 | ||
571 | mutex_lock(&buffer_mutex); | 573 | mutex_lock(&buffer_mutex); |
572 | 574 | ||
@@ -574,9 +576,13 @@ void sync_buffer(int cpu) | |||
574 | 576 | ||
575 | /* Remember, only we can modify tail_pos */ | 577 | /* Remember, only we can modify tail_pos */ |
576 | 578 | ||
579 | #ifndef CONFIG_OPROFILE_IBS | ||
577 | available = get_slots(cpu_buf); | 580 | available = get_slots(cpu_buf); |
578 | 581 | ||
579 | for (i = 0; i < available; ++i) { | 582 | for (i = 0; i < available; ++i) { |
583 | #else | ||
584 | while (get_slots(cpu_buf)) { | ||
585 | #endif | ||
580 | struct op_sample *s = &cpu_buf->buffer[cpu_buf->tail_pos]; | 586 | struct op_sample *s = &cpu_buf->buffer[cpu_buf->tail_pos]; |
581 | 587 | ||
582 | if (is_code(s->eip)) { | 588 | if (is_code(s->eip)) { |