• Vasily Tarasov's avatar
    [PATCH] block layer: ioprio_best function fix · d58cdfb8
    Vasily Tarasov authored
    Currently ioprio_best function first checks wethere aioprio or bioprio equals
    IOPRIO_CLASS_NONE (ioprio_valid() macros does that) and if it is so it returns
    bioprio/aioprio appropriately. Thus the next four lines, that set aclass/bclass
    to IOPRIO_CLASS_BE, if aclass/bclass == IOPRIO_CLASS_NONE, are never executed.
    
    The second problem: if aioprio from class IOPRIO_CLASS_NONE and bioprio from
    class IOPRIO_CLASS_IDLE are passed to ioprio_best function, it will return
    IOPRIO_CLASS_IDLE. It means that during __make_request we can merge two
    requests and set the priority of merged request to IDLE, while one of
    the initial requests originates from a process with NONE (default) priority.
    So we can get a situation when a process with default ioprio will experience
    IO starvation, while there is no process from real-time class in the system.
    
    Just removing ioprio_valid check should correct situation.
    Signed-off-by: default avatarVasily Tarasov <vtaras@openvz.org>
    Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
    d58cdfb8
ioprio.c 4.57 KB