diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2007-01-18 20:11:44 -0500 |
---|---|---|
committer | Jens Axboe <axboe@carl.home.kernel.dk> | 2007-02-11 17:14:45 -0500 |
commit | 9ede209e83693cf3f6b64f61ab4b65f2f809cb50 (patch) | |
tree | a91ad6e7fd1b8589ecf4c8e5e027a397d89ccd6f /block/cfq-iosched.c | |
parent | 28f95cbc3ec01f2c7d248e1a4a384f37e9c2ab16 (diff) |
cfq-iosched: improve continue or break logic in cfq_dispatch
This improves performance considerably for sync requests when you
have command queuing enabled.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'block/cfq-iosched.c')
-rw-r--r-- | block/cfq-iosched.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 6aa5523f514c..b6491c020f26 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1057,6 +1057,14 @@ cfq_dispatch_requests(request_queue_t *q, int force) | |||
1057 | if (prev_cfqq == cfqq) | 1057 | if (prev_cfqq == cfqq) |
1058 | break; | 1058 | break; |
1059 | 1059 | ||
1060 | /* | ||
1061 | * So we have dispatched before in this round, if the | ||
1062 | * next queue has idling enabled (must be sync), don't | ||
1063 | * allow it service until the previous have continued. | ||
1064 | */ | ||
1065 | if (cfqd->rq_in_driver && cfq_cfqq_idle_window(cfqq)) | ||
1066 | break; | ||
1067 | |||
1060 | cfq_clear_cfqq_must_dispatch(cfqq); | 1068 | cfq_clear_cfqq_must_dispatch(cfqq); |
1061 | cfq_clear_cfqq_wait_request(cfqq); | 1069 | cfq_clear_cfqq_wait_request(cfqq); |
1062 | del_timer(&cfqd->idle_slice_timer); | 1070 | del_timer(&cfqd->idle_slice_timer); |
@@ -1066,14 +1074,6 @@ cfq_dispatch_requests(request_queue_t *q, int force) | |||
1066 | max_dispatch = 1; | 1074 | max_dispatch = 1; |
1067 | 1075 | ||
1068 | dispatched += __cfq_dispatch_requests(cfqd, cfqq, max_dispatch); | 1076 | dispatched += __cfq_dispatch_requests(cfqd, cfqq, max_dispatch); |
1069 | |||
1070 | /* | ||
1071 | * If the dispatch cfqq has idling enabled and is still | ||
1072 | * the active queue, break out. | ||
1073 | */ | ||
1074 | if (cfq_cfqq_idle_window(cfqq) && cfqd->active_queue) | ||
1075 | break; | ||
1076 | |||
1077 | prev_cfqq = cfqq; | 1077 | prev_cfqq = cfqq; |
1078 | } | 1078 | } |
1079 | 1079 | ||