]> Git Repo - linux.git/commit
block: Prevent deadlocks when switching elevators
authorDamien Le Moal <[email protected]>
Sun, 8 Sep 2024 00:07:04 +0000 (09:07 +0900)
committerJens Axboe <[email protected]>
Tue, 10 Sep 2024 19:43:42 +0000 (13:43 -0600)
commit734e1a8603128ac31526c477a39456be5f4092b6
treeea68a92fd5f2fe2fcd2d0e03756c0bf6e5b7f0c6
parent4ba032bc71dad8d604d308afffaa16b81816c751
block: Prevent deadlocks when switching elevators

Commit af2814149883 ("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: Richard W.M. Jones <[email protected]>
Reported-by: Jiri Jaburek <[email protected]>
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=219166
Fixes: af2814149883 ("block: freeze the queue in queue_attr_store")
Cc: [email protected]
Signed-off-by: Damien Le Moal <[email protected]>
Tested-by: Richard W.M. Jones <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jens Axboe <[email protected]>
block/blk-sysfs.c
block/elevator.c
block/elevator.h
This page took 0.054199 seconds and 4 git commands to generate.