diff options
author | Mikulas Patocka <mpatocka@redhat.com> | 2017-02-15 17:26:10 +0100 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-02-17 06:54:10 +0100 |
commit | d67a5f4b5947aba4bfe9a80a2b86079c215ca755 (patch) | |
tree | a9e1638326cb1388eb9edd4397052ddf3ce4c411 /drivers/md/persistent-data | |
parent | dm round robin: revert "use percpu 'repeat_count' and 'current_path'" (diff) | |
download | linux-d67a5f4b5947aba4bfe9a80a2b86079c215ca755.tar.xz linux-d67a5f4b5947aba4bfe9a80a2b86079c215ca755.zip |
dm: flush queued bios when process blocks to avoid deadlock
Commit df2cb6daa4 ("block: Avoid deadlocks with bio allocation by
stacking drivers") created a workqueue for every bio set and code
in bio_alloc_bioset() that tries to resolve some low-memory deadlocks
by redirecting bios queued on current->bio_list to the workqueue if the
system is low on memory. However other deadlocks (see below **) may
happen, without any low memory condition, because generic_make_request
is queuing bios to current->bio_list (rather than submitting them).
** the related dm-snapshot deadlock is detailed here:
https://www.redhat.com/archives/dm-devel/2016-July/msg00065.html
Fix this deadlock by redirecting any bios on current->bio_list to the
bio_set's rescue workqueue on every schedule() call. Consequently,
when the process blocks on a mutex, the bios queued on
current->bio_list are dispatched to independent workqueus and they can
complete without waiting for the mutex to be available.
The structure blk_plug contains an entry cb_list and this list can contain
arbitrary callback functions that are called when the process blocks.
To implement this fix DM (ab)uses the onstack plug's cb_list interface
to get its flush_current_bio_list() called at schedule() time.
This fixes the snapshot deadlock - if the map method blocks,
flush_current_bio_list() will be called and it redirects bios waiting
on current->bio_list to appropriate workqueues.
Fixes: https://bugzilla.redhat.com/show_bug.cgi?id=1267650
Depends-on: df2cb6daa4 ("block: Avoid deadlocks with bio allocation by stacking drivers")
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/persistent-data')
0 files changed, 0 insertions, 0 deletions