• Damien Le Moal's avatar
    block: mq-deadline: Fix write completion handling · 7211aef8
    Damien Le Moal authored
    For a zoned block device using mq-deadline, if a write request for a
    zone is received while another write was already dispatched for the same
    zone, dd_dispatch_request() will return NULL and the newly inserted
    write request is kept in the scheduler queue waiting for the ongoing
    zone write to complete. With this behavior, when no other request has
    been dispatched, rq_list in blk_mq_sched_dispatch_requests() is empty
    and blk_mq_sched_mark_restart_hctx() not called. This in turn leads to
    __blk_mq_free_request() call of blk_mq_sched_restart() to not run the
    queue when the already dispatched write request completes. The newly
    dispatched request stays stuck in the scheduler queue until eventually
    another request is submitted.
    
    This problem does not affect SCSI disk as the SCSI stack handles queue
    restart on request completion. However, this problem is can be triggered
    the nullblk driver with zoned mode enabled.
    
    Fix this by always requesting a queue restart in dd_dispatch_request()
    if no request was dispatched while WRITE requests are queued.
    
    Fixes: 5700f691 ("mq-deadline: Introduce zone locking support")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
    
    Add missing export of blk_mq_sched_restart()
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    7211aef8
blk-mq-sched.c 13 KB