Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 172976
b: refs/heads/master
c: 8e55063
h: refs/heads/master
v: v3
  • Loading branch information
Corrado Zoccolo authored and Jens Axboe committed Nov 26, 2009
1 parent a5c785b commit fca300e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 11 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 76280aff1c7e9ae761cac4b48591c43cd7d69159
refs/heads/master: 8e550632cccae34e265cb066691945515eaa7fb5
32 changes: 22 additions & 10 deletions trunk/block/cfq-iosched.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ struct cfq_data {
enum wl_prio_t serving_prio;
enum wl_type_t serving_type;
unsigned long workload_expires;
bool noidle_tree_requires_idle;

/*
* Each priority tree is sorted by next_request position. These
Expand Down Expand Up @@ -1253,9 +1254,9 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)
return;

/*
* still requests with the driver, don't idle
* still active requests from this queue, don't idle
*/
if (rq_in_driver(cfqd))
if (cfqq->dispatched)
return;

/*
Expand Down Expand Up @@ -1478,6 +1479,7 @@ static void choose_service_tree(struct cfq_data *cfqd)

slice = max_t(unsigned, slice, CFQ_MIN_TT);
cfqd->workload_expires = jiffies + slice;
cfqd->noidle_tree_requires_idle = false;
}

/*
Expand Down Expand Up @@ -2597,17 +2599,27 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
cfq_clear_cfqq_slice_new(cfqq);
}
/*
* If there are no requests waiting in this queue, and
* there are other queues ready to issue requests, AND
* those other queues are issuing requests within our
* mean seek distance, give them a chance to run instead
* of idling.
* Idling is not enabled on:
* - expired queues
* - idle-priority queues
* - async queues
* - queues with still some requests queued
* - when there is a close cooperator
*/
if (cfq_slice_used(cfqq) || cfq_class_idle(cfqq))
cfq_slice_expired(cfqd, 1);
else if (cfqq_empty && !cfq_close_cooperator(cfqd, cfqq) &&
sync && !rq_noidle(rq))
cfq_arm_slice_timer(cfqd);
else if (sync && cfqq_empty &&
!cfq_close_cooperator(cfqd, cfqq)) {
cfqd->noidle_tree_requires_idle |= !rq_noidle(rq);
/*
* Idling is enabled for SYNC_WORKLOAD.
* SYNC_NOIDLE_WORKLOAD idles at the end of the tree
* only if we processed at least one !rq_noidle request
*/
if (cfqd->serving_type == SYNC_WORKLOAD
|| cfqd->noidle_tree_requires_idle)
cfq_arm_slice_timer(cfqd);
}
}

if (!rq_in_driver(cfqd))
Expand Down

0 comments on commit fca300e

Please sign in to comment.