[Devel] [PATCH hci-8.1 5/7] drivers/md/dm-qcow2: implement per-qio fast processing

Andrey Zhadchenko andrey.zhadchenko at virtuozzo.com
Thu Oct 29 17:03:44 MSK 2026


Each qio is handled by it's own work and process_one_qio() can now
work with qios not requiring metadata. Try to process qios right
after splitting. Insert all leftovers into respective lists for
do_qcow2_work().

https://virtuozzo.atlassian.net/browse/VSTOR-95494
Feature: dm-qcow2: block device over QCOW2 files driver
Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko at virtuozzo.com>
---
 drivers/md/dm-qcow2-map.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/md/dm-qcow2-map.c b/drivers/md/dm-qcow2-map.c
index 7afaba0afec14..e55186147fdf7 100644
--- a/drivers/md/dm-qcow2-map.c
+++ b/drivers/md/dm-qcow2-map.c
@@ -4594,9 +4594,18 @@ static void handle_cleanup_mask(struct qio *qio)
 	}
 }
 
+static void qio_try_fast(struct qio *qio, struct list_head *deferred_qios)
+{
+	list_del(&qio->link);
+
+	if (process_one_qio(qio->qcow2, qio, true))
+		list_add(&qio->link, deferred_qios);
+}
+
 static void do_qio_work(struct work_struct *ws)
 {
 	struct qio *qio = container_of(ws, struct qio, worker);
+	struct qio *i, *next;
 	struct qcow2 *qcow2 = qio->qcow2;
 	struct qcow2_target *tgt = qcow2->tgt;
 	unsigned int pflags = current->flags;
@@ -4606,8 +4615,12 @@ static void do_qio_work(struct work_struct *ws)
 	switch (qio->state) {
 	case QIO_STATE_START: {
 		LIST_HEAD(deferred_qios);
+		LIST_HEAD(split_qios);
+
+		prepare_one_embedded_qio(qio, &split_qios);
+		list_for_each_entry_safe(i, next, &split_qios, link)
+			qio_try_fast(i, &deferred_qios);
 
-		prepare_one_embedded_qio(qio, &deferred_qios);
 		if (list_empty(&deferred_qios))
 			break;
 
-- 
2.43.5



More information about the Devel mailing list