__update_max_tr(tr, tsk, cpu);
 
        arch_spin_unlock(&tr->max_lock);
+
+       /* Any waiters on the old snapshot buffer need to wake up */
+       ring_buffer_wake_waiters(tr->array_buffer.buffer, RING_BUFFER_ALL_CPUS);
 }
 
 /**
 
 static int wait_on_pipe(struct trace_iterator *iter, int full)
 {
+       int ret;
+
        /* Iterators are static, they should be filled or empty */
        if (trace_buffer_iter(iter, iter->cpu_file))
                return 0;
 
-       return ring_buffer_wait(iter->array_buffer->buffer, iter->cpu_file,
-                               full);
+       ret = ring_buffer_wait(iter->array_buffer->buffer, iter->cpu_file, full);
+
+#ifdef CONFIG_TRACER_MAX_TRACE
+       /*
+        * Make sure this is still the snapshot buffer, as if a snapshot were
+        * to happen, this would now be the main buffer.
+        */
+       if (iter->snapshot)
+               iter->array_buffer = &iter->tr->max_buffer;
+#endif
+       return ret;
 }
 
 #ifdef CONFIG_FTRACE_STARTUP_TEST
 
                wait_index = READ_ONCE(iter->wait_index);
 
-               ret = wait_on_pipe(iter, iter->tr->buffer_percent);
+               ret = wait_on_pipe(iter, iter->snapshot ? 0 : iter->tr->buffer_percent);
                if (ret)
                        goto out;