Blame SOURCES/kvm-Revert-mirror-Don-t-let-an-operation-wait-for-itself.patch

ddf19c
From 71b5267ed33f9e60bc98acbabcbed62f01a96ff4 Mon Sep 17 00:00:00 2001
ddf19c
From: Kevin Wolf <kwolf@redhat.com>
ddf19c
Date: Mon, 30 Mar 2020 11:19:23 +0100
ddf19c
Subject: [PATCH 3/4] Revert "mirror: Don't let an operation wait for itself"
ddf19c
ddf19c
RH-Author: Kevin Wolf <kwolf@redhat.com>
ddf19c
Message-id: <20200330111924.22938-2-kwolf@redhat.com>
ddf19c
Patchwork-id: 94464
ddf19c
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 1/2] Revert "mirror: Don't let an operation wait for itself"
ddf19c
Bugzilla: 1794692
ddf19c
RH-Acked-by: Maxim Levitsky <mlevitsk@redhat.com>
ddf19c
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
ddf19c
RH-Acked-by: Max Reitz <mreitz@redhat.com>
ddf19c
ddf19c
This reverts commit 7e6c4ff792734e196c8ca82564c56b5e7c6288ca.
ddf19c
ddf19c
The fix was incomplete as it only protected against requests waiting for
ddf19c
themselves, but not against requests waiting for each other. We need a
ddf19c
different solution.
ddf19c
ddf19c
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ddf19c
Message-Id: <20200326153628.4869-2-kwolf@redhat.com>
ddf19c
Reviewed-by: Eric Blake <eblake@redhat.com>
ddf19c
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ddf19c
(cherry picked from commit 9178f4fe5f083064f5c91f04d98c815ce5a5af1c)
ddf19c
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
ddf19c
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
ddf19c
---
ddf19c
 block/mirror.c | 21 +++++++++------------
ddf19c
 1 file changed, 9 insertions(+), 12 deletions(-)
ddf19c
ddf19c
diff --git a/block/mirror.c b/block/mirror.c
ddf19c
index cacbc70..8959e42 100644
ddf19c
--- a/block/mirror.c
ddf19c
+++ b/block/mirror.c
ddf19c
@@ -283,14 +283,11 @@ static int mirror_cow_align(MirrorBlockJob *s, int64_t *offset,
ddf19c
 }
ddf19c
 
ddf19c
 static inline void coroutine_fn
ddf19c
-mirror_wait_for_any_operation(MirrorBlockJob *s, MirrorOp *self, bool active)
ddf19c
+mirror_wait_for_any_operation(MirrorBlockJob *s, bool active)
ddf19c
 {
ddf19c
     MirrorOp *op;
ddf19c
 
ddf19c
     QTAILQ_FOREACH(op, &s->ops_in_flight, next) {
ddf19c
-        if (self == op) {
ddf19c
-            continue;
ddf19c
-        }
ddf19c
         /* Do not wait on pseudo ops, because it may in turn wait on
ddf19c
          * some other operation to start, which may in fact be the
ddf19c
          * caller of this function.  Since there is only one pseudo op
ddf19c
@@ -305,10 +302,10 @@ mirror_wait_for_any_operation(MirrorBlockJob *s, MirrorOp *self, bool active)
ddf19c
 }
ddf19c
 
ddf19c
 static inline void coroutine_fn
ddf19c
-mirror_wait_for_free_in_flight_slot(MirrorBlockJob *s, MirrorOp *self)
ddf19c
+mirror_wait_for_free_in_flight_slot(MirrorBlockJob *s)
ddf19c
 {
ddf19c
     /* Only non-active operations use up in-flight slots */
ddf19c
-    mirror_wait_for_any_operation(s, self, false);
ddf19c
+    mirror_wait_for_any_operation(s, false);
ddf19c
 }
ddf19c
 
ddf19c
 /* Perform a mirror copy operation.
ddf19c
@@ -351,7 +348,7 @@ static void coroutine_fn mirror_co_read(void *opaque)
ddf19c
 
ddf19c
     while (s->buf_free_count < nb_chunks) {
ddf19c
         trace_mirror_yield_in_flight(s, op->offset, s->in_flight);
ddf19c
-        mirror_wait_for_free_in_flight_slot(s, op);
ddf19c
+        mirror_wait_for_free_in_flight_slot(s);
ddf19c
     }
ddf19c
 
ddf19c
     /* Now make a QEMUIOVector taking enough granularity-sized chunks
ddf19c
@@ -558,7 +555,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s)
ddf19c
 
ddf19c
         while (s->in_flight >= MAX_IN_FLIGHT) {
ddf19c
             trace_mirror_yield_in_flight(s, offset, s->in_flight);
ddf19c
-            mirror_wait_for_free_in_flight_slot(s, pseudo_op);
ddf19c
+            mirror_wait_for_free_in_flight_slot(s);
ddf19c
         }
ddf19c
 
ddf19c
         if (s->ret < 0) {
ddf19c
@@ -612,7 +609,7 @@ static void mirror_free_init(MirrorBlockJob *s)
ddf19c
 static void coroutine_fn mirror_wait_for_all_io(MirrorBlockJob *s)
ddf19c
 {
ddf19c
     while (s->in_flight > 0) {
ddf19c
-        mirror_wait_for_free_in_flight_slot(s, NULL);
ddf19c
+        mirror_wait_for_free_in_flight_slot(s);
ddf19c
     }
ddf19c
 }
ddf19c
 
ddf19c
@@ -797,7 +794,7 @@ static int coroutine_fn mirror_dirty_init(MirrorBlockJob *s)
ddf19c
             if (s->in_flight >= MAX_IN_FLIGHT) {
ddf19c
                 trace_mirror_yield(s, UINT64_MAX, s->buf_free_count,
ddf19c
                                    s->in_flight);
ddf19c
-                mirror_wait_for_free_in_flight_slot(s, NULL);
ddf19c
+                mirror_wait_for_free_in_flight_slot(s);
ddf19c
                 continue;
ddf19c
             }
ddf19c
 
ddf19c
@@ -950,7 +947,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
ddf19c
         /* Do not start passive operations while there are active
ddf19c
          * writes in progress */
ddf19c
         while (s->in_active_write_counter) {
ddf19c
-            mirror_wait_for_any_operation(s, NULL, true);
ddf19c
+            mirror_wait_for_any_operation(s, true);
ddf19c
         }
ddf19c
 
ddf19c
         if (s->ret < 0) {
ddf19c
@@ -976,7 +973,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
ddf19c
             if (s->in_flight >= MAX_IN_FLIGHT || s->buf_free_count == 0 ||
ddf19c
                 (cnt == 0 && s->in_flight > 0)) {
ddf19c
                 trace_mirror_yield(s, cnt, s->buf_free_count, s->in_flight);
ddf19c
-                mirror_wait_for_free_in_flight_slot(s, NULL);
ddf19c
+                mirror_wait_for_free_in_flight_slot(s);
ddf19c
                 continue;
ddf19c
             } else if (cnt != 0) {
ddf19c
                 delay_ns = mirror_iteration(s);
ddf19c
-- 
ddf19c
1.8.3.1
ddf19c