Blame SOURCES/kvm-blockjob-introduce-block_job_do_yield.patch

9bac43
From dace2b99ec7489bdabb4beeb429ec44427805d90 Mon Sep 17 00:00:00 2001
9bac43
From: Jeffrey Cody <jcody@redhat.com>
9bac43
Date: Thu, 30 Nov 2017 22:49:14 +0100
9bac43
Subject: [PATCH 10/21] blockjob: introduce block_job_do_yield
9bac43
9bac43
RH-Author: Jeffrey Cody <jcody@redhat.com>
9bac43
Message-id: <331a28f9c09b1ce40dd95f7b21ded200ab46713d.1511985875.git.jcody@redhat.com>
9bac43
Patchwork-id: 78046
9bac43
O-Subject: [RHV7.5 qemu-kvm-rhev PATCH 10/11] blockjob: introduce block_job_do_yield
9bac43
Bugzilla: 1506531
9bac43
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
9bac43
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9bac43
RH-Acked-by: John Snow <jsnow@redhat.com>
9bac43
9bac43
From: Paolo Bonzini <pbonzini@redhat.com>
9bac43
9bac43
Hide the clearing of job->busy in a single function, and set it
9bac43
in block_job_enter.  This lets block_job_do_yield verify that
9bac43
qemu_coroutine_enter is not used while job->busy = false.
9bac43
9bac43
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
9bac43
Tested-By: Jeff Cody <jcody@redhat.com>
9bac43
Reviewed-by: Fam Zheng <famz@redhat.com>
9bac43
Reviewed-by: Jeff Cody <jcody@redhat.com>
9bac43
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
9bac43
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
9bac43
(cherry picked from commit 356f59b8757f47c0aca3e2e4e51d6010f64cade1)
9bac43
Signed-off-by: Jeff Cody <jcody@redhat.com>
9bac43
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9bac43
---
9bac43
 blockjob.c | 24 ++++++++++++++++--------
9bac43
 1 file changed, 16 insertions(+), 8 deletions(-)
9bac43
9bac43
diff --git a/blockjob.c b/blockjob.c
9bac43
index 4d78046..e960b3e 100644
9bac43
--- a/blockjob.c
9bac43
+++ b/blockjob.c
9bac43
@@ -729,6 +729,15 @@ static bool block_job_should_pause(BlockJob *job)
9bac43
     return job->pause_count > 0;
9bac43
 }
9bac43
 
9bac43
+static void block_job_do_yield(BlockJob *job)
9bac43
+{
9bac43
+    job->busy = false;
9bac43
+    qemu_coroutine_yield();
9bac43
+
9bac43
+    /* Set by block_job_enter before re-entering the coroutine.  */
9bac43
+    assert(job->busy);
9bac43
+}
9bac43
+
9bac43
 void coroutine_fn block_job_pause_point(BlockJob *job)
9bac43
 {
9bac43
     assert(job && block_job_started(job));
9bac43
@@ -746,9 +755,7 @@ void coroutine_fn block_job_pause_point(BlockJob *job)
9bac43
 
9bac43
     if (block_job_should_pause(job) && !block_job_is_cancelled(job)) {
9bac43
         job->paused = true;
9bac43
-        job->busy = false;
9bac43
-        qemu_coroutine_yield(); /* wait for block_job_resume() */
9bac43
-        job->busy = true;
9bac43
+        block_job_do_yield(job);
9bac43
         job->paused = false;
9bac43
     }
9bac43
 
9bac43
@@ -778,9 +785,12 @@ void block_job_enter(BlockJob *job)
9bac43
         return;
9bac43
     }
9bac43
 
9bac43
-    if (!job->busy) {
9bac43
-        bdrv_coroutine_enter(blk_bs(job->blk), job->co);
9bac43
+    if (job->busy) {
9bac43
+        return;
9bac43
     }
9bac43
+
9bac43
+    job->busy = true;
9bac43
+    aio_co_wake(job->co);
9bac43
 }
9bac43
 
9bac43
 bool block_job_is_cancelled(BlockJob *job)
9bac43
@@ -819,11 +829,9 @@ void block_job_yield(BlockJob *job)
9bac43
         return;
9bac43
     }
9bac43
 
9bac43
-    job->busy = false;
9bac43
     if (!block_job_should_pause(job)) {
9bac43
-        qemu_coroutine_yield();
9bac43
+        block_job_do_yield(job);
9bac43
     }
9bac43
-    job->busy = true;
9bac43
 
9bac43
     block_job_pause_point(job);
9bac43
 }
9bac43
-- 
9bac43
1.8.3.1
9bac43