summaryrefslogtreecommitdiffstats
path: root/block/cfq-iosched.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@suse.de>2006-06-01 10:09:56 +0200
committerJens Axboe <axboe@suse.de>2006-06-01 10:09:56 +0200
commit12e9fddd6eb827937fcaac8ac7712c7303898b1f (patch)
treeb3fbb502f46319808a50fd2fc7a93668d697f6ec /block/cfq-iosched.c
parente0de0206a2a37cd3e0ba9954d9f863e11d6d1782 (diff)
downloadlinux-12e9fddd6eb827937fcaac8ac7712c7303898b1f.tar.bz2
[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>
Diffstat (limited to 'block/cfq-iosched.c')
-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,
cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq);
+ cic = crq->io_context;
+
/*
* we never wait for an async request and we don't allow preemption
* of an async request. so just return early
*/
- if (!cfq_crq_is_sync(crq))
+ if (!cfq_crq_is_sync(crq)) {
+ /*
+ * sync process issued an async request, if it's waiting
+ * then expire it and kick rq handling.
+ */
+ if (cic == cfqd->active_cic &&
+ del_timer(&cfqd->idle_slice_timer)) {
+ cfq_slice_expired(cfqd, 0);
+ cfq_start_queueing(cfqd, cfqq);
+ }
return;
-
- cic = crq->io_context;
+ }
cfq_update_io_thinktime(cfqd, cic);
cfq_update_io_seektime(cfqd, cic, crq);