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:
parent
4bd9b9dc97
commit
9b1f261166
1 changed files with 7 additions and 1 deletions
|
@ -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)) {
|
||||
|
|
Loading…
Reference in a new issue