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

Reply via email to