aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDivyesh Shah <dpshah@google.com>2010-03-25 10:45:03 -0400
committerJens Axboe <jens.axboe@oracle.com>2010-03-25 10:45:03 -0400
commitb1ffe737f5b743115ee46ffb59e338e580c54902 (patch)
treefb069889c4832ff90adc63bfe422e607c9b0ebc8
parent8a6d9b149f105f8bdfa8e42dd9753e45a1887a16 (diff)
cfq-iosched: Add additional blktrace log messages in CFQ for easier debugging
These have helped us debug some issues we've noticed in earlier IO controller versions and should be useful now as well. The extra logging covers: - idling behavior. Since there are so many conditions based on which we decide to idle or not, this patch adds a log message for some conditions that we've found useful. - workload slices and current prio and workload type Changelog from v1: o moved log message from cfq_set_active_queue() to __cfq_set_active_queue() o changed queue_count to st->count Signed-off-by: Divyesh Shah<dpshah@google.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-rw-r--r--block/cfq-iosched.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c
index 8d5a2f2f7fb9..2f91c5351949 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -1518,7 +1518,8 @@ static void __cfq_set_active_queue(struct cfq_data *cfqd,
1518 struct cfq_queue *cfqq) 1518 struct cfq_queue *cfqq)
1519{ 1519{
1520 if (cfqq) { 1520 if (cfqq) {
1521 cfq_log_cfqq(cfqd, cfqq, "set_active"); 1521 cfq_log_cfqq(cfqd, cfqq, "set_active wl_prio:%d wl_type:%d",
1522 cfqd->serving_prio, cfqd->serving_type);
1522 cfqq->slice_start = 0; 1523 cfqq->slice_start = 0;
1523 cfqq->dispatch_start = jiffies; 1524 cfqq->dispatch_start = jiffies;
1524 cfqq->allocated_slice = 0; 1525 cfqq->allocated_slice = 0;
@@ -1788,7 +1789,11 @@ static bool cfq_should_idle(struct cfq_data *cfqd, struct cfq_queue *cfqq)
1788 * Otherwise, we do only if they are the last ones 1789 * Otherwise, we do only if they are the last ones
1789 * in their service tree. 1790 * in their service tree.
1790 */ 1791 */
1791 return service_tree->count == 1 && cfq_cfqq_sync(cfqq); 1792 if (service_tree->count == 1 && cfq_cfqq_sync(cfqq))
1793 return 1;
1794 cfq_log_cfqq(cfqd, cfqq, "Not idling. st->count:%d",
1795 service_tree->count);
1796 return 0;
1792} 1797}
1793 1798
1794static void cfq_arm_slice_timer(struct cfq_data *cfqd) 1799static void cfq_arm_slice_timer(struct cfq_data *cfqd)
@@ -1833,8 +1838,11 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)
1833 * time slice. 1838 * time slice.
1834 */ 1839 */
1835 if (sample_valid(cic->ttime_samples) && 1840 if (sample_valid(cic->ttime_samples) &&
1836 (cfqq->slice_end - jiffies < cic->ttime_mean)) 1841 (cfqq->slice_end - jiffies < cic->ttime_mean)) {
1842 cfq_log_cfqq(cfqd, cfqq, "Not idling. think_time:%d",
1843 cic->ttime_mean);
1837 return; 1844 return;
1845 }
1838 1846
1839 cfq_mark_cfqq_wait_request(cfqq); 1847 cfq_mark_cfqq_wait_request(cfqq);
1840 1848
@@ -2042,6 +2050,7 @@ static void choose_service_tree(struct cfq_data *cfqd, struct cfq_group *cfqg)
2042 slice = max(slice, 2 * cfqd->cfq_slice_idle); 2050 slice = max(slice, 2 * cfqd->cfq_slice_idle);
2043 2051
2044 slice = max_t(unsigned, slice, CFQ_MIN_TT); 2052 slice = max_t(unsigned, slice, CFQ_MIN_TT);
2053 cfq_log(cfqd, "workload slice:%d", slice);
2045 cfqd->workload_expires = jiffies + slice; 2054 cfqd->workload_expires = jiffies + slice;
2046 cfqd->noidle_tree_requires_idle = false; 2055 cfqd->noidle_tree_requires_idle = false;
2047} 2056}
@@ -3308,6 +3317,7 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
3308 if (cfq_should_wait_busy(cfqd, cfqq)) { 3317 if (cfq_should_wait_busy(cfqd, cfqq)) {
3309 cfqq->slice_end = jiffies + cfqd->cfq_slice_idle; 3318 cfqq->slice_end = jiffies + cfqd->cfq_slice_idle;
3310 cfq_mark_cfqq_wait_busy(cfqq); 3319 cfq_mark_cfqq_wait_busy(cfqq);
3320 cfq_log_cfqq(cfqd, cfqq, "will busy wait");
3311 } 3321 }
3312 3322
3313 /* 3323 /*