[Devel] [PATCH RHEL9 COMMIT] dm-ploop: decrease inflight number after pio endio
Konstantin Khorenko
khorenko at virtuozzo.com
Wed Jul 16 16:45:49 MSK 2025
The commit is pushed to "branch-rh9-5.14.0-427.55.1.vz9.82.x-ovz" and will appear at git at bitbucket.org:openvz/vzkernel.git
after rh9-5.14.0-427.55.1.vz9.82.8
------>
commit 3f9825c0e19b04584cbd9b0f6fa31d82e30ddefc
Author: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
Date: Wed Jul 16 12:37:53 2025 +0300
dm-ploop: decrease inflight number after pio endio
We do not increase inflight number when we chain pios, so we should
decrease inflight only after all chained pios are also completed,
e.g. pio->remaining is zero, and file is flushed if needed.
https://virtuozzo.atlassian.net/browse/VSTOR-108540
Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
Reviewed-by: Pavel Tikhomirov <ptikhomirov at 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-map.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index f717967a8bde1..5648549d61546 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -214,6 +214,8 @@ static void ploop_prq_endio(struct pio *pio, void *prq_ptr,
dm_complete_request(rq, bi_status);
}
+static void ploop_dec_nr_inflight(struct ploop *ploop, struct pio *pio);
+
static void ploop_wrkr_pio_endio(struct pio *pio)
{
ploop_endio_t endio_cb = pio->endio_cb;
@@ -223,6 +225,8 @@ static void ploop_wrkr_pio_endio(struct pio *pio)
file = ploop_top_delta(pio->ploop)->file;
vfs_fsync(file, 1);
+
+ ploop_dec_nr_inflight(pio->ploop, pio);
endio_cb(pio, endio_cb_data, pio->bi_status);
if (free_on_endio) {
ploop_free_pio(pio->ploop, pio);
@@ -245,6 +249,7 @@ static void ploop_do_pio_endio(struct pio *pio)
return;
}
+ ploop_dec_nr_inflight(pio->ploop, pio);
endio_cb(pio, endio_cb_data, pio->bi_status);
if (free_on_endio)
@@ -2698,7 +2703,6 @@ static void ploop_handle_cleanup(struct ploop *ploop, struct pio *pio)
ploop_discard_index_pio_end(ploop, pio);
ploop_unlink_completed_pio(ploop, pio);
- ploop_dec_nr_inflight(ploop, pio);
}
/*
More information about the Devel
mailing list