block: add poll_considered statistic
authorStephen Bates <sbates@raithlin.com>
Tue, 13 Sep 2016 18:23:15 +0000 (12:23 -0600)
committerJens Axboe <axboe@fb.com>
Wed, 14 Sep 2016 14:41:21 +0000 (08:41 -0600)
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>
block/blk-core.c
block/blk-mq-sysfs.c
include/linux/blk-mq.h

index 34ff8088eebee193cd2e02b3bd0b63621cdeaacc..14d7c0740dc07aa82e6d85b721daa5a7045e14f7 100644 (file)
@@ -3307,19 +3307,23 @@ bool blk_poll(struct request_queue *q, blk_qc_t cookie)
 {
        struct blk_plug *plug;
        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) ||
            !test_bit(QUEUE_FLAG_POLL, &q->queue_flags))
                return false;
 
+       queue_num = blk_qc_t_to_queue_num(cookie);
+       hctx = q->queue_hw_ctx[queue_num];
+       hctx->poll_considered++;
+
        plug = current->plug;
        if (plug)
                blk_flush_plug_list(plug, false);
 
        state = current->state;
        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;
 
                hctx->poll_invoked++;
index fe822aa5b8e4a16fdb074d351959961d94de48e5..ea8c3f58afbdc69fb65430a27bdbd340f1902383 100644 (file)
@@ -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)
 {
-       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,
index e1544f0f8c214b1608db53ce19e2c3f8c33cebfb..7710f795d7c28432b924979a75aa080bf4cbbf5c 100644 (file)
@@ -61,6 +61,7 @@ struct blk_mq_hw_ctx {
        struct blk_mq_cpu_notifier      cpu_notifier;
        struct kobject          kobj;
 
+       unsigned long           poll_considered;
        unsigned long           poll_invoked;
        unsigned long           poll_success;
 };