[libvirt PATCH 0/6] qemu: Enable postcopy-preempt migration capability

This is technically a v2 of my recent "Introduce VIR_MIGRATE_POSTCOPY_PREEMPT flag", but the two series share exactly two lines of code (those defining a new QEMU_MIGRATION_CAP_POSTCOPY_PREEMPT enum item) so I'm just sending it as a separate series. More details about this feature can be found in patch 5/6. Jiri Denemark (6): qemu: Document qemuMigrationParamsFlagMapItem fields qemu: Use C99 initializers for qemuMigrationParamsFlagMap qemu: Rename remoteCaps parameter in qemuMigrationParamsCheck qemu: Add support for optional migration capabilities qemu: Enable postcopy-preempt migration capability NEWS: Mention postcopy-preempt migration capability NEWS.rst | 8 ++ src/qemu/qemu_migration.c | 19 +++-- src/qemu/qemu_migration_params.c | 127 ++++++++++++++++++++++--------- src/qemu/qemu_migration_params.h | 4 +- 4 files changed, 115 insertions(+), 43 deletions(-) -- 2.43.0

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration_params.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c index 79fe6e97c8..9de6c08021 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -131,10 +131,20 @@ struct _qemuMigrationParamsAlwaysOnItem { typedef struct _qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMapItem; struct _qemuMigrationParamsFlagMapItem { + /* Describes what to do with the capability if @flag is found. + * When se to QEMU_MIGRATION_FLAG_REQUIRED, the capability will be + * enabled iff the specified migration flag is enabled. On the other hand + * QEMU_MIGRATION_FLAG_FORBIDDEN will enable the capability as long as + * the specified migration flag is not enabled. */ qemuMigrationFlagMatch match; + /* Migration flag to check. */ virDomainMigrateFlags flag; + /* Migration capability to be enabled or disabled based on the flag. */ qemuMigrationCapability cap; - int party; /* bit-wise OR of qemuMigrationParty */ + /* Bit-wise OR of qemuMigrationParty. Determines whether the capability has + * to be enabled on the source, on the destination, or on both sides of + * migration. */ + int party; }; typedef struct _qemuMigrationParamsTPMapItem qemuMigrationParamsTPMapItem; -- 2.43.0

On Mon, Jan 08, 2024 at 18:06:37 +0100, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration_params.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
Reviewed-by: Peter Krempa <pkrempa@redhat.com>

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration_params.c | 50 ++++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c index 9de6c08021..b02a8af8d5 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -175,35 +175,35 @@ static const qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOn[] = { /* Translation from virDomainMigrateFlags to qemuMigrationCapability. */ static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = { - {QEMU_MIGRATION_FLAG_REQUIRED, - VIR_MIGRATE_RDMA_PIN_ALL, - QEMU_MIGRATION_CAP_RDMA_PIN_ALL, - QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, - - {QEMU_MIGRATION_FLAG_REQUIRED, - VIR_MIGRATE_AUTO_CONVERGE, - QEMU_MIGRATION_CAP_AUTO_CONVERGE, - QEMU_MIGRATION_SOURCE}, + {.match = QEMU_MIGRATION_FLAG_REQUIRED, + .flag = VIR_MIGRATE_RDMA_PIN_ALL, + .cap = QEMU_MIGRATION_CAP_RDMA_PIN_ALL, + .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, - {QEMU_MIGRATION_FLAG_REQUIRED, - VIR_MIGRATE_POSTCOPY, - QEMU_MIGRATION_CAP_POSTCOPY, - QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, + {.match = QEMU_MIGRATION_FLAG_REQUIRED, + .flag = VIR_MIGRATE_AUTO_CONVERGE, + .cap = QEMU_MIGRATION_CAP_AUTO_CONVERGE, + .party = QEMU_MIGRATION_SOURCE}, - {QEMU_MIGRATION_FLAG_REQUIRED, - VIR_MIGRATE_PARALLEL, - QEMU_MIGRATION_CAP_MULTIFD, - QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, + {.match = QEMU_MIGRATION_FLAG_REQUIRED, + .flag = VIR_MIGRATE_POSTCOPY, + .cap = QEMU_MIGRATION_CAP_POSTCOPY, + .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, - {QEMU_MIGRATION_FLAG_FORBIDDEN, - VIR_MIGRATE_TUNNELLED, - QEMU_MIGRATION_CAP_RETURN_PATH, - QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, + {.match = QEMU_MIGRATION_FLAG_REQUIRED, + .flag = VIR_MIGRATE_PARALLEL, + .cap = QEMU_MIGRATION_CAP_MULTIFD, + .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, - {QEMU_MIGRATION_FLAG_REQUIRED, - VIR_MIGRATE_ZEROCOPY, - QEMU_MIGRATION_CAP_ZERO_COPY_SEND, - QEMU_MIGRATION_SOURCE}, + {.match = QEMU_MIGRATION_FLAG_FORBIDDEN, + .flag = VIR_MIGRATE_TUNNELLED, + .cap = QEMU_MIGRATION_CAP_RETURN_PATH, + .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, + + {.match = QEMU_MIGRATION_FLAG_REQUIRED, + .flag = VIR_MIGRATE_ZEROCOPY, + .cap = QEMU_MIGRATION_CAP_ZERO_COPY_SEND, + .party = QEMU_MIGRATION_SOURCE}, }; /* Translation from VIR_MIGRATE_PARAM_* typed parameters to -- 2.43.0

On Mon, Jan 08, 2024 at 18:06:38 +0100, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration_params.c | 50 ++++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-)
Reviewed-by: Peter Krempa <pkrempa@redhat.com>

The migration cookie contains two bitmaps of migration capabilities: supported and automatic. qemuMigrationParamsCheck expects the letter so lets make it more obvious by renaming the parameter as remoteAuto. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration_params.c | 6 +++--- src/qemu/qemu_migration_params.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c index b02a8af8d5..f441c59d67 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -1290,7 +1290,7 @@ int qemuMigrationParamsCheck(virDomainObj *vm, int asyncJob, qemuMigrationParams *migParams, - virBitmap *remoteCaps) + virBitmap *remoteAuto) { qemuDomainJobPrivate *jobPriv = vm->job->privateData; qemuMigrationCapability cap; @@ -1323,8 +1323,8 @@ qemuMigrationParamsCheck(virDomainObj *vm, if (qemuMigrationParamsAlwaysOn[i].party != party) { bool remote = false; - if (remoteCaps) - ignore_value(virBitmapGetBit(remoteCaps, cap, &remote)); + if (remoteAuto) + ignore_value(virBitmapGetBit(remoteAuto, cap, &remote)); if (!remote) { VIR_DEBUG("Not enabling migration capability '%s'; it is " diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h index 5857673227..44f5c2a882 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -142,7 +142,7 @@ int qemuMigrationParamsCheck(virDomainObj *vm, int asyncJob, qemuMigrationParams *migParams, - virBitmap *remoteCaps); + virBitmap *remoteAuto); void qemuMigrationParamsReset(virDomainObj *vm, -- 2.43.0

On Mon, Jan 08, 2024 at 18:06:39 +0100, Jiri Denemark wrote:
The migration cookie contains two bitmaps of migration capabilities: supported and automatic. qemuMigrationParamsCheck expects the letter so lets make it more obvious by renaming the parameter as remoteAuto.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration_params.c | 6 +++--- src/qemu/qemu_migration_params.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c index b02a8af8d5..f441c59d67 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -1290,7 +1290,7 @@ int qemuMigrationParamsCheck(virDomainObj *vm, int asyncJob, qemuMigrationParams *migParams, - virBitmap *remoteCaps) + virBitmap *remoteAuto)
If only there was a possibility to add some text ... COMMENTing ... what the parameters do, right ... /s Reviewed-by: Peter Krempa <pkrempa@redhat.com>

We enable various migration capabilities according to the flags passed to a migration API. Missing support for such capabilities results in an error because they are required by the corresponding flag. This patch adds support for additional optional capability we may want to enable for a given API flag in case it is supported. This is useful for capabilities which are not critical for the flags to be supported, but they can make things work better in some way. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration.c | 8 ++--- src/qemu/qemu_migration_params.c | 57 +++++++++++++++++++++++++++++--- src/qemu/qemu_migration_params.h | 1 + 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3ba0aa502b..5504119079 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3172,8 +3172,8 @@ qemuMigrationDstPrepareActive(virQEMUDriver *driver, if (qemuMigrationDstPrepareAnyBlockDirtyBitmaps(vm, mig, migParams, flags) < 0) goto error; - if (qemuMigrationParamsCheck(vm, VIR_ASYNC_JOB_MIGRATION_IN, - migParams, mig->caps->automatic) < 0) + if (qemuMigrationParamsCheck(vm, VIR_ASYNC_JOB_MIGRATION_IN, migParams, + mig->caps->supported, mig->caps->automatic) < 0) goto error; /* Save original migration parameters */ @@ -4831,8 +4831,8 @@ qemuMigrationSrcRun(virQEMUDriver *driver, qemuMigrationSrcRunPrepareBlockDirtyBitmaps(vm, mig, migParams, flags) < 0) goto error; - if (qemuMigrationParamsCheck(vm, VIR_ASYNC_JOB_MIGRATION_OUT, - migParams, mig->caps->automatic) < 0) + if (qemuMigrationParamsCheck(vm, VIR_ASYNC_JOB_MIGRATION_OUT, migParams, + mig->caps->supported, mig->caps->automatic) < 0) goto error; /* Save original migration parameters */ diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c index f441c59d67..133f1f762d 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -64,6 +64,11 @@ struct _qemuMigrationParamValue { struct _qemuMigrationParams { unsigned long long compMethods; /* bit-wise OR of qemuMigrationCompressMethod */ virBitmap *caps; + /* Optional capabilities are enabled only if supported by QEMU */ + virBitmap *optional; + /* A capability present on both optional and remoteOptional bitmaps are + * enabled only if they are supported by both sides of migration. */ + virBitmap *remoteOptional; qemuMigrationParamValue params[QEMU_MIGRATION_PARAM_LAST]; virJSONValue *blockDirtyBitmapMapping; }; @@ -141,6 +146,10 @@ struct _qemuMigrationParamsFlagMapItem { virDomainMigrateFlags flag; /* Migration capability to be enabled or disabled based on the flag. */ qemuMigrationCapability cap; + /* An optional capability to set in addition to @cap in case it is + * supported. Depending on @part either one or both sides of migration + * has to support the optional capability to be enabled. */ + qemuMigrationCapability optional; /* Bit-wise OR of qemuMigrationParty. Determines whether the capability has * to be enabled on the source, on the destination, or on both sides of * migration. */ @@ -334,6 +343,8 @@ qemuMigrationParamsNew(void) params = g_new0(qemuMigrationParams, 1); params->caps = virBitmapNew(QEMU_MIGRATION_CAP_LAST); + params->optional = virBitmapNew(QEMU_MIGRATION_CAP_LAST); + params->remoteOptional = virBitmapNew(QEMU_MIGRATION_CAP_LAST); return g_steal_pointer(¶ms); } @@ -353,6 +364,8 @@ qemuMigrationParamsFree(qemuMigrationParams *migParams) } virBitmapFree(migParams->caps); + virBitmapFree(migParams->optional); + virBitmapFree(migParams->remoteOptional); virJSONValueFree(migParams->blockDirtyBitmapMapping); g_free(migParams); } @@ -698,6 +711,13 @@ qemuMigrationParamsFromFlags(virTypedParameterPtr params, VIR_DEBUG("Enabling migration capability '%s'", qemuMigrationCapabilityTypeToString(item->cap)); ignore_value(virBitmapSetBit(migParams->caps, item->cap)); + + if (item->optional) { + qemuMigrationCapability opt = item->optional; + ignore_value(virBitmapSetBit(migParams->optional, opt)); + if (item->party != party) + ignore_value(virBitmapSetBit(migParams->remoteOptional, opt)); + } } } @@ -1290,6 +1310,7 @@ int qemuMigrationParamsCheck(virDomainObj *vm, int asyncJob, qemuMigrationParams *migParams, + virBitmap *remoteSupported, virBitmap *remoteAuto) { qemuDomainJobPrivate *jobPriv = vm->job->privateData; @@ -1303,16 +1324,42 @@ qemuMigrationParamsCheck(virDomainObj *vm, party = QEMU_MIGRATION_DESTINATION; for (cap = 0; cap < QEMU_MIGRATION_CAP_LAST; cap++) { - bool state = false; - - ignore_value(virBitmapGetBit(migParams->caps, cap, &state)); - - if (state && !qemuMigrationCapsGet(vm, cap)) { + bool enable = false; + bool optional = false; + bool remoteOpt = false; + bool remote = false; + bool qemu = qemuMigrationCapsGet(vm, cap); + + ignore_value(virBitmapGetBit(migParams->caps, cap, &enable)); + ignore_value(virBitmapGetBit(migParams->optional, cap, &optional)); + ignore_value(virBitmapGetBit(migParams->remoteOptional, cap, &remoteOpt)); + ignore_value(virBitmapGetBit(remoteSupported, cap, &remote)); + + if (enable && !qemu) { virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, _("Migration option '%1$s' is not supported by QEMU binary"), qemuMigrationCapabilityTypeToString(cap)); return -1; } + + if (optional) { + if (!qemu) { + VIR_DEBUG("Optional migration capability '%s' not supported by QEMU", + qemuMigrationCapabilityTypeToString(cap)); + optional = false; + } else if (remoteOpt && ! remote) { + VIR_DEBUG("Optional migration capability '%s' not supported " + "by the other side of migration", + qemuMigrationCapabilityTypeToString(cap)); + optional = false; + } + + if (optional) { + VIR_DEBUG("Enabling optional migration capability '%s'", + qemuMigrationCapabilityTypeToString(cap)); + ignore_value(virBitmapSetBit(migParams->caps, cap)); + } + } } for (i = 0; i < G_N_ELEMENTS(qemuMigrationParamsAlwaysOn); i++) { diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h index 44f5c2a882..115d7bc597 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -142,6 +142,7 @@ int qemuMigrationParamsCheck(virDomainObj *vm, int asyncJob, qemuMigrationParams *migParams, + virBitmap *remoteSupported, virBitmap *remoteAuto); void -- 2.43.0

On Mon, Jan 08, 2024 at 18:06:40 +0100, Jiri Denemark wrote:
We enable various migration capabilities according to the flags passed to a migration API. Missing support for such capabilities results in an error because they are required by the corresponding flag. This patch adds support for additional optional capability we may want to enable for a given API flag in case it is supported. This is useful for capabilities which are not critical for the flags to be supported, but they can make things work better in some way.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration.c | 8 ++--- src/qemu/qemu_migration_params.c | 57 +++++++++++++++++++++++++++++--- src/qemu/qemu_migration_params.h | 1 + 3 files changed, 57 insertions(+), 9 deletions(-)
[...]
@@ -1303,16 +1324,42 @@ qemuMigrationParamsCheck(virDomainObj *vm, party = QEMU_MIGRATION_DESTINATION;
for (cap = 0; cap < QEMU_MIGRATION_CAP_LAST; cap++) { - bool state = false; - - ignore_value(virBitmapGetBit(migParams->caps, cap, &state)); - - if (state && !qemuMigrationCapsGet(vm, cap)) { + bool enable = false; + bool optional = false; + bool remoteOpt = false; + bool remote = false; + bool qemu = qemuMigrationCapsGet(vm, cap); + + ignore_value(virBitmapGetBit(migParams->caps, cap, &enable)); + ignore_value(virBitmapGetBit(migParams->optional, cap, &optional)); + ignore_value(virBitmapGetBit(migParams->remoteOptional, cap, &remoteOpt)); + ignore_value(virBitmapGetBit(remoteSupported, cap, &remote)); + + if (enable && !qemu) { virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, _("Migration option '%1$s' is not supported by QEMU binary"), qemuMigrationCapabilityTypeToString(cap)); return -1; } + + if (optional) { + if (!qemu) { + VIR_DEBUG("Optional migration capability '%s' not supported by QEMU", + qemuMigrationCapabilityTypeToString(cap)); + optional = false; + } else if (remoteOpt && ! remote) {
s/! r/!r/
+ VIR_DEBUG("Optional migration capability '%s' not supported " + "by the other side of migration", + qemuMigrationCapabilityTypeToString(cap));
Reviewed-by: Peter Krempa <pkrempa@redhat.com>

During post-copy migration (once it actually switches to post-copy mode) dirty memory pages are continued to be migrated iteratively, while the destination can explicitly request a specific page to be migrated before the iterative process gets to it (which happens when a guest wants to read a page that was not migrated yet). Without the postcopy-preempt capability enabled such pages need to wait until all other pages already queued are transferred. Enabling this capability will instruct the hypervisor to create a separate migration channel for explicitly requested pages so that they can preempt the queue. This is enabled for all post-copy migration as long as the capability is supported on both sides of migration. Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration.c | 11 +++++++---- src/qemu/qemu_migration_params.c | 2 ++ src/qemu/qemu_migration_params.h | 1 + 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 5504119079..25dc16a9e9 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -5203,17 +5203,20 @@ qemuMigrationSrcPerformNative(virQEMUDriver *driver, return -1; } - if (flags & VIR_MIGRATE_PARALLEL) + /* multi-fd and postcopy-preempt require QEMU to connect to the + * destination itself */ + if (flags & (VIR_MIGRATE_PARALLEL | VIR_MIGRATE_POSTCOPY)) spec.destType = MIGRATION_DEST_SOCKET; else spec.destType = MIGRATION_DEST_CONNECT_SOCKET; spec.dest.socket.path = uribits->path; } else { - /* RDMA and multi-fd migration requires QEMU to connect to the destination - * itself. + /* RDMA, multi-fd, and postcopy-preempt migration require QEMU to + * connect to the destination itself. */ - if (STREQ(uribits->scheme, "rdma") || (flags & VIR_MIGRATE_PARALLEL)) + if (STREQ(uribits->scheme, "rdma") || + flags & (VIR_MIGRATE_PARALLEL | VIR_MIGRATE_POSTCOPY)) spec.destType = MIGRATION_DEST_HOST; else spec.destType = MIGRATION_DEST_CONNECT_HOST; diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c index 133f1f762d..9a399c7162 100644 --- a/src/qemu/qemu_migration_params.c +++ b/src/qemu/qemu_migration_params.c @@ -104,6 +104,7 @@ VIR_ENUM_IMPL(qemuMigrationCapability, "dirty-bitmaps", "return-path", "zero-copy-send", + "postcopy-preempt", ); @@ -197,6 +198,7 @@ static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = { {.match = QEMU_MIGRATION_FLAG_REQUIRED, .flag = VIR_MIGRATE_POSTCOPY, .cap = QEMU_MIGRATION_CAP_POSTCOPY, + .optional = QEMU_MIGRATION_CAP_POSTCOPY_PREEMPT, .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION}, {.match = QEMU_MIGRATION_FLAG_REQUIRED, diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h index 115d7bc597..91bc6792cd 100644 --- a/src/qemu/qemu_migration_params.h +++ b/src/qemu/qemu_migration_params.h @@ -40,6 +40,7 @@ typedef enum { QEMU_MIGRATION_CAP_BLOCK_DIRTY_BITMAPS, QEMU_MIGRATION_CAP_RETURN_PATH, QEMU_MIGRATION_CAP_ZERO_COPY_SEND, + QEMU_MIGRATION_CAP_POSTCOPY_PREEMPT, QEMU_MIGRATION_CAP_LAST } qemuMigrationCapability; -- 2.43.0

On Mon, Jan 08, 2024 at 18:06:41 +0100, Jiri Denemark wrote:
During post-copy migration (once it actually switches to post-copy mode) dirty memory pages are continued to be migrated iteratively, while the destination can explicitly request a specific page to be migrated before the iterative process gets to it (which happens when a guest wants to read a page that was not migrated yet). Without the postcopy-preempt capability enabled such pages need to wait until all other pages already queued are transferred. Enabling this capability will instruct the hypervisor to create a separate migration channel for explicitly requested pages so that they can preempt the queue.
You should state more explicitly that this requires the change in connection method from MIGRATION_DEST_CONNECT_SOCKET to MIGRATION_DEST_SOCKET
This is enabled for all post-copy migration as long as the capability is supported on both sides of migration.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- src/qemu/qemu_migration.c | 11 +++++++---- src/qemu/qemu_migration_params.c | 2 ++ src/qemu/qemu_migration_params.h | 1 + 3 files changed, 10 insertions(+), 4 deletions(-)
[...] Reviewed-by: Peter Krempa <pkrempa@redhat.com>

Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- NEWS.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/NEWS.rst b/NEWS.rst index dc40602c72..9675f12cb4 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -17,6 +17,14 @@ v10.0.0 (unreleased) * **New features** + * qemu: Enable postcopy-preempt migration capability + + Post-copy migrations are now started with ``postcopy-preempt`` + capability enabled as long as it is supported by both sides of migration. + This should enable faster migration of memory pages that the destination + tries to read before they are migrated from the source. + + * **Improvements** * **Bug fixes** -- 2.43.0

On Mon, Jan 08, 2024 at 18:06:42 +0100, Jiri Denemark wrote:
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- NEWS.rst | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/NEWS.rst b/NEWS.rst index dc40602c72..9675f12cb4 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -17,6 +17,14 @@ v10.0.0 (unreleased)
* **New features**
+ * qemu: Enable postcopy-preempt migration capability
Put postcopy-preempt into backticks as below
+ + Post-copy migrations are now started with ``postcopy-preempt`` + capability enabled as long as it is supported by both sides of migration. + This should enable faster migration of memory pages that the destination + tries to read before they are migrated from the source. + +
Too many newlines. Reviewed-by: Peter Krempa <pkrempa@redhat.com>
participants (2)
-
Jiri Denemark
-
Peter Krempa