free_dup_event(oe, event->event);
 }
 
-static int __ordered_events__flush(struct perf_session *s,
+static int __ordered_events__flush(struct ordered_events *oe,
+                                  struct machines *machines,
+                                  struct perf_evlist *evlist,
                                   struct perf_tool *tool)
 {
-       struct ordered_events *oe = &s->ordered_events;
        struct list_head *head = &oe->events;
        struct ordered_event *tmp, *iter;
        struct perf_sample sample;
                if (iter->timestamp > limit)
                        break;
 
-               ret = perf_evlist__parse_sample(s->evlist, iter->event, &sample);
+               ret = perf_evlist__parse_sample(evlist, iter->event, &sample);
                if (ret)
                        pr_err("Can't parse sample, err = %d\n", ret);
                else {
-                       ret = perf_session__deliver_event(s, iter->event, &sample, tool,
-                                                         iter->file_offset);
+                       ret = machines__deliver_event(machines, evlist, iter->event,
+                                                     &sample, tool, iter->file_offset);
                        if (ret)
                                return ret;
                }
        return 0;
 }
 
-int ordered_events__flush(struct perf_session *s, struct perf_tool *tool,
+int ordered_events__flush(struct ordered_events *oe, struct machines *machines,
+                         struct perf_evlist *evlist, struct perf_tool *tool,
                          enum oe_flush how)
 {
-       struct ordered_events *oe = &s->ordered_events;
        static const char * const str[] = {
                "NONE",
                "FINAL",
                   str[how], oe->nr_events);
        pr_oe_time(oe->max_timestamp, "max_timestamp\n");
 
-       err = __ordered_events__flush(s, tool);
+       err = __ordered_events__flush(oe, machines, evlist, tool);
 
        if (!err) {
                if (how == OE_FLUSH__ROUND)
 
                                  union perf_event *event __maybe_unused,
                                  struct perf_session *session)
 {
-       return ordered_events__flush(session, tool, OE_FLUSH__ROUND);
+       struct ordered_events *oe = &session->ordered_events;
+       struct perf_evlist *evlist = session->evlist;
+       struct machines *machines = &session->machines;
+
+       return ordered_events__flush(oe, machines, evlist, tool, OE_FLUSH__ROUND);
 }
 
 int perf_session_queue_event(struct perf_session *s, union perf_event *event,
                             u64 file_offset)
 {
        struct ordered_events *oe = &s->ordered_events;
+       struct perf_evlist *evlist = s->evlist;
+       struct machines *machines = &s->machines;
+
        u64 timestamp = sample->time;
        struct ordered_event *new;
 
 
        new = ordered_events__new(oe, timestamp, event);
        if (!new) {
-               ordered_events__flush(s, tool, OE_FLUSH__HALF);
+               ordered_events__flush(oe, machines, evlist, tool, OE_FLUSH__HALF);
                new = ordered_events__new(oe, timestamp, event);
        }
 
                                            &sample->read.one, machine);
 }
 
-int perf_session__deliver_event(struct perf_session *session,
+int machines__deliver_event(struct machines *machines,
+                               struct perf_evlist *evlist,
                                union perf_event *event,
                                struct perf_sample *sample,
                                struct perf_tool *tool, u64 file_offset)
 {
-       struct perf_evlist *evlist = session->evlist;
        struct perf_evsel *evsel;
        struct machine *machine;
 
 
        evsel = perf_evlist__id2evsel(evlist, sample->id);
 
-       machine = machines__find_for_cpumode(&session->machines, event, sample);
+       machine = machines__find_for_cpumode(machines, event, sample);
 
        switch (event->header.type) {
        case PERF_RECORD_SAMPLE:
                                      struct perf_sample *sample,
                                      struct perf_tool *tool)
 {
-       events_stats__inc(&session->evlist->stats, event->header.type);
+       struct perf_evlist *evlist = session->evlist;
+
+       events_stats__inc(&evlist->stats, event->header.type);
 
        if (event->header.type >= PERF_RECORD_USER_TYPE_START)
                return perf_session__process_user_event(session, event, tool, 0);
 
-       return perf_session__deliver_event(session, event, sample, tool, 0);
+       return machines__deliver_event(&session->machines, evlist, event, sample, tool, 0);
 }
 
 static void event_swap(union perf_event *event, bool sample_id_all)
                        return ret;
        }
 
-       return perf_session__deliver_event(session, event, &sample, tool,
-                                          file_offset);
+       return machines__deliver_event(&session->machines, evlist, event,
+                                      &sample, tool, file_offset);
 }
 
 void perf_event_header__bswap(struct perf_event_header *hdr)
 static int __perf_session__process_pipe_events(struct perf_session *session,
                                               struct perf_tool *tool)
 {
+       struct ordered_events *oe = &session->ordered_events;
+       struct perf_evlist *evlist = session->evlist;
+       struct machines *machines = &session->machines;
        int fd = perf_data_file__fd(session->file);
        union perf_event *event;
        uint32_t size, cur_size = 0;
                goto more;
 done:
        /* do the final flush for ordered samples */
-       err = ordered_events__flush(session, tool, OE_FLUSH__FINAL);
+       err = ordered_events__flush(oe, machines, evlist, tool, OE_FLUSH__FINAL);
 out_err:
        free(buf);
        perf_tool__warn_about_errors(tool, &session->evlist->stats);
                                          u64 data_offset, u64 data_size,
                                          u64 file_size, struct perf_tool *tool)
 {
+       struct ordered_events *oe = &session->ordered_events;
+       struct perf_evlist *evlist = session->evlist;
+       struct machines *machines = &session->machines;
        int fd = perf_data_file__fd(session->file);
        u64 head, page_offset, file_offset, file_pos, size;
        int err, mmap_prot, mmap_flags, map_idx = 0;
 
 out:
        /* do the final flush for ordered samples */
-       err = ordered_events__flush(session, tool, OE_FLUSH__FINAL);
+       err = ordered_events__flush(oe, machines, evlist, tool, OE_FLUSH__FINAL);
 out_err:
        ui_progress__finish();
        perf_tool__warn_about_errors(tool, &session->evlist->stats);