Jelajahi Sumber

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>
Barry Kasindorf 17 tahun lalu
induk
melakukan
9b1f261166
1 mengubah file dengan 7 tambahan dan 1 penghapusan
  1. 7 1
      drivers/oprofile/buffer_sync.c

+ 7 - 1
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)) {