diff options
| author | Damien Le Moal <[email protected]> | 2024-09-08 00:07:04 +0000 |
|---|---|---|
| committer | Jens Axboe <[email protected]> | 2024-09-10 19:43:42 +0000 |
| commit | 734e1a8603128ac31526c477a39456be5f4092b6 (patch) | |
| tree | ea68a92fd5f2fe2fcd2d0e03756c0bf6e5b7f0c6 /drivers/platform/surface/aggregator/ssh_parser.c | |
| parent | Merge tag 'nvme-6.11-2024-09-05' of git://git.infradead.org/nvme into block-6.11 (diff) | |
| download | kernel-734e1a8603128ac31526c477a39456be5f4092b6.tar.gz kernel-734e1a8603128ac31526c477a39456be5f4092b6.zip | |
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]>
Diffstat (limited to 'drivers/platform/surface/aggregator/ssh_parser.c')
0 files changed, 0 insertions, 0 deletions
