Merge tag 'for_linus-3.19-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/jwess...
[cascardo/linux.git] / kernel / trace / trace_kdb.c
index 1058f6b..3ccf5c2 100644 (file)
@@ -20,10 +20,12 @@ static void ftrace_dump_buf(int skip_lines, long cpu_file)
 {
        /* use static because iter can be a bit big for the stack */
        static struct trace_iterator iter;
+       static struct ring_buffer_iter *buffer_iter[CONFIG_NR_CPUS];
        unsigned int old_userobj;
        int cnt = 0, cpu;
 
        trace_init_global_iter(&iter);
+       iter.buffer_iter = buffer_iter;
 
        for_each_tracing_cpu(cpu) {
                atomic_inc(&per_cpu_ptr(iter.trace_buffer->data, cpu)->disabled);
@@ -57,19 +59,19 @@ static void ftrace_dump_buf(int skip_lines, long cpu_file)
                ring_buffer_read_start(iter.buffer_iter[cpu_file]);
                tracing_iter_reset(&iter, cpu_file);
        }
-       if (!trace_empty(&iter))
-               trace_find_next_entry_inc(&iter);
-       while (!trace_empty(&iter)) {
+
+       while (trace_find_next_entry_inc(&iter)) {
                if (!cnt)
                        kdb_printf("---------------------------------\n");
                cnt++;
 
-               if (trace_find_next_entry_inc(&iter) != NULL && !skip_lines)
+               if (!skip_lines) {
                        print_trace_line(&iter);
-               if (!skip_lines)
                        trace_printk_seq(&iter.seq);
-               else
+               } else {
                        skip_lines--;
+               }
+
                if (KDB_FLAG(CMD_INTERRUPT))
                        goto out;
        }
@@ -86,9 +88,12 @@ out:
                atomic_dec(&per_cpu_ptr(iter.trace_buffer->data, cpu)->disabled);
        }
 
-       for_each_tracing_cpu(cpu)
-               if (iter.buffer_iter[cpu])
+       for_each_tracing_cpu(cpu) {
+               if (iter.buffer_iter[cpu]) {
                        ring_buffer_read_finish(iter.buffer_iter[cpu]);
+                       iter.buffer_iter[cpu] = NULL;
+               }
+       }
 }
 
 /*