mutex_init(&stats->mutex);
        INIT_LIST_HEAD(&stats->list);
+       stats->precise_timestamps = false;
        stats->last = alloc_percpu(struct dm_stats_last_position);
        for_each_possible_cpu(cpu) {
                last = per_cpu_ptr(stats->last, cpu);
        mutex_destroy(&stats->mutex);
 }
 
+static void dm_stats_recalc_precise_timestamps(struct dm_stats *stats)
+{
+       struct list_head *l;
+       struct dm_stat *tmp_s;
+       bool precise_timestamps = false;
+
+       list_for_each(l, &stats->list) {
+               tmp_s = container_of(l, struct dm_stat, list_entry);
+               if (tmp_s->stat_flags & STAT_PRECISE_TIMESTAMPS) {
+                       precise_timestamps = true;
+                       break;
+               }
+       }
+       stats->precise_timestamps = precise_timestamps;
+}
+
 static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end,
                           sector_t step, unsigned stat_flags,
                           unsigned n_histogram_entries,
        }
        ret_id = s->id;
        list_add_tail_rcu(&s->list_entry, l);
+
+       dm_stats_recalc_precise_timestamps(stats);
+
        mutex_unlock(&stats->mutex);
 
        resume_callback(md);
        }
 
        list_del_rcu(&s->list_entry);
+
+       dm_stats_recalc_precise_timestamps(stats);
+
        mutex_unlock(&stats->mutex);
 
        /*
        got_precise_time = false;
        list_for_each_entry_rcu(s, &stats->list, list_entry) {
                if (s->stat_flags & STAT_PRECISE_TIMESTAMPS && !got_precise_time) {
-                       if (!end)
-                               stats_aux->duration_ns = ktime_to_ns(ktime_get());
-                       else
+                       /* start (!end) duration_ns is set by DM core's alloc_io() */
+                       if (end)
                                stats_aux->duration_ns = ktime_to_ns(ktime_get()) - stats_aux->duration_ns;
                        got_precise_time = true;
                }
 
        struct mutex mutex;
        struct list_head list;  /* list of struct dm_stat */
        struct dm_stats_last_position __percpu *last;
-       sector_t last_sector;
-       unsigned last_rw;
+       bool precise_timestamps;
 };
 
 struct dm_stats_aux {
        return !list_empty(&st->list);
 }
 
+static inline void dm_stats_record_start(struct dm_stats *stats, struct dm_stats_aux *aux)
+{
+       if (unlikely(stats->precise_timestamps))
+               aux->duration_ns = ktime_to_ns(ktime_get());
+}
+
 #endif