mirror of https://gitee.com/openkylin/linux.git
[PATCH] cfq-iosched.c: minor fixes
One critical fix and two minor fixes for 2.6.13-rc7: - Max depth must currently be 2 to allow barriers to function on SCSI - Prefer sync request over async in choosing the next request - Never allow async request to preempt or disturb the "anticipation" for a single cfq process context. This is as-designed, the code right now is buggy in that area. Signed-off-by: Jens Axboe <axboe@suse.de> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
41290c1464
commit
9c2c38a122
|
@ -47,7 +47,7 @@ static int cfq_slice_idle = HZ / 100;
|
||||||
/*
|
/*
|
||||||
* disable queueing at the driver/hardware level
|
* disable queueing at the driver/hardware level
|
||||||
*/
|
*/
|
||||||
static int cfq_max_depth = 1;
|
static int cfq_max_depth = 2;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* for the hash of cfqq inside the cfqd
|
* for the hash of cfqq inside the cfqd
|
||||||
|
@ -385,9 +385,15 @@ cfq_choose_req(struct cfq_data *cfqd, struct cfq_rq *crq1, struct cfq_rq *crq2)
|
||||||
return crq2;
|
return crq2;
|
||||||
if (crq2 == NULL)
|
if (crq2 == NULL)
|
||||||
return crq1;
|
return crq1;
|
||||||
if (cfq_crq_requeued(crq1))
|
|
||||||
|
if (cfq_crq_requeued(crq1) && !cfq_crq_requeued(crq2))
|
||||||
return crq1;
|
return crq1;
|
||||||
if (cfq_crq_requeued(crq2))
|
else if (cfq_crq_requeued(crq2) && !cfq_crq_requeued(crq1))
|
||||||
|
return crq2;
|
||||||
|
|
||||||
|
if (cfq_crq_is_sync(crq1) && !cfq_crq_is_sync(crq2))
|
||||||
|
return crq1;
|
||||||
|
else if (cfq_crq_is_sync(crq2) && !cfq_crq_is_sync(crq1))
|
||||||
return crq2;
|
return crq2;
|
||||||
|
|
||||||
s1 = crq1->request->sector;
|
s1 = crq1->request->sector;
|
||||||
|
@ -1769,18 +1775,23 @@ static void
|
||||||
cfq_crq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
cfq_crq_enqueued(struct cfq_data *cfqd, struct cfq_queue *cfqq,
|
||||||
struct cfq_rq *crq)
|
struct cfq_rq *crq)
|
||||||
{
|
{
|
||||||
const int sync = cfq_crq_is_sync(crq);
|
struct cfq_io_context *cic;
|
||||||
|
|
||||||
cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq);
|
cfqq->next_crq = cfq_choose_req(cfqd, cfqq->next_crq, crq);
|
||||||
|
|
||||||
if (sync) {
|
/*
|
||||||
struct cfq_io_context *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))
|
||||||
|
return;
|
||||||
|
|
||||||
cfq_update_io_thinktime(cfqd, cic);
|
cic = crq->io_context;
|
||||||
cfq_update_idle_window(cfqd, cfqq, cic);
|
|
||||||
|
|
||||||
cic->last_queue = jiffies;
|
cfq_update_io_thinktime(cfqd, cic);
|
||||||
}
|
cfq_update_idle_window(cfqd, cfqq, cic);
|
||||||
|
|
||||||
|
cic->last_queue = jiffies;
|
||||||
|
|
||||||
if (cfqq == cfqd->active_queue) {
|
if (cfqq == cfqd->active_queue) {
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue