goto out_filtered;
 
        dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid);
+       /*
+        * Have we already created the kernel maps for the host machine?
+        *
+        * This should have happened earlier, when we processed the kernel MMAP
+        * events, but for older perf.data files there was no such thing, so do
+        * it now.
+        */
+       if (cpumode == PERF_RECORD_MISC_KERNEL &&
+           session->host_machine.vmlinux_maps[MAP__FUNCTION] == NULL)
+               machine__create_kernel_maps(&session->host_machine);
 
        thread__find_addr_map(thread, session, cpumode, MAP__FUNCTION,
                              self->ip.pid, self->ip.ip, al);
 
        return default_machine;
 }
 
-/*
- * FIXME: Why repeatedly search for this?
- */
-struct machine *machines__find_host(struct rb_root *self)
-{
-       struct rb_node **p = &self->rb_node;
-       struct rb_node *parent = NULL;
-       struct machine *machine;
-       pid_t pid = HOST_KERNEL_ID;
-
-       while (*p != NULL) {
-               parent = *p;
-               machine = rb_entry(parent, struct machine, rb_node);
-               if (pid < machine->pid)
-                       p = &(*p)->rb_left;
-               else if (pid > machine->pid)
-                       p = &(*p)->rb_right;
-               else
-                       return machine;
-       }
-
-       return NULL;
-}
-
 struct machine *machines__findnew(struct rb_root *self, pid_t pid)
 {
        char path[PATH_MAX];
 
        self->repipe = repipe;
        self->ordered_samples.flush_limit = ULLONG_MAX;
        INIT_LIST_HEAD(&self->ordered_samples.samples_head);
+       machine__init(&self->host_machine, "", HOST_KERNEL_ID);
 
        if (mode == O_RDONLY) {
                if (perf_session__open(self, force) < 0)
 
        return 0;
 }
+
+size_t perf_session__fprintf_dsos(struct perf_session *self, FILE *fp)
+{
+       return __dsos__fprintf(&self->host_machine.kernel_dsos, fp) +
+              __dsos__fprintf(&self->host_machine.user_dsos, fp) +
+              machines__fprintf_dsos(&self->machines, fp);
+}
 
        unsigned long           mmap_window;
        struct rb_root          threads;
        struct thread           *last_match;
+       struct machine          host_machine;
        struct rb_root          machines;
        struct events_stats     events_stats;
        struct rb_root          stats_by_id;
 static inline
 struct machine *perf_session__find_host_machine(struct perf_session *self)
 {
-       return machines__find_host(&self->machines);
+       return &self->host_machine;
 }
 
 static inline
 struct machine *perf_session__find_machine(struct perf_session *self, pid_t pid)
 {
+       if (pid == HOST_KERNEL_ID)
+               return &self->host_machine;
        return machines__find(&self->machines, pid);
 }
 
 static inline
 struct machine *perf_session__findnew_machine(struct perf_session *self, pid_t pid)
 {
+       if (pid == HOST_KERNEL_ID)
+               return &self->host_machine;
        return machines__findnew(&self->machines, pid);
 }
 
 void perf_session__process_machines(struct perf_session *self,
                                    machine__process_t process)
 {
+       process(&self->host_machine, self);
        return machines__process(&self->machines, process, self);
 }
 
-static inline
-size_t perf_session__fprintf_dsos(struct perf_session *self, FILE *fp)
-{
-       return machines__fprintf_dsos(&self->machines, fp);
-}
+size_t perf_session__fprintf_dsos(struct perf_session *self, FILE *fp);
 
 static inline
 size_t perf_session__fprintf_dsos_buildid(struct perf_session *self, FILE *fp,
 
        return dso;
 }
 
-static size_t __dsos__fprintf(struct list_head *head, FILE *fp)
+size_t __dsos__fprintf(struct list_head *head, FILE *fp)
 {
        struct dso *pos;
        size_t ret = 0;
 
 int machine__load_vmlinux_path(struct machine *self, enum map_type type,
                               symbol_filter_t filter);
 
+size_t __dsos__fprintf(struct list_head *head, FILE *fp);
+
 size_t machines__fprintf_dsos(struct rb_root *self, FILE *fp);
 size_t machines__fprintf_dsos_buildid(struct rb_root *self, FILE *fp, bool with_hits);