• Jens Axboe's avatar
    blk-mq: unify hctx delay_work and run_work · 21c6e939
    Jens Axboe authored
    The only difference between ->run_work and ->delay_work, is that
    the latter is used to defer running a queue. This is done by
    marking the queue stopped, and scheduling ->delay_work to run
    sometime in the future. While the queue is stopped, direct runs
    or runs through ->run_work will not run the queue.
    
    If we combine the handlers, then we need to handle two things:
    
    1) If a delayed/stopped run is scheduled, then we should not run
       the queue before that has been completed.
    2) If a queue is delayed/stopped, the handler needs to restart
       the queue. Normally a run of a queue with the stopped bit set
       would be a no-op.
    
    Case 1 is handled by modifying a currently pending queue run
    to the deadline set by the caller of blk_mq_delay_queue().
    Subsequent attempts to queue a queue run will find the work
    item already pending, and direct runs will see a stopped queue
    as before.
    
    Case 2 is handled by adding a new bit, BLK_MQ_S_START_ON_RUN,
    that tells the work handler that it should clear a stopped
    queue and run the handler.
    Reviewed-by: default avatarBart Van Assche <Bart.VanAssche@sandisk.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    21c6e939
blk-core.c 92 KB