• Ming Lei's avatar
    blk-mq: don't allocate driver tag upfront for flush rq · 923218f6
    Ming Lei authored
    The idea behind it is simple:
    
    1) for none scheduler, driver tag has to be borrowed for flush rq,
       otherwise we may run out of tag, and that causes an IO hang. And
       get/put driver tag is actually noop for none, so reordering tags
       isn't necessary at all.
    
    2) for a real I/O scheduler, we need not allocate a driver tag upfront
       for flush rq. It works just fine to follow the same approach as
       normal requests: allocate driver tag for each rq just before calling
       ->queue_rq().
    
    One driver visible change is that the driver tag isn't shared in the
    flush request sequence. That won't be a problem, since we always do that
    in legacy path.
    
    Then flush rq need not be treated specially wrt. get/put driver tag.
    This cleans up the code - for instance, reorder_tags_to_front() can be
    removed, and we needn't worry about request ordering in dispatch list
    for avoiding I/O deadlock.
    
    Also we have to put the driver tag before requeueing.
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    923218f6
blk-mq-sched.c 13.8 KB