]> git.karo-electronics.de Git - karo-tx-linux.git/commit
md: use a separate bio_set for synchronous IO.
authorNeilBrown <neilb@suse.com>
Tue, 20 Jun 2017 23:12:21 +0000 (09:12 +1000)
committerShaohua Li <shli@fb.com>
Wed, 21 Jun 2017 17:52:36 +0000 (10:52 -0700)
commit5a85071c2cbcc7d8d8f764b33bf64c76e47d268d
tree8f848a4d49ba2908b7634f4a8b26a1e869dece86
parent8df72024393cdba2543e55d51297f2b2c4ede46f
md: use a separate bio_set for synchronous IO.

md devices allocate a bio_set and use it for two
distinct purposes.
mddev->bio_set is used to clone bios as part of sending
upper level requests down to lower level devices,
and it is also use for synchronous IO such as superblock
and bitmap updates, and for correcting read errors.

This multiple usage can lead to deadlocks.  It is likely
that cloned bios might be queued for write and to be
waiting for a metadata update before the write can be permitted.
If the cloning exhausted mddev->bio_set, the metadata update
may not be able to proceed.

This scenario has been seen during heavy testing, with lots of IO and
lots of memory pressure.

Address this by adding a new bio_set specifically for synchronous IO.
All synchronous IO goes directly to the underlying device and is not
queued at the md level, so request using entries from the new
mddev->sync_set will complete in a timely fashion.
Requests that use mddev->bio_set will sometimes need to wait
for synchronous IO, but will no longer risk deadlocking that iO.

Also: small simplification in mddev_put(): there is no need to
wait until the spinlock is released before calling bioset_free().

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/md.c
drivers/md/md.h