summaryrefslogtreecommitdiffstats
path: root/drivers/md/md.h
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.com>2016-06-02 16:19:53 +1000
committerShaohua Li <shli@fb.com>2016-06-13 11:54:22 -0700
commitd787be4092e27728cb4c012bee9762098ef3c662 (patch)
treeb8de57ed842d3c01f6fdd4f6ee5be6408763a993 /drivers/md/md.h
parentf5b67ae86ee317db20c0e10d54f16a0bbbd3207d (diff)
downloadlinux-stable-d787be4092e27728cb4c012bee9762098ef3c662.tar.gz
linux-stable-d787be4092e27728cb4c012bee9762098ef3c662.tar.bz2
linux-stable-d787be4092e27728cb4c012bee9762098ef3c662.zip
md: reduce the number of synchronize_rcu() calls when multiple devices fail.
Every time a device is removed with ->hot_remove_disk() a synchronize_rcu() call is made which can delay several milliseconds in some case. If lots of devices fail at once - as could happen with a large RAID10 where one set of devices are removed all at once - these delays can add up to be very inconcenient. As failure is not reversible we can check for that first, setting a separate flag if it is found, and then all synchronize_rcu() once for all the flagged devices. Then ->hot_remove_disk() function can skip the synchronize_rcu() step if the flag is set. fix build error(Shaohua) Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Shaohua Li <shli@fb.com>
Diffstat (limited to 'drivers/md/md.h')
-rw-r--r--drivers/md/md.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 03b19aad4921..dc65ca65b26e 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -163,6 +163,11 @@ enum flag_bits {
* than other devices in the array
*/
ClusterRemove,
+ RemoveSynchronized, /* synchronize_rcu() was called after
+ * this device was known to be faulty,
+ * so it is safe to remove without
+ * another synchronize_rcu() call.
+ */
};
static inline int is_badblock(struct md_rdev *rdev, sector_t s, int sectors,