• Shaohua Li's avatar
    cfq-iosched: limit coop preemption · 4b27e1bb
    Shaohua Li authored
    CFQ has an optimization for cooperated applications. if several
    io-context have close requests, they will get boost. But the
    optimization get abused. Considering thread a, b, which work on one
    file. a reads sectors s, s+2, s+4, ...; b reads sectors s+1, s+3, s
    +5, ... Both a and b are sequential read, so they can open idle window.
    a reads a sector s and goes to idle window and wakeup b. b reads sector
    s+1, since in current implementation, cfq_should_preempt() thinks a and
    b are cooperators, b will preempt a. b then reads sector s+1 and goes to
    idle window and wakeup a. for the same reason, a will preempt b and
    reads s+2. a and b will continue the circle. The circle will be very
    long, and a and b will occupy whole disk queue. Other applications will
    nearly have no chance to run.
    
    Fix this limiting coop preempt until a queue is scheduled normally
    again.
    Signed-off-by: default avatarShaohua Li <shaohua.li@intel.com>
    Acked-by: default avatarJeff Moyer <jmoyer@redhat.com>
    Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
    4b27e1bb
cfq-iosched.c 65.8 KB