cfq-iosched: fix no-idle preemption logic
An incoming no-idle queue should preempt the active no-idle queue only if the active queue is idling due to service tree empty. Previous code was buggy in two ways: * it relied on service_tree field to be set on the active queue, while it is not set when the code is idling for a new request * it didn't check for the service tree empty condition, so could lead to LIFO behaviour if multiple queues with depth > 1 were preempting each other on an non-NCQ device. Reported-by: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Corrado Zoccolo <czoccolo@gmail.com> Acked-by: Vivek Goyal <vgoyal@redhat.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
e459dd08f4
commit
e4a229196a
@ -2392,8 +2392,9 @@ cfq_should_preempt(struct cfq_data *cfqd, struct cfq_queue *new_cfqq,
|
|||||||
if (cfq_class_idle(cfqq))
|
if (cfq_class_idle(cfqq))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (cfqd->serving_type == SYNC_NOIDLE_WORKLOAD
|
if (cfqd->serving_type == SYNC_NOIDLE_WORKLOAD &&
|
||||||
&& new_cfqq->service_tree == cfqq->service_tree)
|
cfqq_type(new_cfqq) == SYNC_NOIDLE_WORKLOAD &&
|
||||||
|
new_cfqq->service_tree->count == 1)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user