• Thomas Gleixner's avatar
    block: Shorten interrupt disabled regions · 50864670
    Thomas Gleixner authored
    Commit 9c40cef2 ("sched: Move blk_schedule_flush_plug() out of
    __schedule()") moved the blk_schedule_flush_plug() call out of the
    interrupt/preempt disabled region in the scheduler. This allows to replace
    local_irq_save/restore(flags) by local_irq_disable/enable() in
    blk_flush_plug_list().
    
    But it makes more sense to disable interrupts explicitly when the request
    queue is locked end reenable them when the request to is unlocked. This
    shortens the interrupt disabled section which is important when the plug
    list contains requests for more than one queue. The comment which claims
    that disabling interrupts around the loop is misleading as the called
    functions can reenable interrupts unconditionally anyway and obfuscates the
    scope badly:
    
     local_irq_save(flags);
       spin_lock(q->queue_lock);
       ...
       queue_unplugged(q...);
         scsi_request_fn();
           spin_unlock_irq(q->queue_lock);
    
    -------------------^^^ ????
    
           spin_lock_irq(q->queue_lock);
         spin_unlock(q->queue_lock);
     local_irq_restore(flags);
    
    Aside of that the detached interrupt disabling is a constant pain for
    PREEMPT_RT as it requires patching and special casing when RT is enabled
    while with the spin_*_irq() variants this happens automatically.
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: http://lkml.kernel.org/r/20110622174919.025446432@linutronix.deSigned-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    50864670
blk-core.c 105 KB