166 lines
7.8 KiB
Diff
166 lines
7.8 KiB
Diff
From 84a7e1d25f5611e43e3781dda588b4306606c809 Mon Sep 17 00:00:00 2001
|
|
From: Kevin Wolf <kwolf@redhat.com>
|
|
Date: Tue, 26 Jun 2018 09:47:46 +0200
|
|
Subject: [PATCH 078/268] blockjob: do not cancel timer in resume
|
|
|
|
RH-Author: Kevin Wolf <kwolf@redhat.com>
|
|
Message-id: <20180626094856.6924-4-kwolf@redhat.com>
|
|
Patchwork-id: 81089
|
|
O-Subject: [RHV-7.6 qemu-kvm-rhev PATCH v2 03/73] blockjob: do not cancel timer in resume
|
|
Bugzilla: 1513543
|
|
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
|
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
RH-Acked-by: Fam Zheng <famz@redhat.com>
|
|
|
|
From: Stefan Hajnoczi <stefanha@redhat.com>
|
|
|
|
Currently the timer is cancelled and the block job is entered by
|
|
block_job_resume(). This behavior causes drain to run extra blockjob
|
|
iterations when the job was sleeping due to the ratelimit.
|
|
|
|
This patch leaves the job asleep when block_job_resume() is called.
|
|
Jobs can still be forcibly woken up using block_job_enter(), which is
|
|
used to cancel jobs.
|
|
|
|
After this patch drain no longer runs extra blockjob iterations. This
|
|
is the expected behavior that qemu-iotests 185 used to rely on. We
|
|
temporarily changed the 185 test output to make it pass for the QEMU
|
|
2.12 release but now it's time to address this issue.
|
|
|
|
Cc: QingFeng Hao <haoqf@linux.vnet.ibm.com>
|
|
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
|
|
Reviewed-by: Eric Blake <eblake@redhat.com>
|
|
Reviewed-by: QingFeng Hao <haoqf@linux.vnet.ibm.com>
|
|
Message-id: 20180508135436.30140-3-stefanha@redhat.com
|
|
Reviewed-by: Jeff Cody <jcody@redhat.com>
|
|
Signed-off-by: Jeff Cody <jcody@redhat.com>
|
|
(cherry picked from commit 4c7e813ce964e230bb55cf4afc862ccb091ca3a3)
|
|
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
|
|
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
---
|
|
blockjob.c | 22 +++++++++++++++-------
|
|
tests/qemu-iotests/185 | 5 +----
|
|
tests/qemu-iotests/185.out | 12 +++++-------
|
|
3 files changed, 21 insertions(+), 18 deletions(-)
|
|
|
|
diff --git a/blockjob.c b/blockjob.c
|
|
index 27f957e..7064389 100644
|
|
--- a/blockjob.c
|
|
+++ b/blockjob.c
|
|
@@ -209,6 +209,18 @@ static void block_job_txn_del_job(BlockJob *job)
|
|
}
|
|
}
|
|
|
|
+/* Assumes the block_job_mutex is held */
|
|
+static bool block_job_timer_pending(BlockJob *job)
|
|
+{
|
|
+ return timer_pending(&job->sleep_timer);
|
|
+}
|
|
+
|
|
+/* Assumes the block_job_mutex is held */
|
|
+static bool block_job_timer_not_pending(BlockJob *job)
|
|
+{
|
|
+ return !block_job_timer_pending(job);
|
|
+}
|
|
+
|
|
static void block_job_pause(BlockJob *job)
|
|
{
|
|
job->pause_count++;
|
|
@@ -221,7 +233,9 @@ static void block_job_resume(BlockJob *job)
|
|
if (job->pause_count) {
|
|
return;
|
|
}
|
|
- block_job_enter(job);
|
|
+
|
|
+ /* kick only if no timer is pending */
|
|
+ block_job_enter_cond(job, block_job_timer_not_pending);
|
|
}
|
|
|
|
void block_job_ref(BlockJob *job)
|
|
@@ -651,12 +665,6 @@ static void block_job_completed_txn_success(BlockJob *job)
|
|
}
|
|
}
|
|
|
|
-/* Assumes the block_job_mutex is held */
|
|
-static bool block_job_timer_pending(BlockJob *job)
|
|
-{
|
|
- return timer_pending(&job->sleep_timer);
|
|
-}
|
|
-
|
|
void block_job_set_speed(BlockJob *job, int64_t speed, Error **errp)
|
|
{
|
|
Error *local_err = NULL;
|
|
diff --git a/tests/qemu-iotests/185 b/tests/qemu-iotests/185
|
|
index 975404c..9a2d317 100755
|
|
--- a/tests/qemu-iotests/185
|
|
+++ b/tests/qemu-iotests/185
|
|
@@ -101,14 +101,11 @@ echo
|
|
# command to be received (after receiving the command, the rest runs
|
|
# synchronously, so jobs can arbitrarily continue or complete).
|
|
#
|
|
-# Jobs present while QEMU is terminating iterate once more due to
|
|
-# bdrv_drain_all().
|
|
-#
|
|
# The buffer size for commit and streaming is 512k (waiting for 8 seconds after
|
|
# the first request), for active commit and mirror it's large enough to cover
|
|
# the full 4M, and for backup it's the qcow2 cluster size, which we know is
|
|
# 64k. As all of these are at least as large as the speed, we are sure that the
|
|
-# offset advances exactly twice before qemu exits.
|
|
+# offset advances exactly once before qemu exits.
|
|
|
|
_send_qemu_cmd $h \
|
|
"{ 'execute': 'block-commit',
|
|
diff --git a/tests/qemu-iotests/185.out b/tests/qemu-iotests/185.out
|
|
index 992162f..57eaf8d 100644
|
|
--- a/tests/qemu-iotests/185.out
|
|
+++ b/tests/qemu-iotests/185.out
|
|
@@ -20,7 +20,7 @@ Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=67108864 backing_file=TEST_DIR/t.q
|
|
{"return": {}}
|
|
{"return": {}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
|
|
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 1048576, "speed": 65536, "type": "commit"}}
|
|
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 524288, "speed": 65536, "type": "commit"}}
|
|
|
|
=== Start active commit job and exit qemu ===
|
|
|
|
@@ -28,8 +28,7 @@ Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=67108864 backing_file=TEST_DIR/t.q
|
|
{"return": {}}
|
|
{"return": {}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
|
|
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "commit"}}
|
|
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "commit"}}
|
|
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "commit"}}
|
|
|
|
=== Start mirror job and exit qemu ===
|
|
|
|
@@ -38,8 +37,7 @@ Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 size=67108864 cluster_size=65536 l
|
|
{"return": {}}
|
|
{"return": {}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
|
|
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_READY", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "mirror"}}
|
|
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_COMPLETED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "mirror"}}
|
|
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 4194304, "offset": 4194304, "speed": 65536, "type": "mirror"}}
|
|
|
|
=== Start backup job and exit qemu ===
|
|
|
|
@@ -48,7 +46,7 @@ Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 size=67108864 cluster_size=65536 l
|
|
{"return": {}}
|
|
{"return": {}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
|
|
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 131072, "speed": 65536, "type": "backup"}}
|
|
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 65536, "speed": 65536, "type": "backup"}}
|
|
|
|
=== Start streaming job and exit qemu ===
|
|
|
|
@@ -56,6 +54,6 @@ Formatting 'TEST_DIR/t.qcow2.copy', fmt=qcow2 size=67108864 cluster_size=65536 l
|
|
{"return": {}}
|
|
{"return": {}}
|
|
{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "SHUTDOWN", "data": {"guest": false}}
|
|
-{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 1048576, "speed": 65536, "type": "stream"}}
|
|
+{"timestamp": {"seconds": TIMESTAMP, "microseconds": TIMESTAMP}, "event": "BLOCK_JOB_CANCELLED", "data": {"device": "disk", "len": 67108864, "offset": 524288, "speed": 65536, "type": "stream"}}
|
|
No errors were found on the image.
|
|
*** done
|
|
--
|
|
1.8.3.1
|
|
|