Coly Li bebc68
From f793dfd3f39a3dc50468b06498606b3a906f42f1 Mon Sep 17 00:00:00 2001
Coly Li bebc68
From: Jens Axboe <axboe@kernel.dk>
Coly Li bebc68
Date: Mon, 26 Jun 2017 08:15:27 -0600
Coly Li bebc68
Subject: [PATCH] blk-mq: expose write hints through debugfs
Coly Li bebc68
Git-commit: f793dfd3f39a3dc50468b06498606b3a906f42f1
Coly Li bebc68
Patch-mainline: v4.13-rc1
Coly Li bebc68
References: fate#322738,fate#322919,fate#322950,fate#323773
Coly Li bebc68
Coly Li bebc68
Useful to verify that things are working the way they should.
Coly Li bebc68
Reading the file will return number of kb written with each
Coly Li bebc68
write hint. Writing the file will reset the statistics. No care
Coly Li bebc68
is taken to ensure that we don't race on updates.
Coly Li bebc68
Coly Li bebc68
Drivers will write to q->write_hints[] if they handle a given
Coly Li bebc68
write hint.
Coly Li bebc68
Coly Li bebc68
Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Coly Li bebc68
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Coly Li bebc68
Reviewed-by: Christoph Hellwig <hch@lst.de>
Coly Li bebc68
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Coly Li bebc68
Signed-off-by: Coly Li <colyli@suse.de>
Coly Li bebc68
Coly Li bebc68
---
Coly Li bebc68
 block/blk-mq-debugfs.c | 24 ++++++++++++++++++++++++
Coly Li bebc68
 include/linux/blkdev.h |  3 +++
Coly Li bebc68
 2 files changed, 27 insertions(+)
Coly Li bebc68
Coly Li bebc68
diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c
Coly Li bebc68
index 9edebbdce0bd..9ebc2945f991 100644
Coly Li bebc68
--- a/block/blk-mq-debugfs.c
Coly Li bebc68
+++ b/block/blk-mq-debugfs.c
Coly Li bebc68
@@ -135,6 +135,29 @@ static void print_stat(struct seq_file *m, struct blk_rq_stat *stat)
Coly Li bebc68
 	}
Coly Li bebc68
 }
Coly Li bebc68
 
Coly Li bebc68
+static int queue_write_hint_show(void *data, struct seq_file *m)
Coly Li bebc68
+{
Coly Li bebc68
+	struct request_queue *q = data;
Coly Li bebc68
+	int i;
Coly Li bebc68
+
Coly Li bebc68
+	for (i = 0; i < BLK_MAX_WRITE_HINTS; i++)
Coly Li bebc68
+		seq_printf(m, "hint%d: %llu\n", i, q->write_hints[i]);
Coly Li bebc68
+
Coly Li bebc68
+	return 0;
Coly Li bebc68
+}
Coly Li bebc68
+
Coly Li bebc68
+static ssize_t queue_write_hint_store(void *data, const char __user *buf,
Coly Li bebc68
+				      size_t count, loff_t *ppos)
Coly Li bebc68
+{
Coly Li bebc68
+	struct request_queue *q = data;
Coly Li bebc68
+	int i;
Coly Li bebc68
+
Coly Li bebc68
+	for (i = 0; i < BLK_MAX_WRITE_HINTS; i++)
Coly Li bebc68
+		q->write_hints[i] = 0;
Coly Li bebc68
+
Coly Li bebc68
+	return count;
Coly Li bebc68
+}
Coly Li bebc68
+
Coly Li bebc68
 static int queue_poll_stat_show(void *data, struct seq_file *m)
Coly Li bebc68
 {
Coly Li bebc68
 	struct request_queue *q = data;
Coly Li bebc68
@@ -730,6 +753,7 @@ static const struct blk_mq_debugfs_attr blk_mq_debugfs_queue_attrs[] = {
Coly Li bebc68
 	{"poll_stat", 0400, queue_poll_stat_show},
Coly Li bebc68
 	{"requeue_list", 0400, .seq_ops = &queue_requeue_list_seq_ops},
Coly Li bebc68
 	{"state", 0600, queue_state_show, queue_state_write},
Coly Li bebc68
+	{"write_hints", 0600, queue_write_hint_show, queue_write_hint_store},
Coly Li bebc68
 	{},
Coly Li bebc68
 };
Coly Li bebc68
 
Coly Li bebc68
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
Coly Li bebc68
index 0eebd3bcfd85..e1e289ab66b9 100644
Coly Li bebc68
--- a/include/linux/blkdev.h
Coly Li bebc68
+++ b/include/linux/blkdev.h
Coly Li bebc68
@@ -596,6 +596,9 @@ struct request_queue {
Coly Li bebc68
 	void			*rq_alloc_data;
Coly Li bebc68
 
Coly Li bebc68
 	struct work_struct	release_work;
Coly Li bebc68
+
Coly Li bebc68
+#define BLK_MAX_WRITE_HINTS	5
Coly Li bebc68
+	u64			write_hints[BLK_MAX_WRITE_HINTS];
Coly Li bebc68
 };
Coly Li bebc68
 
Coly Li bebc68
 #define QUEUE_FLAG_QUEUED	1	/* uses generic tag queueing */
Coly Li bebc68
-- 
Coly Li bebc68
2.13.1
Coly Li bebc68