The commit is pushed to "branch-rh9-5.14.0-427.55.1.vz9.82.x-ovz" and will appear at g...@bitbucket.org:openvz/vzkernel.git after rh9-5.14.0-427.55.1.vz9.82.8 ------> commit 2ca8fae2ae23d814b347eef8b43630e4e4e11aa3 Author: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com> Date: Wed Jul 16 12:37:52 2025 +0300
dm-ploop: add inflight metadata writeback counter and use it during ploop_suspend_submitting_pios() to wait for all writeback to flush https://virtuozzo.atlassian.net/browse/VSTOR-108540 Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com> Reviewed-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com> Feature: dm-ploop: ploop target driver ====== Patchset description: dm-ploop: improve pio submission suspension Recently we encountered EBUSY errors while trying to resize ploop devices under load. This mostly happens because we are not waiting in-progess IO correctly: - initial pio is removed from inflight even if its split pios are still running - there is no wait for metadata writeback This patchset fixes that by moving inflight decrease later and introducing new counter for inflight metadata writeback. Note that for dm-qcow2 patches are not needed: it does not have delayed metadata writeback and inflight counters are decreased correctly at the time of endio_cb. https://virtuozzo.atlassian.net/browse/VSTOR-108540 --- drivers/md/dm-ploop-cmd.c | 6 ++++++ drivers/md/dm-ploop-map.c | 5 +++++ drivers/md/dm-ploop-target.c | 2 ++ drivers/md/dm-ploop.h | 3 +++ 4 files changed, 16 insertions(+) diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c index 85bb69714ca86..2043162164be1 100644 --- a/drivers/md/dm-ploop-cmd.c +++ b/drivers/md/dm-ploop-cmd.c @@ -151,6 +151,12 @@ static int ploop_suspend_submitting_pios(struct ploop *ploop) spin_unlock_irq(&ploop->deferred_lock); ret = ploop_inflight_bios_ref_switch(ploop, true); + if (ret) + goto out; + + ret = wait_event_interruptible(ploop->inflight_md_wq, + !atomic_read(&ploop->inflight_md)); +out: if (ret) ploop_resume_submitting_pios(ploop); return ret; diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index 40eca0a6f83f6..f717967a8bde1 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -936,6 +936,8 @@ static void ploop_put_piwb(struct ploop_index_wb *piwb) * zero keeps it as is */ + if (atomic_dec_and_test(&piwb->ploop->inflight_md)) + wake_up_interruptible(&piwb->ploop->inflight_md_wq); ploop_free_piwb(piwb); } } @@ -1094,6 +1096,7 @@ static int ploop_prepare_bat_update(struct ploop *ploop, struct md_page *md, kunmap_local(to); piwb->type = type; + atomic_inc(&ploop->inflight_md); return 0; err: ploop_free_piwb(piwb); @@ -1113,6 +1116,8 @@ void ploop_break_bat_update(struct ploop *ploop, struct md_page *md, spin_unlock(&md->md_lock); spin_unlock_irqrestore(&ploop->bat_lock, flags); + if (atomic_dec_and_test(&ploop->inflight_md)) + wake_up_interruptible(&ploop->inflight_md_wq); ploop_free_piwb(piwb); } diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c index af0658a455ced..6d1881ea3828d 100644 --- a/drivers/md/dm-ploop-target.c +++ b/drivers/md/dm-ploop-target.c @@ -566,8 +566,10 @@ static int ploop_ctr(struct dm_target *ti, unsigned int argc, char **argv) init_waitqueue_head(&ploop->dispatcher_wq_data); init_waitqueue_head(&ploop->dispatcher_wq_fsync); init_waitqueue_head(&ploop->dispatcher_wq_prealloc); + init_waitqueue_head(&ploop->inflight_md_wq); ploop->prealloc_size = 0; ploop->prealloc_in_progress = 0; + atomic_set(&ploop->inflight_md, 0); ploop->kt_worker = ploop_worker_create(ploop, ploop_worker, "d", 0); if (!ploop->kt_worker) diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h index b66672eef5ee9..5a88664feb687 100644 --- a/drivers/md/dm-ploop.h +++ b/drivers/md/dm-ploop.h @@ -267,6 +267,9 @@ struct ploop { loff_t prealloc_size; loff_t prealloc_in_progress; struct wait_queue_head dispatcher_wq_prealloc; + + atomic_t inflight_md; + struct wait_queue_head inflight_md_wq; }; #define ploop_blk_queue(p) ((p)->ti->table->md->queue) _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel