return -1;
                }
 
-               err = perf_session_queue_event(kvm->session, event, &sample, 0);
+               err = perf_session_queue_event(kvm->session, event, &kvm->tool, &sample, 0);
                /*
                 * FIXME: Here we can't consume the event, as perf_session_queue_event will
                 *        point to it, and it'll get possibly overwritten by the kernel.
 
 #include "util.h"
 #include "cpumap.h"
 #include "perf_regs.h"
+#include "asm/bug.h"
 
 static int perf_session__open(struct perf_session *session)
 {
 enum oe_flush {
        OE_FLUSH__FINAL,
        OE_FLUSH__ROUND,
+       OE_FLUSH__HALF,
 };
 
 static void perf_session_free_sample_buffers(struct perf_session *session)
                oe->next_flush = ULLONG_MAX;
                break;
 
+       case OE_FLUSH__HALF:
+       {
+               struct ordered_event *first, *last;
+               struct list_head *head = &oe->events;
+
+               first = list_entry(head->next, struct ordered_event, list);
+               last = oe->last;
+
+               /* Warn if we are called before any event got allocated. */
+               if (WARN_ONCE(!last || list_empty(head), "empty queue"))
+                       return 0;
+
+               oe->next_flush  = first->timestamp;
+               oe->next_flush += (last->timestamp - first->timestamp) / 2;
+               break;
+       }
+
        case OE_FLUSH__ROUND:
        default:
                break;
 }
 
 int perf_session_queue_event(struct perf_session *s, union perf_event *event,
-                                   struct perf_sample *sample, u64 file_offset)
+                            struct perf_tool *tool, struct perf_sample *sample,
+                            u64 file_offset)
 {
        struct ordered_events *oe = &s->ordered_events;
        u64 timestamp = sample->time;
        }
 
        new = ordered_events__new(oe, timestamp);
+       if (!new) {
+               ordered_events__flush(s, tool, OE_FLUSH__HALF);
+               new = ordered_events__new(oe, timestamp);
+       }
+
        if (!new)
                return -ENOMEM;
 
                return ret;
 
        if (tool->ordered_events) {
-               ret = perf_session_queue_event(session, event, &sample,
+               ret = perf_session_queue_event(session, event, tool, &sample,
                                               file_offset);
                if (ret != -ETIME)
                        return ret;
 
                                 struct perf_tool *tool);
 
 int perf_session_queue_event(struct perf_session *s, union perf_event *event,
-                            struct perf_sample *sample, u64 file_offset);
+                            struct perf_tool *tool, struct perf_sample *sample,
+                            u64 file_offset);
 
 void perf_tool__fill_defaults(struct perf_tool *tool);