[dm-devel] [PATCH] dm-stats: refactor dm_stats_precise_timestamps

Mikulas Patocka mpatocka at redhat.com
Wed Feb 16 17:47:50 UTC 2022


Don't pollute struct mapped_device with dm_stats_precise_timestamps; move
it into struct dm_stats.

This patch also removes dm_stats->last_sector and dm_stats->last_rw which
are unused.

Signed-off-by: Mikulas Patocka <mpatocka at redhat.com>

---
 drivers/md/dm-core.h  |    2 --
 drivers/md/dm-stats.c |   28 ++++++++++++++++++++++++----
 drivers/md/dm-stats.h |    9 +++++++--
 drivers/md/dm.c       |    5 +----
 4 files changed, 32 insertions(+), 12 deletions(-)

Index: linux-dm/drivers/md/dm-core.h
===================================================================
--- linux-dm.orig/drivers/md/dm-core.h	2022-02-16 17:49:02.000000000 +0100
+++ linux-dm/drivers/md/dm-core.h	2022-02-16 18:06:28.000000000 +0100
@@ -113,8 +113,6 @@ struct mapped_device {
 	struct blk_mq_tag_set *tag_set;
 	bool init_tio_pdu:1;
 
-	bool dm_stats_precise_timestamps:1;
-
 	struct srcu_struct io_barrier;
 
 #ifdef CONFIG_BLK_DEV_ZONED
Index: linux-dm/drivers/md/dm-stats.c
===================================================================
--- linux-dm.orig/drivers/md/dm-stats.c	2022-02-16 17:49:02.000000000 +0100
+++ linux-dm/drivers/md/dm-stats.c	2022-02-16 18:41:57.000000000 +0100
@@ -195,6 +195,7 @@ void dm_stats_init(struct dm_stats *stat
 
 	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);
@@ -231,6 +232,21 @@ void dm_stats_cleanup(struct dm_stats *s
 	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,
@@ -376,6 +392,9 @@ static int dm_stats_create(struct dm_sta
 	}
 	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);
@@ -418,6 +437,9 @@ static int dm_stats_delete(struct dm_sta
 	}
 
 	list_del_rcu(&s->list_entry);
+
+	dm_stats_recalc_precise_timestamps(stats);
+
 	mutex_unlock(&stats->mutex);
 
 	/*
@@ -1006,11 +1028,9 @@ static int message_stats_create(struct m
 			a = dm_shift_arg(&as);
 			if (!a)
 				goto ret_einval;
-			if (!strcasecmp(a, "precise_timestamps")) {
+			if (!strcasecmp(a, "precise_timestamps"))
 				stat_flags |= STAT_PRECISE_TIMESTAMPS;
-				md->dm_stats_precise_timestamps = true;
-				// FIXME: disable md->dm_stats_precise_timestamps when no longer needed
-			} else if (!strncasecmp(a, "histogram:", 10)) {
+			else if (!strncasecmp(a, "histogram:", 10)) {
 				if (n_histogram_entries)
 					goto ret_einval;
 				if ((r = parse_histogram(a + 10, &n_histogram_entries, &histogram_boundaries)))
Index: linux-dm/drivers/md/dm-stats.h
===================================================================
--- linux-dm.orig/drivers/md/dm-stats.h	2022-02-16 17:49:02.000000000 +0100
+++ linux-dm/drivers/md/dm-stats.h	2022-02-16 18:41:19.000000000 +0100
@@ -13,8 +13,7 @@ struct dm_stats {
 	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 {
@@ -40,4 +39,10 @@ static inline bool dm_stats_used(struct
 	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
Index: linux-dm/drivers/md/dm.c
===================================================================
--- linux-dm.orig/drivers/md/dm.c	2022-02-16 17:49:02.000000000 +0100
+++ linux-dm/drivers/md/dm.c	2022-02-16 18:34:29.000000000 +0100
@@ -567,9 +567,7 @@ static struct dm_io *alloc_io(struct map
 	io->start_io_acct = false;
 	io->was_accounted = 0;
 
-	if (unlikely(md->dm_stats_precise_timestamps &&
-		     dm_stats_used(&md->stats)))
-		io->stats_aux.duration_ns = ktime_to_ns(ktime_get());
+	dm_stats_record_start(&md->stats, &io->stats_aux);
 
 	return io;
 }
@@ -1695,7 +1693,6 @@ static struct mapped_device *alloc_dev(i
 
 	md->numa_node_id = numa_node_id;
 	md->init_tio_pdu = false;
-	md->dm_stats_precise_timestamps = false;
 	md->type = DM_TYPE_NONE;
 	mutex_init(&md->suspend_lock);
 	mutex_init(&md->type_lock);




More information about the dm-devel mailing list