• Jan Kara's avatar
    cfq-iosched: Allow sync noidle workloads to preempt each other · a257ae3e
    Jan Kara authored
    The original idea with preemption of sync noidle queues (introduced in
    commit 718eee05 "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 e4a22919
    "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: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarJan Kara <jack@suse.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    a257ae3e
cfq-iosched.c 123 KB