diff options
author | Divyesh Shah <dpshah@google.com> | 2010-04-09 00:15:10 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2010-04-09 02:36:08 -0400 |
commit | cdc1184cf4a7bd99f5473a91244197accc49146b (patch) | |
tree | ecd572867bfa5a82fa4ed16d7303448c7ea7d24c /block/cfq-iosched.c | |
parent | 812d402648f4fc1ab1091b2172a46fc1b367c724 (diff) |
blkio: Add io_queued and avg_queue_size stats
These stats are useful for getting a feel for the queue depth of the cgroup,
i.e., how filled up its queues are at a given instant and over the existence of
the cgroup. This ability is useful when debugging problems in the wild as it
helps understand the application's IO pattern w/o having to read through the
userspace code (coz its tedious or just not available) or w/o the ability
to run blktrace (since you may not have root access and/or not want to disturb
performance).
Signed-off-by: Divyesh Shah<dpshah@google.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/cfq-iosched.c')
-rw-r--r-- | block/cfq-iosched.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 4eb1906cf6c6..8e0b86a9111a 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1380,7 +1380,12 @@ static void cfq_reposition_rq_rb(struct cfq_queue *cfqq, struct request *rq) | |||
1380 | { | 1380 | { |
1381 | elv_rb_del(&cfqq->sort_list, rq); | 1381 | elv_rb_del(&cfqq->sort_list, rq); |
1382 | cfqq->queued[rq_is_sync(rq)]--; | 1382 | cfqq->queued[rq_is_sync(rq)]--; |
1383 | blkiocg_update_request_remove_stats(&cfqq->cfqg->blkg, rq_data_dir(rq), | ||
1384 | rq_is_sync(rq)); | ||
1383 | cfq_add_rq_rb(rq); | 1385 | cfq_add_rq_rb(rq); |
1386 | blkiocg_update_request_add_stats( | ||
1387 | &cfqq->cfqg->blkg, &cfqq->cfqd->serving_group->blkg, | ||
1388 | rq_data_dir(rq), rq_is_sync(rq)); | ||
1384 | } | 1389 | } |
1385 | 1390 | ||
1386 | static struct request * | 1391 | static struct request * |
@@ -1436,6 +1441,8 @@ static void cfq_remove_request(struct request *rq) | |||
1436 | cfq_del_rq_rb(rq); | 1441 | cfq_del_rq_rb(rq); |
1437 | 1442 | ||
1438 | cfqq->cfqd->rq_queued--; | 1443 | cfqq->cfqd->rq_queued--; |
1444 | blkiocg_update_request_remove_stats(&cfqq->cfqg->blkg, rq_data_dir(rq), | ||
1445 | rq_is_sync(rq)); | ||
1439 | if (rq_is_meta(rq)) { | 1446 | if (rq_is_meta(rq)) { |
1440 | WARN_ON(!cfqq->meta_pending); | 1447 | WARN_ON(!cfqq->meta_pending); |
1441 | cfqq->meta_pending--; | 1448 | cfqq->meta_pending--; |
@@ -1527,6 +1534,7 @@ static void __cfq_set_active_queue(struct cfq_data *cfqd, | |||
1527 | if (cfqq) { | 1534 | if (cfqq) { |
1528 | cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d", | 1535 | cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d", |
1529 | cfqd->serving_prio, cfqd->serving_type); | 1536 | cfqd->serving_prio, cfqd->serving_type); |
1537 | blkiocg_update_set_active_queue_stats(&cfqq->cfqg->blkg); | ||
1530 | cfqq->slice_start = 0; | 1538 | cfqq->slice_start = 0; |
1531 | cfqq->dispatch_start = jiffies; | 1539 | cfqq->dispatch_start = jiffies; |
1532 | cfqq->allocated_slice = 0; | 1540 | cfqq->allocated_slice = 0; |
@@ -3213,6 +3221,9 @@ static void cfq_insert_request(struct request_queue *q, struct request *rq) | |||
3213 | list_add_tail(&rq->queuelist, &cfqq->fifo); | 3221 | list_add_tail(&rq->queuelist, &cfqq->fifo); |
3214 | cfq_add_rq_rb(rq); | 3222 | cfq_add_rq_rb(rq); |
3215 | 3223 | ||
3224 | blkiocg_update_request_add_stats(&cfqq->cfqg->blkg, | ||
3225 | &cfqd->serving_group->blkg, rq_data_dir(rq), | ||
3226 | rq_is_sync(rq)); | ||
3216 | cfq_rq_enqueued(cfqd, cfqq, rq); | 3227 | cfq_rq_enqueued(cfqd, cfqq, rq); |
3217 | } | 3228 | } |
3218 | 3229 | ||