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

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