Browse Source

block: add poll_considered statistic

In order to help determine the effectiveness of polling in a running
system it is usful to determine the ratio of how often the poll
function is called vs how often the completion is checked. For this
reason we add a poll_considered variable and add it to the sysfs entry
for io_poll.

Signed-off-by: Stephen Bates <sbates@raithlin.com>
Acked-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@fb.com>
Stephen Bates 9 years ago
parent
commit
6e219353af
3 changed files with 10 additions and 3 deletions
  1. 6 2
      block/blk-core.c
  2. 3 1
      block/blk-mq-sysfs.c
  3. 1 0
      include/linux/blk-mq.h

+ 6 - 2
block/blk-core.c

@@ -3307,19 +3307,23 @@ bool blk_poll(struct request_queue *q, blk_qc_t cookie)
 {
 {
 	struct blk_plug *plug;
 	struct blk_plug *plug;
 	long state;
 	long state;
+	unsigned int queue_num;
+	struct blk_mq_hw_ctx *hctx;
 
 
 	if (!q->mq_ops || !q->mq_ops->poll || !blk_qc_t_valid(cookie) ||
 	if (!q->mq_ops || !q->mq_ops->poll || !blk_qc_t_valid(cookie) ||
 	    !test_bit(QUEUE_FLAG_POLL, &q->queue_flags))
 	    !test_bit(QUEUE_FLAG_POLL, &q->queue_flags))
 		return false;
 		return false;
 
 
+	queue_num = blk_qc_t_to_queue_num(cookie);
+	hctx = q->queue_hw_ctx[queue_num];
+	hctx->poll_considered++;
+
 	plug = current->plug;
 	plug = current->plug;
 	if (plug)
 	if (plug)
 		blk_flush_plug_list(plug, false);
 		blk_flush_plug_list(plug, false);
 
 
 	state = current->state;
 	state = current->state;
 	while (!need_resched()) {
 	while (!need_resched()) {
-		unsigned int queue_num = blk_qc_t_to_queue_num(cookie);
-		struct blk_mq_hw_ctx *hctx = q->queue_hw_ctx[queue_num];
 		int ret;
 		int ret;
 
 
 		hctx->poll_invoked++;
 		hctx->poll_invoked++;

+ 3 - 1
block/blk-mq-sysfs.c

@@ -176,7 +176,9 @@ static ssize_t blk_mq_sysfs_rq_list_show(struct blk_mq_ctx *ctx, char *page)
 
 
 static ssize_t blk_mq_hw_sysfs_poll_show(struct blk_mq_hw_ctx *hctx, char *page)
 static ssize_t blk_mq_hw_sysfs_poll_show(struct blk_mq_hw_ctx *hctx, char *page)
 {
 {
-	return sprintf(page, "invoked=%lu, success=%lu\n", hctx->poll_invoked, hctx->poll_success);
+	return sprintf(page, "considered=%lu, invoked=%lu, success=%lu\n",
+		       hctx->poll_considered, hctx->poll_invoked,
+		       hctx->poll_success);
 }
 }
 
 
 static ssize_t blk_mq_hw_sysfs_queued_show(struct blk_mq_hw_ctx *hctx,
 static ssize_t blk_mq_hw_sysfs_queued_show(struct blk_mq_hw_ctx *hctx,

+ 1 - 0
include/linux/blk-mq.h

@@ -61,6 +61,7 @@ struct blk_mq_hw_ctx {
 	struct blk_mq_cpu_notifier	cpu_notifier;
 	struct blk_mq_cpu_notifier	cpu_notifier;
 	struct kobject		kobj;
 	struct kobject		kobj;
 
 
+	unsigned long		poll_considered;
 	unsigned long		poll_invoked;
 	unsigned long		poll_invoked;
 	unsigned long		poll_success;
 	unsigned long		poll_success;
 };
 };