Message ID | 1498491480-16306-4-git-send-email-axboe@kernel.dk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Jun 26, 2017 at 09:37:54AM -0600, Jens Axboe wrote: > Useful to verify that things are working the way they should. > Reading the file will return number of kb written with each > write hint. Writing the file will reset the statistics. No care > is taken to ensure that we don't race on updates. > > Drivers will write to q->write_hints[] if they handle a given > write hint. How about moving the accounting itself to blk-mq as well? Just noticed that it's completely generic while looking over the nvme patch.
On 06/27/2017 09:17 AM, Christoph Hellwig wrote: > On Mon, Jun 26, 2017 at 09:37:54AM -0600, Jens Axboe wrote: >> Useful to verify that things are working the way they should. >> Reading the file will return number of kb written with each >> write hint. Writing the file will reset the statistics. No care >> is taken to ensure that we don't race on updates. >> >> Drivers will write to q->write_hints[] if they handle a given >> write hint. > > How about moving the accounting itself to blk-mq as well? Just noticed > that it's completely generic while looking over the nvme patch. I didn't want to do it, unless the driver is using streams.
diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c index 9edebbdce0bd..9ebc2945f991 100644 --- a/block/blk-mq-debugfs.c +++ b/block/blk-mq-debugfs.c @@ -135,6 +135,29 @@ static void print_stat(struct seq_file *m, struct blk_rq_stat *stat) } } +static int queue_write_hint_show(void *data, struct seq_file *m) +{ + struct request_queue *q = data; + int i; + + for (i = 0; i < BLK_MAX_WRITE_HINTS; i++) + seq_printf(m, "hint%d: %llu\n", i, q->write_hints[i]); + + return 0; +} + +static ssize_t queue_write_hint_store(void *data, const char __user *buf, + size_t count, loff_t *ppos) +{ + struct request_queue *q = data; + int i; + + for (i = 0; i < BLK_MAX_WRITE_HINTS; i++) + q->write_hints[i] = 0; + + return count; +} + static int queue_poll_stat_show(void *data, struct seq_file *m) { struct request_queue *q = data; @@ -730,6 +753,7 @@ static const struct blk_mq_debugfs_attr blk_mq_debugfs_queue_attrs[] = { {"poll_stat", 0400, queue_poll_stat_show}, {"requeue_list", 0400, .seq_ops = &queue_requeue_list_seq_ops}, {"state", 0600, queue_state_show, queue_state_write}, + {"write_hints", 0600, queue_write_hint_show, queue_write_hint_store}, {}, }; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index bf2157141d53..596de77b9a0a 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -594,6 +594,9 @@ struct request_queue { void *rq_alloc_data; struct work_struct release_work; + +#define BLK_MAX_WRITE_HINTS 5 + u64 write_hints[BLK_MAX_WRITE_HINTS]; }; #define QUEUE_FLAG_QUEUED 1 /* uses generic tag queueing */