Skip to content

Commit

Permalink
cfq-iosched: schedule dispatch for noidle queue
Browse files Browse the repository at this point in the history
A queue is idle at cfq_dispatch_requests(), but it gets noidle later. Unless
other task explictly does unplug or all requests are drained, we will not
deliever requests to the disk even cfq_arm_slice_timer doesn't make the
queue idle. For example, cfq_should_idle() returns true because of
service_tree->count == 1, and then other queues are added. Note, I didn't
see obvious performance impacts so far with the patch, but just thought
this could be a problem.

Signed-off-by: Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
  • Loading branch information
Shaohua Li authored and Jens Axboe committed Nov 8, 2010
1 parent c1e4475 commit d2d59e1
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion block/cfq-iosched.c
Original file line number Diff line number Diff line change
Expand Up @@ -3255,6 +3255,10 @@ cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
if (cfq_class_rt(new_cfqq) && !cfq_class_rt(cfqq))
return true;

/* An idle queue should not be idle now for some reason */
if (RB_EMPTY_ROOT(&cfqq->sort_list) && !cfq_should_idle(cfqd, cfqq))
return true;

if (!cfqd->active_cic || !cfq_cfqq_wait_request(cfqq))
return false;

Expand Down Expand Up @@ -3508,8 +3512,25 @@ static void cfq_completed_request(struct request_queue *q, struct request *rq)
}
}

if (!cfqd->rq_in_driver)
if (!cfqd->rq_in_driver) {
cfq_schedule_dispatch(cfqd);
return;
}
/*
* A queue is idle at cfq_dispatch_requests(), but it gets noidle
* later. We schedule a dispatch if the queue has no requests,
* otherwise the disk is actually in idle till all requests
* are finished even cfq_arm_slice_timer doesn't make the queue idle
* */
cfqq = cfqd->active_queue;
if (!cfqq)
return;

if (RB_EMPTY_ROOT(&cfqq->sort_list) && !cfq_should_idle(cfqd, cfqq) &&
(!cfqd->cfq_group_idle || cfqq->cfqg->nr_cfqq > 1)) {
cfq_del_timer(cfqd, cfqq);
cfq_schedule_dispatch(cfqd);
}
}

/*
Expand Down

0 comments on commit d2d59e1

Please sign in to comment.