|
@@ -216,7 +216,6 @@ struct cfq_data {
|
|
|
enum wl_type_t serving_type;
|
|
|
unsigned long workload_expires;
|
|
|
struct cfq_group *serving_group;
|
|
|
- bool noidle_tree_requires_idle;
|
|
|
|
|
|
/*
|
|
|
* Each priority tree is sorted by next_request position. These
|
|
@@ -2126,7 +2125,6 @@ static void choose_service_tree(struct cfq_data *cfqd, struct cfq_group *cfqg)
|
|
|
slice = max_t(unsigned, slice, CFQ_MIN_TT);
|
|
|
cfq_log(cfqd, "workload slice:%d", slice);
|
|
|
cfqd->workload_expires = jiffies + slice;
|
|
|
- cfqd->noidle_tree_requires_idle = false;
|
|
|
}
|
|
|
|
|
|
static struct cfq_group *cfq_get_next_cfqg(struct cfq_data *cfqd)
|
|
@@ -3108,7 +3106,9 @@ cfq_update_idle_window(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
|
|
if (cfqq->queued[0] + cfqq->queued[1] >= 4)
|
|
|
cfq_mark_cfqq_deep(cfqq);
|
|
|
|
|
|
- if (!atomic_read(&cic->ioc->nr_tasks) || !cfqd->cfq_slice_idle ||
|
|
|
+ if (cfqq->next_rq && (cfqq->next_rq->cmd_flags & REQ_NOIDLE))
|
|
|
+ enable_idle = 0;
|
|
|
+ else if (!atomic_read(&cic->ioc->nr_tasks) || !cfqd->cfq_slice_idle ||
|
|
|
(!cfq_cfqq_deep(cfqq) && CFQQ_SEEKY(cfqq)))
|
|
|
enable_idle = 0;
|
|
|
else if (sample_valid(cic->ttime_samples)) {
|
|
@@ -3421,17 +3421,7 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
|
|
|
cfq_slice_expired(cfqd, 1);
|
|
|
else if (sync && cfqq_empty &&
|
|
|
!cfq_close_cooperator(cfqd, cfqq)) {
|
|
|
- cfqd->noidle_tree_requires_idle |=
|
|
|
- !(rq->cmd_flags & REQ_NOIDLE);
|
|
|
- /*
|
|
|
- * Idling is enabled for SYNC_WORKLOAD.
|
|
|
- * SYNC_NOIDLE_WORKLOAD idles at the end of the tree
|
|
|
- * only if we processed at least one !REQ_NOIDLE request
|
|
|
- */
|
|
|
- if (cfqd->serving_type == SYNC_WORKLOAD
|
|
|
- || cfqd->noidle_tree_requires_idle
|
|
|
- || cfqq->cfqg->nr_cfqq == 1)
|
|
|
- cfq_arm_slice_timer(cfqd);
|
|
|
+ cfq_arm_slice_timer(cfqd);
|
|
|
}
|
|
|
}
|
|
|
|