]> git.baikalelectronics.ru Git - kernel.git/commit
cfq-iosched: Allow sync noidle workloads to preempt each other
authorJan Kara <jack@suse.com>
Tue, 12 Jan 2016 15:24:17 +0000 (16:24 +0100)
committerJens Axboe <axboe@fb.com>
Thu, 4 Feb 2016 16:50:14 +0000 (09:50 -0700)
commita24a47d9722b1d95165632235295f735024df4f7
tree514bff67f2e6a1de70478038d410ff5895f08a45
parent4ae11ae8f482ce2676281696769d3c496a6e5190
cfq-iosched: Allow sync noidle workloads to preempt each other

The original idea with preemption of sync noidle queues (introduced in
commit 63ecba4348b6 "cfq-iosched: fairness for sync no-idle queues") was
that we service all sync noidle queues together, we don't idle on any of
the queues individually and we idle only if there is no sync noidle
queue to be served. This intention also matches the original test:

if (cfqd->serving_type == SYNC_NOIDLE_WORKLOAD
   && new_cfqq->service_tree == cfqq->service_tree)
return true;

However since at that time cfqq->service_tree was not set for idling
queues, this test was unreliable and was replaced in commit 5c070dbc51c2
"cfq-iosched: fix no-idle preemption logic" by:

if (cfqd->serving_type == SYNC_NOIDLE_WORKLOAD &&
    cfqq_type(new_cfqq) == SYNC_NOIDLE_WORKLOAD &&
    new_cfqq->service_tree->count == 1)
return true;

That was a reliable test but was actually doing something different -
now we preempt sync noidle queue only if the new queue is the only one
busy in the service tree.

These days cfq queue is kept in service tree even if it is idling and
thus the original check would be safe again. But since we actually check
that cfq queues are in the same cgroup, of the same priority class and
workload type (sync noidle), we know that new_cfqq is fine to preempt
cfqq. So just remove the service tree check.

Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jan Kara <jack@suse.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/cfq-iosched.c