This patch makes dm-writecache wait if the kcopyd workqueue is blocked (it happens when one of the devices is contested). It improves performance of "mkfs.ext2" by approximatelly 20%. Signed-off-by: Mikulas Patocka <mpatocka@xxxxxxxxxx> Index: linux/drivers/md/dm-kcopyd.c =================================================================== --- linux.orig/drivers/md/dm-kcopyd.c +++ linux/drivers/md/dm-kcopyd.c @@ -888,6 +888,12 @@ void dm_kcopyd_do_callback(void *j, int } EXPORT_SYMBOL(dm_kcopyd_do_callback); +void dm_kcopyd_wait_if_busy(struct dm_kcopyd_client *kc) +{ + flush_workqueue(kc->kcopyd_wq); +} +EXPORT_SYMBOL(dm_kcopyd_wait_if_busy); + /* * Cancels a kcopyd job, eg. someone might be deactivating a * mirror. Index: linux/drivers/md/dm-writecache.c =================================================================== --- linux.orig/drivers/md/dm-writecache.c +++ linux/drivers/md/dm-writecache.c @@ -1819,6 +1819,9 @@ static void writecache_writeback(struct struct writeback_list wbl; unsigned long n_walked; + if (!WC_MODE_PMEM(wc)) + dm_kcopyd_wait_if_busy(wc->dm_kcopyd); + wc_lock(wc); restart: if (writecache_has_error(wc)) { Index: linux/include/linux/dm-kcopyd.h =================================================================== --- linux.orig/include/linux/dm-kcopyd.h +++ linux/include/linux/dm-kcopyd.h @@ -81,6 +81,8 @@ void *dm_kcopyd_prepare_callback(struct dm_kcopyd_notify_fn fn, void *context); void dm_kcopyd_do_callback(void *job, int read_err, unsigned long write_err); +void dm_kcopyd_wait_if_busy(struct dm_kcopyd_client *kc); + void dm_kcopyd_zero(struct dm_kcopyd_client *kc, unsigned num_dests, struct dm_io_region *dests, unsigned flags, dm_kcopyd_notify_fn fn, void *context); -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel