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>
This commit is contained in:
Stephen Bates 2016-09-13 12:23:15 -06:00 committed by Jens Axboe
parent 0eadf37afc
commit 6e219353af
3 changed files with 10 additions and 3 deletions

View File

@ -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++;

View 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) 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,

View File

@ -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;
}; };