Message ID | 1497498312-17704-3-git-send-email-axboe@kernel.dk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jun 14, 2017 at 09:45:03PM -0600, Jens Axboe wrote: > Useful to verify that things are working the way they should. > Reading the file will return number of kb written to each > stream. 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->stream_writes[] if they handle a stream. What's blk-mq specific about this? Seems like this either should be generic block or nvme specific, but probably not blk-mq. And of course the name should change with the rest of the names now.
On 06/15/2017 02:16 AM, Christoph Hellwig wrote: > On Wed, Jun 14, 2017 at 09:45:03PM -0600, Jens Axboe wrote: >> Useful to verify that things are working the way they should. >> Reading the file will return number of kb written to each >> stream. 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->stream_writes[] if they handle a stream. > > What's blk-mq specific about this? Seems like this either should > be generic block or nvme specific, but probably not blk-mq. And > of course the name should change with the rest of the names now. There is nothing blk-mq specific about it, but it's a handy place to stick some debug data, as we don't have debugfs support for non blk-mq. I'm fine with even dumping this, but it's useful for debugging that things are being passed all the way through correctly for now.
diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c index 803aed4d7221..0a37c848961d 100644 --- a/block/blk-mq-debugfs.c +++ b/block/blk-mq-debugfs.c @@ -133,6 +133,29 @@ static void print_stat(struct seq_file *m, struct blk_rq_stat *stat) } } +static int queue_streams_show(void *data, struct seq_file *m) +{ + struct request_queue *q = data; + int i; + + for (i = 0; i < BLK_MAX_STREAM; i++) + seq_printf(m, "stream%d: %llu\n", i, q->stream_writes[i]); + + return 0; +} + +static ssize_t queue_streams_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_STREAM; i++) + q->stream_writes[i] = 0; + + return count; +} + static int queue_poll_stat_show(void *data, struct seq_file *m) { struct request_queue *q = data; @@ -656,6 +679,7 @@ const struct file_operations blk_mq_debugfs_fops = { static const struct blk_mq_debugfs_attr blk_mq_debugfs_queue_attrs[] = { {"poll_stat", 0400, queue_poll_stat_show}, {"state", 0600, queue_state_show, queue_state_write}, + {"streams", 0600, queue_streams_show, queue_streams_store}, {}, }; diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index ab92c4ea138b..88719c6f3edf 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -586,6 +586,9 @@ struct request_queue { size_t cmd_size; void *rq_alloc_data; + +#define BLK_MAX_STREAM 5 + u64 stream_writes[BLK_MAX_STREAM]; }; #define QUEUE_FLAG_QUEUED 1 /* uses generic tag queueing */