[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 5/9] mirror: implement mirror_change method
From: |
Fiona Ebner |
Subject: |
[PATCH v3 5/9] mirror: implement mirror_change method |
Date: |
Fri, 13 Oct 2023 11:21:39 +0200 |
which allows switching the @copy-mode from 'background' to
'write-blocking'.
This is useful for management applications, so they can start out in
background mode to avoid limiting guest write speed and switch to
active mode when certain criteria are fulfilled.
In presence of an iothread, the copy_mode member is now shared between
the iothread and the main thread, so turn accesses to it atomic.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
---
Changes in v3:
* turn accesses to copy_mode atomic and...
* ...slightly adapt error handling in mirror_change as a
consequence
block/mirror.c | 33 ++++++++++++++++++++++++++++++---
qapi/block-core.json | 13 ++++++++++++-
2 files changed, 42 insertions(+), 4 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index 8992c09172..889cce5414 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1075,7 +1075,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
*/
job_transition_to_ready(&s->common.job);
}
- if (s->copy_mode != MIRROR_COPY_MODE_BACKGROUND) {
+ if (qatomic_read(&s->copy_mode) != MIRROR_COPY_MODE_BACKGROUND) {
s->actively_synced = true;
}
@@ -1246,6 +1246,32 @@ static bool commit_active_cancel(Job *job, bool force)
return force || !job_is_ready(job);
}
+static void mirror_change(BlockJob *job, BlockJobChangeOptions *opts,
+ Error **errp)
+{
+ MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
+ BlockJobChangeOptionsMirror *change_opts = &opts->u.mirror;
+ MirrorCopyMode current;
+
+ if (qatomic_read(&s->copy_mode) == change_opts->copy_mode) {
+ return;
+ }
+
+ if (change_opts->copy_mode != MIRROR_COPY_MODE_WRITE_BLOCKING) {
+ error_setg(errp, "Change to copy mode '%s' is not implemented",
+ MirrorCopyMode_str(change_opts->copy_mode));
+ return;
+ }
+
+ current = qatomic_cmpxchg(&s->copy_mode, MIRROR_COPY_MODE_BACKGROUND,
+ change_opts->copy_mode);
+ if (current != MIRROR_COPY_MODE_BACKGROUND) {
+ error_setg(errp, "Expected current copy mode '%s', got '%s'",
+ MirrorCopyMode_str(MIRROR_COPY_MODE_BACKGROUND),
+ MirrorCopyMode_str(current));
+ }
+}
+
static const BlockJobDriver mirror_job_driver = {
.job_driver = {
.instance_size = sizeof(MirrorBlockJob),
@@ -1260,6 +1286,7 @@ static const BlockJobDriver mirror_job_driver = {
.cancel = mirror_cancel,
},
.drained_poll = mirror_drained_poll,
+ .change = mirror_change,
};
static const BlockJobDriver commit_active_job_driver = {
@@ -1467,7 +1494,7 @@ static bool should_copy_to_target(MirrorBDSOpaque *s)
{
return s->job && s->job->ret >= 0 &&
!job_is_cancelled(&s->job->common.job) &&
- s->job->copy_mode == MIRROR_COPY_MODE_WRITE_BLOCKING;
+ qatomic_read(&s->job->copy_mode) == MIRROR_COPY_MODE_WRITE_BLOCKING;
}
static int coroutine_fn GRAPH_RDLOCK
@@ -1812,7 +1839,7 @@ static BlockJob *mirror_start_job(
s->is_none_mode = is_none_mode;
s->backing_mode = backing_mode;
s->zero_target = zero_target;
- s->copy_mode = copy_mode;
+ qatomic_set(&s->copy_mode, copy_mode);
s->base = base;
s->base_overlay = bdrv_find_overlay(bs, base);
s->granularity = granularity;
diff --git a/qapi/block-core.json b/qapi/block-core.json
index c6f31a9399..01427c259a 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -3044,6 +3044,17 @@
{ 'command': 'block-job-finalize', 'data': { 'id': 'str' },
'allow-preconfig': true }
+##
+# @BlockJobChangeOptionsMirror:
+#
+# @copy-mode: Switch to this copy mode. Currenlty, only the switch
+# from 'background' to 'write-blocking' is implemented.
+#
+# Since: 8.2
+##
+{ 'struct': 'BlockJobChangeOptionsMirror',
+ 'data': { 'copy-mode' : 'MirrorCopyMode' } }
+
##
# @BlockJobChangeOptions:
#
@@ -3058,7 +3069,7 @@
{ 'union': 'BlockJobChangeOptions',
'base': { 'id': 'str', 'type': 'JobType' },
'discriminator': 'type',
- 'data': {} }
+ 'data': { 'mirror': 'BlockJobChangeOptionsMirror' } }
##
# @block-job-change:
--
2.39.2
- [PATCH v3 7/9] qapi/block-core: turn BlockJobInfo into a union, (continued)
- [PATCH v3 3/9] block/mirror: move dirty bitmap to filter, Fiona Ebner, 2023/10/13
- [PATCH v3 8/9] blockjob: query driver-specific info via a new 'query' driver method, Fiona Ebner, 2023/10/13
- [PATCH v3 4/9] block/mirror: determine copy_to_target only once, Fiona Ebner, 2023/10/13
- [PATCH v3 6/9] qapi/block-core: use JobType for BlockJobInfo's type, Fiona Ebner, 2023/10/13
- [PATCH v3 5/9] mirror: implement mirror_change method,
Fiona Ebner <=
[PATCH v3 9/9] mirror: return mirror-specific information upon query, Fiona Ebner, 2023/10/13
Re: [PATCH v3 0/9] mirror: allow switching from background to active mode, Markus Armbruster, 2023/10/18
Re: [PATCH v3 0/9] mirror: allow switching from background to active mode, Kevin Wolf, 2023/10/19