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:
parent
0eadf37afc
commit
6e219353af
|
@ -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++;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue