Commit 9b1f2611 authored by Barry Kasindorf's avatar Barry Kasindorf Committed by Robert Richter

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: default avatarBarry Kasindorf <barry.kasindorf@amd.com>
Signed-off-by: default avatarRobert Richter <robert.richter@amd.com>
parent 4bd9b9dc
...@@ -564,9 +564,11 @@ void sync_buffer(int cpu) ...@@ -564,9 +564,11 @@ void sync_buffer(int cpu)
struct task_struct *new; struct task_struct *new;
unsigned long cookie = 0; unsigned long cookie = 0;
int in_kernel = 1; int in_kernel = 1;
unsigned int i;
sync_buffer_state state = sb_buffer_start; sync_buffer_state state = sb_buffer_start;
#ifndef CONFIG_OPROFILE_IBS
unsigned int i;
unsigned long available; unsigned long available;
#endif
mutex_lock(&buffer_mutex); mutex_lock(&buffer_mutex);
...@@ -574,9 +576,13 @@ void sync_buffer(int cpu) ...@@ -574,9 +576,13 @@ void sync_buffer(int cpu)
/* Remember, only we can modify tail_pos */ /* Remember, only we can modify tail_pos */
#ifndef CONFIG_OPROFILE_IBS
available = get_slots(cpu_buf); available = get_slots(cpu_buf);
for (i = 0; i < available; ++i) { for (i = 0; i < available; ++i) {
#else
while (get_slots(cpu_buf)) {
#endif
struct op_sample *s = &cpu_buf->buffer[cpu_buf->tail_pos]; struct op_sample *s = &cpu_buf->buffer[cpu_buf->tail_pos];
if (is_code(s->eip)) { if (is_code(s->eip)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment