aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJens Axboe <axboe@suse.de>2006-06-01 04:09:56 -0400
committerJens Axboe <axboe@suse.de>2006-06-01 04:09:56 -0400
commit12e9fddd6eb827937fcaac8ac7712c7303898b1f (patch)
treeb3fbb502f46319808a50fd2fc7a93668d697f6ec
parente0de0206a2a37cd3e0ba9954d9f863e11d6d1782 (diff)
[PATCH] cfq-iosched: Detect idle process issuing async request
If we are anticipating a sync request from this process and we are waiting for that and see an async request come in, expire that slice and move on. Signed-off-by: Jens Axboe <axboe@suse.de>
-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 d582433441c5..93ba54605eda 100644
--- a/block/cfq-iosched.c
+++ b/block/cfq-iosched.c
@@ -1747,14 +1747,24 @@ cfq_crq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
1747 1747
1748 cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq); 1748 cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq);
1749 1749
1750 cic = crq->io_context;
1751
1750 /* 1752 /*
1751 * we never wait for an async request and we don't allow preemption 1753 * we never wait for an async request and we don't allow preemption
1752 * of an async request. so just return early 1754 * of an async request. so just return early
1753 */ 1755 */
1754 if (!cfq_crq_is_sync(crq)) 1756 if (!cfq_crq_is_sync(crq)) {
1757 /*
1758 * sync process issued an async request, if it's waiting
1759 * then expire it and kick rq handling.
1760 */
1761 if (cic == cfqd->active_cic &&
1762 del_timer(&cfqd->idle_slice_timer)) {
1763 cfq_slice_expired(cfqd, 0);
1764 cfq_start_queueing(cfqd, cfqq);
1765 }
1755 return; 1766 return;
1756 1767 }
1757 cic = crq->io_context;
1758 1768
1759 cfq_update_io_thinktime(cfqd, cic); 1769 cfq_update_io_thinktime(cfqd, cic);
1760 cfq_update_io_seektime(cfqd, cic, crq); 1770 cfq_update_io_seektime(cfqd, cic, crq);