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

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