atoms->nb_atoms++;
 }
 
+static void free_work_atoms(struct work_atoms *atoms)
+{
+       struct work_atom *atom, *tmp;
+
+       if (atoms == NULL)
+               return;
+
+       list_for_each_entry_safe(atom, tmp, &atoms->work_list, list) {
+               list_del(&atom->list);
+               free(atom);
+       }
+       thread__zput(atoms->thread);
+       free(atoms);
+}
+
 static int latency_switch_event(struct perf_sched *sched,
                                struct evsel *evsel,
                                struct perf_sample *sample,
                        this->total_runtime += data->total_runtime;
                        this->nb_atoms += data->nb_atoms;
                        this->total_lat += data->total_lat;
-                       list_splice(&data->work_list, &this->work_list);
+                       list_splice_init(&data->work_list, &this->work_list);
                        if (this->max_lat < data->max_lat) {
                                this->max_lat = data->max_lat;
                                this->max_lat_start = data->max_lat_start;
                                this->max_lat_end = data->max_lat_end;
                        }
-                       zfree(&data);
+                       free_work_atoms(data);
                        return;
                }
        }
                work_list = rb_entry(next, struct work_atoms, node);
                output_lat_thread(sched, work_list);
                next = rb_next(next);
-               thread__zput(work_list->thread);
        }
 
        printf(" -----------------------------------------------------------------------------------------------------------------\n");
 
        rc = 0;
 
+       while ((next = rb_first_cached(&sched->sorted_atom_root))) {
+               struct work_atoms *data;
+
+               data = rb_entry(next, struct work_atoms, node);
+               rb_erase_cached(next, &sched->sorted_atom_root);
+               free_work_atoms(data);
+       }
 out_free_cpus_switch_event:
        free_cpus_switch_event(sched);
        return rc;