• Tejun Heo's avatar
    block: don't request module during elevator init · 21c3c5d2
    Tejun Heo authored
    Block layer allows selecting an elevator which is built as a module to
    be selected as system default via kernel param "elevator=".  This is
    achieved by automatically invoking request_module() whenever a new
    block device is initialized and the elevator is not available.
    
    This led to an interesting deadlock problem involving async and module
    init.  Block device probing running off an async job invokes
    request_module().  While the module is being loaded, it performs
    async_synchronize_full() which ends up waiting for the async job which
    is already waiting for request_module() to finish, leading to
    deadlock.
    
    Invoking request_module() from deep in block device init path is
    already nasty in itself.  It seems best to avoid these situations from
    the beginning by moving on-demand module loading out of block init
    path.
    
    The previous patch made sure that the default elevator module is
    loaded early during boot if available.  This patch removes on-demand
    loading of the default elevator from elevator init path.  As the
    module would have been loaded during boot, userland-visible behavior
    difference should be minimal.
    
    For more details, please refer to the following thread.
    
      http://thread.gmane.org/gmane.linux.kernel/1420814
    
    v2: The bool parameter was named @request_module which conflicted with
        request_module().  This built okay w/ CONFIG_MODULES because
        request_module() was defined as a macro.  W/o CONFIG_MODULES, it
        causes build breakage.  Rename the parameter to @try_loading.
        Reported by Fengguang.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Arjan van de Ven <arjan@linux.intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Alex Riesen <raa.lkml@gmail.com>
    Cc: Fengguang Wu <fengguang.wu@intel.com>
    21c3c5d2
elevator.c 23.8 KB