Re: [PATCH v20 02/12] Add infrastructure for copy offload in block and request layer.

From: Bart Van Assche
Date: Thu May 30 2024 - 13:12:47 EST


On 5/30/24 00:16, Nitesh Shetty wrote:
+static inline bool blk_copy_offload_attempt_combine(struct request_queue *q,
+                         struct bio *bio)
+{
+    struct blk_plug *plug = current->plug;
+    struct request *rq;
+
+    if (!plug || rq_list_empty(plug->mq_list))
+        return false;
+
+    rq_list_for_each(&plug->mq_list, rq) {
+        if (rq->q == q) {
+            if (!blk_copy_offload_combine(rq, bio))
+                return true;
+            break;
+        }
+
+        /*
+         * Only keep iterating plug list for combines if we have multiple
+         * queues
+         */
+        if (!plug->multiple_queues)
+            break;
+    }
+    return false;
+}

This new approach has the following two disadvantages:
* Without plug, REQ_OP_COPY_SRC and REQ_OP_COPY_DST are not combined. These two
operation types are the only operation types for which not using a plug causes
an I/O failure.
* A loop is required to combine the REQ_OP_COPY_SRC and REQ_OP_COPY_DST operations.

Please switch to the approach Hannes suggested, namely bio chaining. Chaining
REQ_OP_COPY_SRC and REQ_OP_COPY_DST bios before these are submitted eliminates the
two disadvantages mentioned above.

Thanks,

Bart.