• Damien Le Moal's avatar
    block: Prevent deadlocks when switching elevators · 734e1a86
    Damien Le Moal authored
    Commit af281414 ("block: freeze the queue in queue_attr_store")
    changed queue_attr_store() to always freeze a sysfs attribute queue
    before calling the attribute store() method, to ensure that no IOs are
    in-flight when an attribute value is being updated.
    
    However, this change created a potential deadlock situation for the
    scheduler queue attribute as changing the queue elevator with
    elv_iosched_store() can result in a call to request_module() if the user
    requested module is not already registered. If the file of the requested
    module is stored on the block device of the frozen queue, a deadlock
    will happen as the read operations triggered by request_module() will
    wait for the queue freeze to end.
    
    Solve this issue by introducing the load_module method in struct
    queue_sysfs_entry, and to calling this method function in
    queue_attr_store() before freezing the attribute queue.
    The macro definition QUEUE_RW_LOAD_MODULE_ENTRY() is added to define a
    queue sysfs attribute that needs loading a module.
    
    The definition of the scheduler atrribute is changed to using
    QUEUE_RW_LOAD_MODULE_ENTRY(), with the function
    elv_iosched_load_module() defined as the load_module method.
    elv_iosched_store() can then be simplified to remove the call to
    request_module().
    Reported-by: default avatarRichard W.M. Jones <rjones@redhat.com>
    Reported-by: default avatarJiri Jaburek <jjaburek@redhat.com>
    Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219166
    Fixes: af281414 ("block: freeze the queue in queue_attr_store")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Tested-by: default avatarRichard W.M. Jones <rjones@redhat.com>
    Link: https://lore.kernel.org/r/20240908000704.414538-1-dlemoal@kernel.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    734e1a86
elevator.c 17.7 KB