* [PATCH V2 0/6] Live Update reboot mode
@ 2023-10-25 19:44 Steve Sistare
2023-10-25 19:44 ` [PATCH V2 1/6] migration: mode parameter Steve Sistare
` (5 more replies)
0 siblings, 6 replies; 17+ messages in thread
From: Steve Sistare @ 2023-10-25 19:44 UTC (permalink / raw)
To: qemu-devel
Cc: Juan Quintela, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange, Steve Sistare
Add a mode migration parameter that can be used to select alternate
migration algorithms. The default mode is normal, representing the
current migration algorithm, and does not need to be explicitly set.
Provide the cpr-reboot (CheckPoint and Restart) migration mode for live
update, which saves state to a file. This allows one to quit qemu, reboot
to an updated kernel, install an updated version of qemu, and resume via
the migrate-incoming command. The caller must specify a migration URI
that writes to and reads from a file, and must set the mode parameter
before invoking the migrate or migrate-incoming commands.
Unlike normal mode, the use of certain local storage options does not block
cpr-reboot mode, but the caller must not modify guest block devices between
the quit and restart. To avoid saving guest RAM to the state file, the memory
backend must be shared, and the @x-ignore-shared migration capability must
be set.
Guest RAM must be non-volatile across reboot, which can be achieved by
backing it with a dax device, or /dev/shm PKRAM as proposed in
https://lore.kernel.org/lkml/1617140178-8773-1-git-send-email-anthony.yznaga@oracle.com
but this is not enforced. The restarted qemu arguments must match those used
to initially start qemu, plus the -incoming option.
This patch series contains minimal functionality. Future patches will enhance
reboot mode by preserving vfio devices for suspended guests. They will also
add a new mode for updating qemu using the exec system call, which will keep
vfio devices and certain character devices alive.
Here is an example of updating the host kernel using reboot mode.
window 1 | window 2
|
# qemu-system-$arch -monitor stdio |
mem-path=/dev/dax0.0 ... |
QEMU 8.1.50 monitor - type 'help' for more info |
(qemu) info status |
VM status: running |
| # yum update kernel-uek
(qemu) migrate_set_capability x-ignore-shared on|
(qemu) migrate_set_parameter mode cpr-reboot |
(qemu) migrate -d file:vm.state |
(qemu) info status |
VM status: paused (postmigrate) |
(qemu) quit |
|
# systemctl kexec |
kexec_core: Starting new kernel |
... |
|
# qemu-system-$arch -monitor stdio |
mem-path=/dev/dax0.0 -incoming defer ... |
QEMU 8.1.50 monitor - type 'help' for more info |
(qemu) info status |
VM status: paused (inmigrate) |
(qemu) migrate_set_capability x-ignore-shared on|
(qemu) migrate_set_parameter mode cpr-reboot |
(qemu) migrate_incoming file:vm.state |
(qemu) info status |
VM status: running |
Changes in V2:
- moved "migration mode" code and comments to more appropriate places
- clarified the behavior of non-shared-memory backends
- split blocker patches and reverted some blockers
- added a test
Steve Sistare (6):
migration: mode parameter
migration: per-mode blockers
cpr: relax blockdev migration blockers
cpr: relax vhost migration blockers
cpr: reboot mode
tests/qtest: migration: add reboot mode test
block/parallels.c | 2 +-
block/qcow.c | 2 +-
block/vdi.c | 2 +-
block/vhdx.c | 2 +-
block/vmdk.c | 2 +-
block/vpc.c | 2 +-
block/vvfat.c | 2 +-
hw/core/qdev-properties-system.c | 14 ++++++
hw/scsi/vhost-scsi.c | 2 +-
hw/virtio/vhost.c | 2 +-
include/hw/qdev-properties-system.h | 4 ++
include/migration/blocker.h | 44 +++++++++++++++--
include/migration/misc.h | 1 +
migration/migration-hmp-cmds.c | 9 ++++
migration/migration.c | 95 ++++++++++++++++++++++++++++++++-----
migration/options.c | 21 ++++++++
migration/options.h | 1 +
qapi/migration.json | 40 ++++++++++++++--
stubs/migr-blocker.c | 10 ++++
tests/qtest/migration-test.c | 27 +++++++++++
20 files changed, 255 insertions(+), 29 deletions(-)
--
1.8.3.1
^ permalink raw reply [flat|nested] 17+ messages in thread
* [PATCH V2 1/6] migration: mode parameter
2023-10-25 19:44 [PATCH V2 0/6] Live Update reboot mode Steve Sistare
@ 2023-10-25 19:44 ` Steve Sistare
2023-10-31 13:17 ` Juan Quintela
2023-10-25 19:44 ` [PATCH V2 2/6] migration: per-mode blockers Steve Sistare
` (4 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Steve Sistare @ 2023-10-25 19:44 UTC (permalink / raw)
To: qemu-devel
Cc: Juan Quintela, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange, Steve Sistare
Create a mode migration parameter that can be used to select alternate
migration algorithms. The default mode is normal, representing the
current migration algorithm, and does not need to be explicitly set.
No functional change until a new mode is added, except that the mode is
shown by the 'info migrate' command.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
---
hw/core/qdev-properties-system.c | 14 ++++++++++++++
include/hw/qdev-properties-system.h | 4 ++++
include/migration/misc.h | 1 +
migration/migration-hmp-cmds.c | 9 +++++++++
migration/options.c | 21 +++++++++++++++++++++
migration/options.h | 1 +
qapi/migration.json | 27 ++++++++++++++++++++++++---
7 files changed, 74 insertions(+), 3 deletions(-)
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 6883406..07a848d 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -673,6 +673,20 @@ const PropertyInfo qdev_prop_multifd_compression = {
.set_default_value = qdev_propinfo_set_default_value_enum,
};
+/* --- MigMode --- */
+
+QEMU_BUILD_BUG_ON(sizeof(MigMode) != sizeof(int));
+
+const PropertyInfo qdev_prop_mig_mode = {
+ .name = "MigMode",
+ .description = "mig_mode values, "
+ "normal",
+ .enum_table = &MigMode_lookup,
+ .get = qdev_propinfo_get_enum,
+ .set = qdev_propinfo_set_enum,
+ .set_default_value = qdev_propinfo_set_default_value_enum,
+};
+
/* --- Reserved Region --- */
/*
diff --git a/include/hw/qdev-properties-system.h b/include/hw/qdev-properties-system.h
index 0ac327a..1418801 100644
--- a/include/hw/qdev-properties-system.h
+++ b/include/hw/qdev-properties-system.h
@@ -7,6 +7,7 @@ extern const PropertyInfo qdev_prop_chr;
extern const PropertyInfo qdev_prop_macaddr;
extern const PropertyInfo qdev_prop_reserved_region;
extern const PropertyInfo qdev_prop_multifd_compression;
+extern const PropertyInfo qdev_prop_mig_mode;
extern const PropertyInfo qdev_prop_losttickpolicy;
extern const PropertyInfo qdev_prop_blockdev_on_error;
extern const PropertyInfo qdev_prop_bios_chs_trans;
@@ -41,6 +42,9 @@ extern const PropertyInfo qdev_prop_pcie_link_width;
#define DEFINE_PROP_MULTIFD_COMPRESSION(_n, _s, _f, _d) \
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_multifd_compression, \
MultiFDCompression)
+#define DEFINE_PROP_MIG_MODE(_n, _s, _f, _d) \
+ DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_mig_mode, \
+ MigMode)
#define DEFINE_PROP_LOSTTICKPOLICY(_n, _s, _f, _d) \
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_losttickpolicy, \
LostTickPolicy)
diff --git a/include/migration/misc.h b/include/migration/misc.h
index 673ac49..1bc8902 100644
--- a/include/migration/misc.h
+++ b/include/migration/misc.h
@@ -15,6 +15,7 @@
#define MIGRATION_MISC_H
#include "qemu/notify.h"
+#include "qapi/qapi-types-migration.h"
#include "qapi/qapi-types-net.h"
/* migration/ram.c */
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index a82597f..35e57b8 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -387,6 +387,11 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
monitor_printf(mon, "%s: %" PRIu64 " MB/s\n",
MigrationParameter_str(MIGRATION_PARAMETER_VCPU_DIRTY_LIMIT),
params->vcpu_dirty_limit);
+
+ assert(params->has_mode);
+ monitor_printf(mon, "%s: %s\n",
+ MigrationParameter_str(MIGRATION_PARAMETER_MODE),
+ qapi_enum_lookup(&MigMode_lookup, params->mode));
}
qapi_free_MigrationParameters(params);
@@ -661,6 +666,10 @@ void hmp_migrate_set_parameter(Monitor *mon, const QDict *qdict)
p->has_vcpu_dirty_limit = true;
visit_type_size(v, param, &p->vcpu_dirty_limit, &err);
break;
+ case MIGRATION_PARAMETER_MODE:
+ p->has_mode = true;
+ visit_type_MigMode(v, param, &p->mode, &err);
+ break;
default:
assert(0);
}
diff --git a/migration/options.c b/migration/options.c
index 42fb818..cbede3f 100644
--- a/migration/options.c
+++ b/migration/options.c
@@ -175,6 +175,9 @@ Property migration_properties[] = {
DEFINE_PROP_UINT64("vcpu-dirty-limit", MigrationState,
parameters.vcpu_dirty_limit,
DEFAULT_MIGRATE_VCPU_DIRTY_LIMIT),
+ DEFINE_PROP_MIG_MODE("mode", MigrationState,
+ parameters.mode,
+ MIG_MODE_NORMAL),
/* Migration capabilities */
DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE),
@@ -803,6 +806,13 @@ uint64_t migrate_max_postcopy_bandwidth(void)
return s->parameters.max_postcopy_bandwidth;
}
+MigMode migrate_mode(void)
+{
+ MigrationState *s = migrate_get_current();
+
+ return s->parameters.mode;
+}
+
int migrate_multifd_channels(void)
{
MigrationState *s = migrate_get_current();
@@ -975,6 +985,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error **errp)
params->x_vcpu_dirty_limit_period = s->parameters.x_vcpu_dirty_limit_period;
params->has_vcpu_dirty_limit = true;
params->vcpu_dirty_limit = s->parameters.vcpu_dirty_limit;
+ params->has_mode = true;
+ params->mode = s->parameters.mode;
return params;
}
@@ -1010,6 +1022,7 @@ void migrate_params_init(MigrationParameters *params)
params->has_announce_step = true;
params->has_x_vcpu_dirty_limit_period = true;
params->has_vcpu_dirty_limit = true;
+ params->has_mode = true;
}
/*
@@ -1307,6 +1320,10 @@ static void migrate_params_test_apply(MigrateSetParameters *params,
if (params->has_vcpu_dirty_limit) {
dest->vcpu_dirty_limit = params->vcpu_dirty_limit;
}
+
+ if (params->has_mode) {
+ dest->mode = params->mode;
+ }
}
static void migrate_params_apply(MigrateSetParameters *params, Error **errp)
@@ -1437,6 +1454,10 @@ static void migrate_params_apply(MigrateSetParameters *params, Error **errp)
if (params->has_vcpu_dirty_limit) {
s->parameters.vcpu_dirty_limit = params->vcpu_dirty_limit;
}
+
+ if (params->has_mode) {
+ s->parameters.mode = params->mode;
+ }
}
void qmp_migrate_set_parameters(MigrateSetParameters *params, Error **errp)
diff --git a/migration/options.h b/migration/options.h
index 237f2d6..246c160 100644
--- a/migration/options.h
+++ b/migration/options.h
@@ -83,6 +83,7 @@ uint8_t migrate_max_cpu_throttle(void);
uint64_t migrate_max_bandwidth(void);
uint64_t migrate_avail_switchover_bandwidth(void);
uint64_t migrate_max_postcopy_bandwidth(void);
+MigMode migrate_mode(void);
int migrate_multifd_channels(void);
MultiFDCompression migrate_multifd_compression(void);
int migrate_multifd_zlib_level(void);
diff --git a/qapi/migration.json b/qapi/migration.json
index db3df12..f99904e 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -616,6 +616,15 @@
{ 'name': 'zstd', 'if': 'CONFIG_ZSTD' } ] }
##
+# @MigMode:
+#
+# @normal: the original form of migration. (since 8.2)
+#
+##
+{ 'enum': 'MigMode',
+ 'data': [ 'normal' ] }
+
+##
# @BitmapMigrationBitmapAliasTransform:
#
# @persistent: If present, the bitmap will be made persistent or
@@ -833,6 +842,9 @@
# @vcpu-dirty-limit: Dirtyrate limit (MB/s) during live migration.
# Defaults to 1. (Since 8.1)
#
+# @mode: Migration mode. See description in @MigMode. Default is 'normal'.
+# (Since 8.2)
+#
# Features:
#
# @unstable: Members @x-checkpoint-delay and @x-vcpu-dirty-limit-period
@@ -857,7 +869,8 @@
'multifd-zlib-level', 'multifd-zstd-level',
'block-bitmap-mapping',
{ 'name': 'x-vcpu-dirty-limit-period', 'features': ['unstable'] },
- 'vcpu-dirty-limit'] }
+ 'vcpu-dirty-limit',
+ 'mode'] }
##
# @MigrateSetParameters:
@@ -1009,6 +1022,9 @@
# @vcpu-dirty-limit: Dirtyrate limit (MB/s) during live migration.
# Defaults to 1. (Since 8.1)
#
+# @mode: Migration mode. See description in @MigMode. Default is 'normal'.
+# (Since 8.2)
+#
# Features:
#
# @unstable: Members @x-checkpoint-delay and @x-vcpu-dirty-limit-period
@@ -1051,7 +1067,8 @@
'*block-bitmap-mapping': [ 'BitmapMigrationNodeAlias' ],
'*x-vcpu-dirty-limit-period': { 'type': 'uint64',
'features': [ 'unstable' ] },
- '*vcpu-dirty-limit': 'uint64'} }
+ '*vcpu-dirty-limit': 'uint64',
+ '*mode': 'MigMode'} }
##
# @migrate-set-parameters:
@@ -1223,6 +1240,9 @@
# @vcpu-dirty-limit: Dirtyrate limit (MB/s) during live migration.
# Defaults to 1. (Since 8.1)
#
+# @mode: Migration mode. See description in @MigMode. Default is 'normal'.
+# (Since 8.2)
+#
# Features:
#
# @unstable: Members @x-checkpoint-delay and @x-vcpu-dirty-limit-period
@@ -1262,7 +1282,8 @@
'*block-bitmap-mapping': [ 'BitmapMigrationNodeAlias' ],
'*x-vcpu-dirty-limit-period': { 'type': 'uint64',
'features': [ 'unstable' ] },
- '*vcpu-dirty-limit': 'uint64'} }
+ '*vcpu-dirty-limit': 'uint64',
+ '*mode': 'MigMode'} }
##
# @query-migrate-parameters:
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH V2 2/6] migration: per-mode blockers
2023-10-25 19:44 [PATCH V2 0/6] Live Update reboot mode Steve Sistare
2023-10-25 19:44 ` [PATCH V2 1/6] migration: mode parameter Steve Sistare
@ 2023-10-25 19:44 ` Steve Sistare
2023-10-25 19:44 ` [PATCH V2 3/6] cpr: relax blockdev migration blockers Steve Sistare
` (3 subsequent siblings)
5 siblings, 0 replies; 17+ messages in thread
From: Steve Sistare @ 2023-10-25 19:44 UTC (permalink / raw)
To: qemu-devel
Cc: Juan Quintela, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange, Steve Sistare
Extend the blocker interface so that a blocker can be registered for
one or more migration modes. The existing interfaces register a
blocker for all modes, and the new interfaces take a varargs list
of modes.
Internally, maintain a separate blocker list per mode. The same Error
object may be added to multiple lists. When a block is deleted, it is
removed from every list, and the Error is freed.
No functional change until a new mode is added.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
---
include/migration/blocker.h | 44 +++++++++++++++++++--
migration/migration.c | 95 ++++++++++++++++++++++++++++++++++++++-------
stubs/migr-blocker.c | 10 +++++
3 files changed, 132 insertions(+), 17 deletions(-)
diff --git a/include/migration/blocker.h b/include/migration/blocker.h
index b048f30..a687ac0 100644
--- a/include/migration/blocker.h
+++ b/include/migration/blocker.h
@@ -14,8 +14,12 @@
#ifndef MIGRATION_BLOCKER_H
#define MIGRATION_BLOCKER_H
+#include "qapi/qapi-types-migration.h"
+
+#define MIG_MODE_ALL MIG_MODE__MAX
+
/**
- * @migrate_add_blocker - prevent migration from proceeding
+ * @migrate_add_blocker - prevent all modes of migration from proceeding
*
* @reasonp - address of an error to be returned whenever migration is attempted
*
@@ -30,8 +34,8 @@
int migrate_add_blocker(Error **reasonp, Error **errp);
/**
- * @migrate_add_blocker_internal - prevent migration from proceeding without
- * only-migrate implications
+ * @migrate_add_blocker_internal - prevent all modes of migration from
+ * proceeding, but ignore -only-migratable
*
* @reasonp - address of an error to be returned whenever migration is attempted
*
@@ -50,7 +54,7 @@ int migrate_add_blocker(Error **reasonp, Error **errp);
int migrate_add_blocker_internal(Error **reasonp, Error **errp);
/**
- * @migrate_del_blocker - remove a blocking error from migration and free it.
+ * @migrate_del_blocker - remove a migration blocker from all modes and free it.
*
* @reasonp - address of the error blocking migration
*
@@ -58,4 +62,36 @@ int migrate_add_blocker_internal(Error **reasonp, Error **errp);
*/
void migrate_del_blocker(Error **reasonp);
+/**
+ * @migrate_add_blocker_normal - prevent normal migration mode from proceeding
+ *
+ * @reasonp - address of an error to be returned whenever migration is attempted
+ *
+ * @errp - [out] The reason (if any) we cannot block migration right now.
+ *
+ * @returns - 0 on success, -EBUSY/-EACCES on failure, with errp set.
+ *
+ * *@reasonp is freed and set to NULL if failure is returned.
+ * On success, the caller must not free @reasonp, except by
+ * calling migrate_del_blocker.
+ */
+int migrate_add_blocker_normal(Error **reasonp, Error **errp);
+
+/**
+ * @migrate_add_blocker_modes - prevent some modes of migration from proceeding
+ *
+ * @reasonp - address of an error to be returned whenever migration is attempted
+ *
+ * @errp - [out] The reason (if any) we cannot block migration right now.
+ *
+ * @mode - one or more migration modes to be blocked. The list is terminated
+ * by -1 or MIG_MODE_ALL. For the latter, all modes are blocked.
+ *
+ * @returns - 0 on success, -EBUSY/-EACCES on failure, with errp set.
+ *
+ * *@reasonp is freed and set to NULL if failure is returned.
+ * On success, the caller must not free *@reasonp before the blocker is removed.
+ */
+int migrate_add_blocker_modes(Error **reasonp, Error **errp, MigMode mode, ...);
+
#endif
diff --git a/migration/migration.c b/migration/migration.c
index 67547eb..b8b54e6 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -92,7 +92,7 @@ enum mig_rp_message_type {
static MigrationState *current_migration;
static MigrationIncomingState *current_incoming;
-static GSList *migration_blockers;
+static GSList *migration_blockers[MIG_MODE__MAX];
static bool migration_object_check(MigrationState *ms, Error **errp);
static int migration_maybe_pause(MigrationState *s,
@@ -1011,7 +1011,7 @@ static void fill_source_migration_info(MigrationInfo *info)
{
MigrationState *s = migrate_get_current();
int state = qatomic_read(&s->state);
- GSList *cur_blocker = migration_blockers;
+ GSList *cur_blocker = migration_blockers[migrate_mode()];
info->blocked_reasons = NULL;
@@ -1475,38 +1475,105 @@ int migrate_init(MigrationState *s, Error **errp)
return 0;
}
-int migrate_add_blocker_internal(Error **reasonp, Error **errp)
+static bool is_busy(Error **reasonp, Error **errp)
{
+ ERRP_GUARD();
+
/* Snapshots are similar to migrations, so check RUN_STATE_SAVE_VM too. */
if (runstate_check(RUN_STATE_SAVE_VM) || !migration_is_idle()) {
error_propagate_prepend(errp, *reasonp,
"disallowing migration blocker "
"(migration/snapshot in progress) for: ");
*reasonp = NULL;
- return -EBUSY;
+ return true;
}
-
- migration_blockers = g_slist_prepend(migration_blockers, *reasonp);
- return 0;
+ return false;
}
-int migrate_add_blocker(Error **reasonp, Error **errp)
+static bool is_only_migratable(Error **reasonp, Error **errp, int modes)
{
- if (only_migratable) {
+ ERRP_GUARD();
+
+ if (only_migratable && (modes & BIT(MIG_MODE_NORMAL))) {
error_propagate_prepend(errp, *reasonp,
"disallowing migration blocker "
"(--only-migratable) for: ");
*reasonp = NULL;
+ return true;
+ }
+ return false;
+}
+
+static int get_modes(MigMode mode, va_list ap)
+{
+ int modes = 0;
+
+ while (mode != -1 && mode != MIG_MODE_ALL) {
+ assert(mode >= MIG_MODE_NORMAL && mode < MIG_MODE__MAX);
+ modes |= BIT(mode);
+ mode = va_arg(ap, MigMode);
+ }
+ if (mode == MIG_MODE_ALL) {
+ modes = BIT(MIG_MODE__MAX) - 1;
+ }
+ return modes;
+}
+
+static int add_blockers(Error **reasonp, Error **errp, int modes)
+{
+ for (MigMode mode = 0; mode < MIG_MODE__MAX; mode++) {
+ if (modes & BIT(mode)) {
+ migration_blockers[mode] = g_slist_prepend(migration_blockers[mode],
+ *reasonp);
+ }
+ }
+ return 0;
+}
+
+int migrate_add_blocker(Error **reasonp, Error **errp)
+{
+ return migrate_add_blocker_modes(reasonp, errp, MIG_MODE_ALL);
+}
+
+int migrate_add_blocker_normal(Error **reasonp, Error **errp)
+{
+ return migrate_add_blocker_modes(reasonp, errp, MIG_MODE_NORMAL, -1);
+}
+
+int migrate_add_blocker_modes(Error **reasonp, Error **errp, MigMode mode, ...)
+{
+ int modes;
+ va_list ap;
+
+ va_start(ap, mode);
+ modes = get_modes(mode, ap);
+ va_end(ap);
+
+ if (is_only_migratable(reasonp, errp, modes)) {
return -EACCES;
+ } else if (is_busy(reasonp, errp)) {
+ return -EBUSY;
}
+ return add_blockers(reasonp, errp, modes);
+}
- return migrate_add_blocker_internal(reasonp, errp);
+int migrate_add_blocker_internal(Error **reasonp, Error **errp)
+{
+ int modes = BIT(MIG_MODE__MAX) - 1;
+
+ if (is_busy(reasonp, errp)) {
+ return -EBUSY;
+ }
+ return add_blockers(reasonp, errp, modes);
}
void migrate_del_blocker(Error **reasonp)
{
if (*reasonp) {
- migration_blockers = g_slist_remove(migration_blockers, *reasonp);
+ for (MigMode mode = 0; mode < MIG_MODE__MAX; mode++) {
+ migration_blockers[mode] = g_slist_remove(migration_blockers[mode],
+ *reasonp);
+ }
error_free(*reasonp);
*reasonp = NULL;
}
@@ -1602,12 +1669,14 @@ void qmp_migrate_pause(Error **errp)
bool migration_is_blocked(Error **errp)
{
+ GSList *blockers = migration_blockers[migrate_mode()];
+
if (qemu_savevm_state_blocked(errp)) {
return true;
}
- if (migration_blockers) {
- error_propagate(errp, error_copy(migration_blockers->data));
+ if (blockers) {
+ error_propagate(errp, error_copy(blockers->data));
return true;
}
diff --git a/stubs/migr-blocker.c b/stubs/migr-blocker.c
index 17a5dbf..11cbff2 100644
--- a/stubs/migr-blocker.c
+++ b/stubs/migr-blocker.c
@@ -6,6 +6,16 @@ int migrate_add_blocker(Error **reasonp, Error **errp)
return 0;
}
+int migrate_add_blocker_normal(Error **reasonp, Error **errp)
+{
+ return 0;
+}
+
+int migrate_add_blocker_modes(Error **reasonp, Error **errp, MigMode mode, ...)
+{
+ return 0;
+}
+
void migrate_del_blocker(Error **reasonp)
{
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH V2 3/6] cpr: relax blockdev migration blockers
2023-10-25 19:44 [PATCH V2 0/6] Live Update reboot mode Steve Sistare
2023-10-25 19:44 ` [PATCH V2 1/6] migration: mode parameter Steve Sistare
2023-10-25 19:44 ` [PATCH V2 2/6] migration: per-mode blockers Steve Sistare
@ 2023-10-25 19:44 ` Steve Sistare
2023-10-31 15:41 ` Peter Xu
2023-10-25 19:44 ` [PATCH V2 4/6] cpr: relax vhost " Steve Sistare
` (2 subsequent siblings)
5 siblings, 1 reply; 17+ messages in thread
From: Steve Sistare @ 2023-10-25 19:44 UTC (permalink / raw)
To: qemu-devel
Cc: Juan Quintela, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange, Steve Sistare
Some blockdevs block migration because they do not support sharing across
hosts and/or do not support dirty bitmaps. These prohibitions do not apply
if the old and new qemu processes do not run concurrently, and if new qemu
starts on the same host as old, which is the case for cpr. Narrow the scope
of these blockers so they only apply to normal mode. They will not block
cpr modes when they are added in subsequent patches.
No functional change until a new mode is added.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
---
block/parallels.c | 2 +-
block/qcow.c | 2 +-
block/vdi.c | 2 +-
block/vhdx.c | 2 +-
block/vmdk.c | 2 +-
block/vpc.c | 2 +-
block/vvfat.c | 2 +-
7 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/block/parallels.c b/block/parallels.c
index 1697a2e..8a520db 100644
--- a/block/parallels.c
+++ b/block/parallels.c
@@ -1369,7 +1369,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
bdrv_get_device_or_node_name(bs));
bdrv_graph_rdunlock_main_loop();
- ret = migrate_add_blocker(&s->migration_blocker, errp);
+ ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
if (ret < 0) {
error_setg(errp, "Migration blocker error");
goto fail;
diff --git a/block/qcow.c b/block/qcow.c
index fdd4c83..eab68e3 100644
--- a/block/qcow.c
+++ b/block/qcow.c
@@ -307,7 +307,7 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
bdrv_get_device_or_node_name(bs));
bdrv_graph_rdunlock_main_loop();
- ret = migrate_add_blocker(&s->migration_blocker, errp);
+ ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
if (ret < 0) {
goto fail;
}
diff --git a/block/vdi.c b/block/vdi.c
index fd7e365..c647d72 100644
--- a/block/vdi.c
+++ b/block/vdi.c
@@ -498,7 +498,7 @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
bdrv_get_device_or_node_name(bs));
bdrv_graph_rdunlock_main_loop();
- ret = migrate_add_blocker(&s->migration_blocker, errp);
+ ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
if (ret < 0) {
goto fail_free_bmap;
}
diff --git a/block/vhdx.c b/block/vhdx.c
index e37f8c0..a9d0874 100644
--- a/block/vhdx.c
+++ b/block/vhdx.c
@@ -1096,7 +1096,7 @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
error_setg(&s->migration_blocker, "The vhdx format used by node '%s' "
"does not support live migration",
bdrv_get_device_or_node_name(bs));
- ret = migrate_add_blocker(&s->migration_blocker, errp);
+ ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
if (ret < 0) {
goto fail;
}
diff --git a/block/vmdk.c b/block/vmdk.c
index 1335d39..85864b8 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -1386,7 +1386,7 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
error_setg(&s->migration_blocker, "The vmdk format used by node '%s' "
"does not support live migration",
bdrv_get_device_or_node_name(bs));
- ret = migrate_add_blocker(&s->migration_blocker, errp);
+ ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
if (ret < 0) {
goto fail;
}
diff --git a/block/vpc.c b/block/vpc.c
index c30cf86..aa1a48a 100644
--- a/block/vpc.c
+++ b/block/vpc.c
@@ -452,7 +452,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
bdrv_get_device_or_node_name(bs));
bdrv_graph_rdunlock_main_loop();
- ret = migrate_add_blocker(&s->migration_blocker, errp);
+ ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
if (ret < 0) {
goto fail;
}
diff --git a/block/vvfat.c b/block/vvfat.c
index 266e036..9d050ba 100644
--- a/block/vvfat.c
+++ b/block/vvfat.c
@@ -1268,7 +1268,7 @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
"The vvfat (rw) format used by node '%s' "
"does not support live migration",
bdrv_get_device_or_node_name(bs));
- ret = migrate_add_blocker(&s->migration_blocker, errp);
+ ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
if (ret < 0) {
goto fail;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH V2 4/6] cpr: relax vhost migration blockers
2023-10-25 19:44 [PATCH V2 0/6] Live Update reboot mode Steve Sistare
` (2 preceding siblings ...)
2023-10-25 19:44 ` [PATCH V2 3/6] cpr: relax blockdev migration blockers Steve Sistare
@ 2023-10-25 19:44 ` Steve Sistare
2023-10-31 15:44 ` Peter Xu
2023-10-25 19:44 ` [PATCH V2 5/6] cpr: reboot mode Steve Sistare
2023-10-25 19:44 ` [PATCH V2 6/6] tests/qtest: migration: add reboot mode test Steve Sistare
5 siblings, 1 reply; 17+ messages in thread
From: Steve Sistare @ 2023-10-25 19:44 UTC (permalink / raw)
To: qemu-devel
Cc: Juan Quintela, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange, Steve Sistare
vhost blocks migration if logging is not supported to track dirty
memory, and vhost-user blocks it if the log cannot be saved to a shm fd.
vhost-vdpa blocks migration if both hosts do not support all the device's
features using a shadow VQ, for tracking requests and dirty memory.
vhost-scsi blocks migration if storage cannot be shared across hosts,
or if state cannot be migrated.
None of these conditions apply if the old and new qemu processes do
not run concurrently, and if new qemu starts on the same host as old,
which is the case for cpr.
Narrow the scope of these blockers so they only apply to normal mode.
They will not block cpr modes when they are added in subsequent patches.
No functional change until a new mode is added.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
---
hw/scsi/vhost-scsi.c | 2 +-
hw/virtio/vhost.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
index 14e23cc..bf528d5 100644
--- a/hw/scsi/vhost-scsi.c
+++ b/hw/scsi/vhost-scsi.c
@@ -208,7 +208,7 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
"When external environment supports it (Orchestrator migrates "
"target SCSI device state or use shared storage over network), "
"set 'migratable' property to true to enable migration.");
- if (migrate_add_blocker(&vsc->migration_blocker, errp) < 0) {
+ if (migrate_add_blocker_normal(&vsc->migration_blocker, errp) < 0) {
goto free_virtio;
}
}
diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
index d737671..f5e9625 100644
--- a/hw/virtio/vhost.c
+++ b/hw/virtio/vhost.c
@@ -1527,7 +1527,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
}
if (hdev->migration_blocker != NULL) {
- r = migrate_add_blocker(&hdev->migration_blocker, errp);
+ r = migrate_add_blocker_normal(&hdev->migration_blocker, errp);
if (r < 0) {
goto fail_busyloop;
}
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH V2 5/6] cpr: reboot mode
2023-10-25 19:44 [PATCH V2 0/6] Live Update reboot mode Steve Sistare
` (3 preceding siblings ...)
2023-10-25 19:44 ` [PATCH V2 4/6] cpr: relax vhost " Steve Sistare
@ 2023-10-25 19:44 ` Steve Sistare
2023-10-31 13:21 ` Juan Quintela
2023-10-25 19:44 ` [PATCH V2 6/6] tests/qtest: migration: add reboot mode test Steve Sistare
5 siblings, 1 reply; 17+ messages in thread
From: Steve Sistare @ 2023-10-25 19:44 UTC (permalink / raw)
To: qemu-devel
Cc: Juan Quintela, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange, Steve Sistare
Add the cpr-reboot migration mode. Usage:
$ qemu-system-$arch -monitor stdio ...
QEMU 8.1.50 monitor - type 'help' for more information
(qemu) migrate_set_capability x-ignore-shared on
(qemu) migrate_set_parameter mode cpr-reboot
(qemu) migrate -d file:vm.state
(qemu) info status
VM status: paused (postmigrate)
(qemu) quit
$ qemu-system-$arch -monitor stdio -incoming defer ...
QEMU 8.1.50 monitor - type 'help' for more information
(qemu) migrate_set_capability x-ignore-shared on
(qemu) migrate_set_parameter mode cpr-reboot
(qemu) migrate_incoming file:vm.state
(qemu) info status
VM status: running
In this mode, the migrate command saves state to a file, allowing one
to quit qemu, reboot to an updated kernel, and restart an updated version
of qemu. The caller must specify a migration URI that writes to and reads
from a file. Unlike normal mode, the use of certain local storage options
does not block the migration, but the caller must not modify guest block
devices between the quit and restart. To avoid saving guest RAM to the
file, the memory backend must be shared, and the @x-ignore-shared migration
capability must be set. Guest RAM must be non-volatile across reboot, such
as by backing it with a dax device, but this is not enforced. The restarted
qemu arguments must match those used to initially start qemu, plus the
-incoming option.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
---
hw/core/qdev-properties-system.c | 2 +-
qapi/migration.json | 15 ++++++++++++++-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 07a848d..d961404 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -680,7 +680,7 @@ QEMU_BUILD_BUG_ON(sizeof(MigMode) != sizeof(int));
const PropertyInfo qdev_prop_mig_mode = {
.name = "MigMode",
.description = "mig_mode values, "
- "normal",
+ "normal,cpr-reboot",
.enum_table = &MigMode_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
diff --git a/qapi/migration.json b/qapi/migration.json
index f99904e..795182f 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -620,9 +620,22 @@
#
# @normal: the original form of migration. (since 8.2)
#
+# @cpr-reboot: The migrate command saves state to a file, allowing one to
+# quit qemu, reboot to an updated kernel, and restart an updated
+# version of qemu. The caller must specify a migration URI
+# that writes to and reads from a file. Unlike normal mode,
+# the use of certain local storage options does not block the
+# migration, but the caller must not modify guest block devices
+# between the quit and restart. To avoid saving guest RAM to the
+# file, the memory backend must be shared, and the @x-ignore-shared
+# migration capability must be set. Guest RAM must be non-volatile
+# across reboot, such as by backing it with a dax device, but this
+# is not enforced. The restarted qemu arguments must match those
+# used to initially start qemu, plus the -incoming option.
+# (since 8.2)
##
{ 'enum': 'MigMode',
- 'data': [ 'normal' ] }
+ 'data': [ 'normal', 'cpr-reboot' ] }
##
# @BitmapMigrationBitmapAliasTransform:
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH V2 6/6] tests/qtest: migration: add reboot mode test
2023-10-25 19:44 [PATCH V2 0/6] Live Update reboot mode Steve Sistare
` (4 preceding siblings ...)
2023-10-25 19:44 ` [PATCH V2 5/6] cpr: reboot mode Steve Sistare
@ 2023-10-25 19:44 ` Steve Sistare
2023-10-31 13:19 ` Juan Quintela
2023-11-01 13:34 ` Fabiano Rosas
5 siblings, 2 replies; 17+ messages in thread
From: Steve Sistare @ 2023-10-25 19:44 UTC (permalink / raw)
To: qemu-devel
Cc: Juan Quintela, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange, Steve Sistare
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
---
tests/qtest/migration-test.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
index e1c1105..de29fc5 100644
--- a/tests/qtest/migration-test.c
+++ b/tests/qtest/migration-test.c
@@ -2001,6 +2001,31 @@ static void test_precopy_file_offset_bad(void)
test_file_common(&args, false);
}
+static void *test_mode_reboot_start(QTestState *from, QTestState *to)
+{
+ migrate_set_parameter_str(from, "mode", "cpr-reboot");
+ migrate_set_parameter_str(to, "mode", "cpr-reboot");
+
+ migrate_set_capability(from, "x-ignore-shared", true);
+ migrate_set_capability(to, "x-ignore-shared", true);
+
+ return NULL;
+}
+
+static void test_mode_reboot(void)
+{
+ g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
+ FILE_TEST_FILENAME);
+ MigrateCommon args = {
+ .start.use_shmem = true,
+ .connect_uri = uri,
+ .listen_uri = "defer",
+ .start_hook = test_mode_reboot_start
+ };
+
+ test_file_common(&args, true);
+}
+
static void test_precopy_tcp_plain(void)
{
MigrateCommon args = {
@@ -3056,6 +3081,8 @@ int main(int argc, char **argv)
qtest_add_func("/migration/precopy/file/offset/bad",
test_precopy_file_offset_bad);
+ qtest_add_func("/migration/mode/reboot", test_mode_reboot);
+
#ifdef CONFIG_GNUTLS
qtest_add_func("/migration/precopy/unix/tls/psk",
test_precopy_unix_tls_psk);
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [PATCH V2 5/6] cpr: reboot mode
2023-10-26 20:08 [PATCH V2 0/6] Live Update reboot mode Steve Sistare
@ 2023-10-26 20:08 ` Steve Sistare
0 siblings, 0 replies; 17+ messages in thread
From: Steve Sistare @ 2023-10-26 20:08 UTC (permalink / raw)
To: qemu-devel
Cc: Juan Quintela, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange, Steve Sistare
Add the cpr-reboot migration mode. Usage:
$ qemu-system-$arch -monitor stdio ...
QEMU 8.1.50 monitor - type 'help' for more information
(qemu) migrate_set_capability x-ignore-shared on
(qemu) migrate_set_parameter mode cpr-reboot
(qemu) migrate -d file:vm.state
(qemu) info status
VM status: paused (postmigrate)
(qemu) quit
$ qemu-system-$arch -monitor stdio -incoming defer ...
QEMU 8.1.50 monitor - type 'help' for more information
(qemu) migrate_set_capability x-ignore-shared on
(qemu) migrate_set_parameter mode cpr-reboot
(qemu) migrate_incoming file:vm.state
(qemu) info status
VM status: running
In this mode, the migrate command saves state to a file, allowing one
to quit qemu, reboot to an updated kernel, and restart an updated version
of qemu. The caller must specify a migration URI that writes to and reads
from a file. Unlike normal mode, the use of certain local storage options
does not block the migration, but the caller must not modify guest block
devices between the quit and restart. To avoid saving guest RAM to the
file, the memory backend must be shared, and the @x-ignore-shared migration
capability must be set. Guest RAM must be non-volatile across reboot, such
as by backing it with a dax device, but this is not enforced. The restarted
qemu arguments must match those used to initially start qemu, plus the
-incoming option.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
---
hw/core/qdev-properties-system.c | 2 +-
qapi/migration.json | 15 ++++++++++++++-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c
index 07a848d..d961404 100644
--- a/hw/core/qdev-properties-system.c
+++ b/hw/core/qdev-properties-system.c
@@ -680,7 +680,7 @@ QEMU_BUILD_BUG_ON(sizeof(MigMode) != sizeof(int));
const PropertyInfo qdev_prop_mig_mode = {
.name = "MigMode",
.description = "mig_mode values, "
- "normal",
+ "normal,cpr-reboot",
.enum_table = &MigMode_lookup,
.get = qdev_propinfo_get_enum,
.set = qdev_propinfo_set_enum,
diff --git a/qapi/migration.json b/qapi/migration.json
index f99904e..795182f 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -620,9 +620,22 @@
#
# @normal: the original form of migration. (since 8.2)
#
+# @cpr-reboot: The migrate command saves state to a file, allowing one to
+# quit qemu, reboot to an updated kernel, and restart an updated
+# version of qemu. The caller must specify a migration URI
+# that writes to and reads from a file. Unlike normal mode,
+# the use of certain local storage options does not block the
+# migration, but the caller must not modify guest block devices
+# between the quit and restart. To avoid saving guest RAM to the
+# file, the memory backend must be shared, and the @x-ignore-shared
+# migration capability must be set. Guest RAM must be non-volatile
+# across reboot, such as by backing it with a dax device, but this
+# is not enforced. The restarted qemu arguments must match those
+# used to initially start qemu, plus the -incoming option.
+# (since 8.2)
##
{ 'enum': 'MigMode',
- 'data': [ 'normal' ] }
+ 'data': [ 'normal', 'cpr-reboot' ] }
##
# @BitmapMigrationBitmapAliasTransform:
--
1.8.3.1
^ permalink raw reply related [flat|nested] 17+ messages in thread
* Re: [PATCH V2 1/6] migration: mode parameter
2023-10-25 19:44 ` [PATCH V2 1/6] migration: mode parameter Steve Sistare
@ 2023-10-31 13:17 ` Juan Quintela
0 siblings, 0 replies; 17+ messages in thread
From: Juan Quintela @ 2023-10-31 13:17 UTC (permalink / raw)
To: Steve Sistare
Cc: qemu-devel, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange
Steve Sistare <steven.sistare@oracle.com> wrote:
> Create a mode migration parameter that can be used to select alternate
> migration algorithms. The default mode is normal, representing the
> current migration algorithm, and does not need to be explicitly set.
>
> No functional change until a new mode is added, except that the mode is
> shown by the 'info migrate' command.
>
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
As nobody complained for this on v1, I will consider it done.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH V2 6/6] tests/qtest: migration: add reboot mode test
2023-10-25 19:44 ` [PATCH V2 6/6] tests/qtest: migration: add reboot mode test Steve Sistare
@ 2023-10-31 13:19 ` Juan Quintela
2023-11-01 13:34 ` Fabiano Rosas
1 sibling, 0 replies; 17+ messages in thread
From: Juan Quintela @ 2023-10-31 13:19 UTC (permalink / raw)
To: Steve Sistare
Cc: qemu-devel, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange
Steve Sistare <steven.sistare@oracle.com> wrote:
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH V2 5/6] cpr: reboot mode
2023-10-25 19:44 ` [PATCH V2 5/6] cpr: reboot mode Steve Sistare
@ 2023-10-31 13:21 ` Juan Quintela
0 siblings, 0 replies; 17+ messages in thread
From: Juan Quintela @ 2023-10-31 13:21 UTC (permalink / raw)
To: Steve Sistare
Cc: qemu-devel, Peter Xu, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange
Steve Sistare <steven.sistare@oracle.com> wrote:
> Add the cpr-reboot migration mode. Usage:
>
> $ qemu-system-$arch -monitor stdio ...
> QEMU 8.1.50 monitor - type 'help' for more information
> (qemu) migrate_set_capability x-ignore-shared on
> (qemu) migrate_set_parameter mode cpr-reboot
> (qemu) migrate -d file:vm.state
> (qemu) info status
> VM status: paused (postmigrate)
> (qemu) quit
>
> $ qemu-system-$arch -monitor stdio -incoming defer ...
> QEMU 8.1.50 monitor - type 'help' for more information
> (qemu) migrate_set_capability x-ignore-shared on
> (qemu) migrate_set_parameter mode cpr-reboot
> (qemu) migrate_incoming file:vm.state
> (qemu) info status
> VM status: running
>
> In this mode, the migrate command saves state to a file, allowing one
> to quit qemu, reboot to an updated kernel, and restart an updated version
> of qemu. The caller must specify a migration URI that writes to and reads
> from a file. Unlike normal mode, the use of certain local storage options
> does not block the migration, but the caller must not modify guest block
> devices between the quit and restart. To avoid saving guest RAM to the
> file, the memory backend must be shared, and the @x-ignore-shared migration
> capability must be set. Guest RAM must be non-volatile across reboot, such
> as by backing it with a dax device, but this is not enforced. The restarted
> qemu arguments must match those used to initially start qemu, plus the
> -incoming option.
>
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH V2 3/6] cpr: relax blockdev migration blockers
2023-10-25 19:44 ` [PATCH V2 3/6] cpr: relax blockdev migration blockers Steve Sistare
@ 2023-10-31 15:41 ` Peter Xu
0 siblings, 0 replies; 17+ messages in thread
From: Peter Xu @ 2023-10-31 15:41 UTC (permalink / raw)
To: Steve Sistare, qemu-block, Hanna Reitz, Kevin Wolf
Cc: qemu-devel, Juan Quintela, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange
Copy qemu-block and maintainers.
On Wed, Oct 25, 2023 at 12:44:26PM -0700, Steve Sistare wrote:
> Some blockdevs block migration because they do not support sharing across
> hosts and/or do not support dirty bitmaps. These prohibitions do not apply
> if the old and new qemu processes do not run concurrently, and if new qemu
> starts on the same host as old, which is the case for cpr. Narrow the scope
> of these blockers so they only apply to normal mode. They will not block
> cpr modes when they are added in subsequent patches.
>
> No functional change until a new mode is added.
>
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> Reviewed-by: Juan Quintela <quintela@redhat.com>
> ---
> block/parallels.c | 2 +-
> block/qcow.c | 2 +-
> block/vdi.c | 2 +-
> block/vhdx.c | 2 +-
> block/vmdk.c | 2 +-
> block/vpc.c | 2 +-
> block/vvfat.c | 2 +-
> 7 files changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/block/parallels.c b/block/parallels.c
> index 1697a2e..8a520db 100644
> --- a/block/parallels.c
> +++ b/block/parallels.c
> @@ -1369,7 +1369,7 @@ static int parallels_open(BlockDriverState *bs, QDict *options, int flags,
> bdrv_get_device_or_node_name(bs));
> bdrv_graph_rdunlock_main_loop();
>
> - ret = migrate_add_blocker(&s->migration_blocker, errp);
> + ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
> if (ret < 0) {
> error_setg(errp, "Migration blocker error");
> goto fail;
> diff --git a/block/qcow.c b/block/qcow.c
> index fdd4c83..eab68e3 100644
> --- a/block/qcow.c
> +++ b/block/qcow.c
> @@ -307,7 +307,7 @@ static int qcow_open(BlockDriverState *bs, QDict *options, int flags,
> bdrv_get_device_or_node_name(bs));
> bdrv_graph_rdunlock_main_loop();
>
> - ret = migrate_add_blocker(&s->migration_blocker, errp);
> + ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
> if (ret < 0) {
> goto fail;
> }
> diff --git a/block/vdi.c b/block/vdi.c
> index fd7e365..c647d72 100644
> --- a/block/vdi.c
> +++ b/block/vdi.c
> @@ -498,7 +498,7 @@ static int vdi_open(BlockDriverState *bs, QDict *options, int flags,
> bdrv_get_device_or_node_name(bs));
> bdrv_graph_rdunlock_main_loop();
>
> - ret = migrate_add_blocker(&s->migration_blocker, errp);
> + ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
> if (ret < 0) {
> goto fail_free_bmap;
> }
> diff --git a/block/vhdx.c b/block/vhdx.c
> index e37f8c0..a9d0874 100644
> --- a/block/vhdx.c
> +++ b/block/vhdx.c
> @@ -1096,7 +1096,7 @@ static int vhdx_open(BlockDriverState *bs, QDict *options, int flags,
> error_setg(&s->migration_blocker, "The vhdx format used by node '%s' "
> "does not support live migration",
> bdrv_get_device_or_node_name(bs));
> - ret = migrate_add_blocker(&s->migration_blocker, errp);
> + ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
> if (ret < 0) {
> goto fail;
> }
> diff --git a/block/vmdk.c b/block/vmdk.c
> index 1335d39..85864b8 100644
> --- a/block/vmdk.c
> +++ b/block/vmdk.c
> @@ -1386,7 +1386,7 @@ static int vmdk_open(BlockDriverState *bs, QDict *options, int flags,
> error_setg(&s->migration_blocker, "The vmdk format used by node '%s' "
> "does not support live migration",
> bdrv_get_device_or_node_name(bs));
> - ret = migrate_add_blocker(&s->migration_blocker, errp);
> + ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
> if (ret < 0) {
> goto fail;
> }
> diff --git a/block/vpc.c b/block/vpc.c
> index c30cf86..aa1a48a 100644
> --- a/block/vpc.c
> +++ b/block/vpc.c
> @@ -452,7 +452,7 @@ static int vpc_open(BlockDriverState *bs, QDict *options, int flags,
> bdrv_get_device_or_node_name(bs));
> bdrv_graph_rdunlock_main_loop();
>
> - ret = migrate_add_blocker(&s->migration_blocker, errp);
> + ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
> if (ret < 0) {
> goto fail;
> }
> diff --git a/block/vvfat.c b/block/vvfat.c
> index 266e036..9d050ba 100644
> --- a/block/vvfat.c
> +++ b/block/vvfat.c
> @@ -1268,7 +1268,7 @@ static int vvfat_open(BlockDriverState *bs, QDict *options, int flags,
> "The vvfat (rw) format used by node '%s' "
> "does not support live migration",
> bdrv_get_device_or_node_name(bs));
> - ret = migrate_add_blocker(&s->migration_blocker, errp);
> + ret = migrate_add_blocker_normal(&s->migration_blocker, errp);
> if (ret < 0) {
> goto fail;
> }
> --
> 1.8.3.1
>
--
Peter Xu
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH V2 4/6] cpr: relax vhost migration blockers
2023-10-25 19:44 ` [PATCH V2 4/6] cpr: relax vhost " Steve Sistare
@ 2023-10-31 15:44 ` Peter Xu
0 siblings, 0 replies; 17+ messages in thread
From: Peter Xu @ 2023-10-31 15:44 UTC (permalink / raw)
To: Steve Sistare, Michael S. Tsirkin, Kevin Wolf, Hanna Reitz,
qemu-block
Cc: qemu-devel, Juan Quintela, Fabiano Rosas, Leonardo Bras,
Daniel P. Berrange
Copy qemu-block, virtio
On Wed, Oct 25, 2023 at 12:44:27PM -0700, Steve Sistare wrote:
> vhost blocks migration if logging is not supported to track dirty
> memory, and vhost-user blocks it if the log cannot be saved to a shm fd.
>
> vhost-vdpa blocks migration if both hosts do not support all the device's
> features using a shadow VQ, for tracking requests and dirty memory.
>
> vhost-scsi blocks migration if storage cannot be shared across hosts,
> or if state cannot be migrated.
>
> None of these conditions apply if the old and new qemu processes do
> not run concurrently, and if new qemu starts on the same host as old,
> which is the case for cpr.
>
> Narrow the scope of these blockers so they only apply to normal mode.
> They will not block cpr modes when they are added in subsequent patches.
>
> No functional change until a new mode is added.
>
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> Reviewed-by: Juan Quintela <quintela@redhat.com>
> ---
> hw/scsi/vhost-scsi.c | 2 +-
> hw/virtio/vhost.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/hw/scsi/vhost-scsi.c b/hw/scsi/vhost-scsi.c
> index 14e23cc..bf528d5 100644
> --- a/hw/scsi/vhost-scsi.c
> +++ b/hw/scsi/vhost-scsi.c
> @@ -208,7 +208,7 @@ static void vhost_scsi_realize(DeviceState *dev, Error **errp)
> "When external environment supports it (Orchestrator migrates "
> "target SCSI device state or use shared storage over network), "
> "set 'migratable' property to true to enable migration.");
> - if (migrate_add_blocker(&vsc->migration_blocker, errp) < 0) {
> + if (migrate_add_blocker_normal(&vsc->migration_blocker, errp) < 0) {
> goto free_virtio;
> }
> }
> diff --git a/hw/virtio/vhost.c b/hw/virtio/vhost.c
> index d737671..f5e9625 100644
> --- a/hw/virtio/vhost.c
> +++ b/hw/virtio/vhost.c
> @@ -1527,7 +1527,7 @@ int vhost_dev_init(struct vhost_dev *hdev, void *opaque,
> }
>
> if (hdev->migration_blocker != NULL) {
> - r = migrate_add_blocker(&hdev->migration_blocker, errp);
> + r = migrate_add_blocker_normal(&hdev->migration_blocker, errp);
> if (r < 0) {
> goto fail_busyloop;
> }
> --
> 1.8.3.1
>
--
Peter Xu
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH V2 6/6] tests/qtest: migration: add reboot mode test
2023-10-25 19:44 ` [PATCH V2 6/6] tests/qtest: migration: add reboot mode test Steve Sistare
2023-10-31 13:19 ` Juan Quintela
@ 2023-11-01 13:34 ` Fabiano Rosas
2023-11-01 13:57 ` Steven Sistare
1 sibling, 1 reply; 17+ messages in thread
From: Fabiano Rosas @ 2023-11-01 13:34 UTC (permalink / raw)
To: Steve Sistare, qemu-devel
Cc: Juan Quintela, Peter Xu, Leonardo Bras, Daniel P. Berrange,
Steve Sistare
Steve Sistare <steven.sistare@oracle.com> writes:
> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
> ---
> tests/qtest/migration-test.c | 27 +++++++++++++++++++++++++++
> 1 file changed, 27 insertions(+)
>
> diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
> index e1c1105..de29fc5 100644
> --- a/tests/qtest/migration-test.c
> +++ b/tests/qtest/migration-test.c
> @@ -2001,6 +2001,31 @@ static void test_precopy_file_offset_bad(void)
> test_file_common(&args, false);
> }
>
> +static void *test_mode_reboot_start(QTestState *from, QTestState *to)
> +{
> + migrate_set_parameter_str(from, "mode", "cpr-reboot");
> + migrate_set_parameter_str(to, "mode", "cpr-reboot");
> +
> + migrate_set_capability(from, "x-ignore-shared", true);
> + migrate_set_capability(to, "x-ignore-shared", true);
> +
> + return NULL;
> +}
> +
> +static void test_mode_reboot(void)
> +{
> + g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
> + FILE_TEST_FILENAME);
> + MigrateCommon args = {
> + .start.use_shmem = true,
> + .connect_uri = uri,
> + .listen_uri = "defer",
> + .start_hook = test_mode_reboot_start
> + };
> +
> + test_file_common(&args, true);
> +}
> +
> static void test_precopy_tcp_plain(void)
> {
> MigrateCommon args = {
> @@ -3056,6 +3081,8 @@ int main(int argc, char **argv)
> qtest_add_func("/migration/precopy/file/offset/bad",
> test_precopy_file_offset_bad);
>
> + qtest_add_func("/migration/mode/reboot", test_mode_reboot);
> +
> #ifdef CONFIG_GNUTLS
> qtest_add_func("/migration/precopy/unix/tls/psk",
> test_precopy_unix_tls_psk);
We have an issue with this test on CI:
$ df -h /dev/shm
Filesystem Size Used Avail Use% Mounted on
shm 64M 0 64M 0% /dev/shm
These are shared CI runners, so AFAICT there's no way to increase the
shared memory size.
Reducing the memory for this single test also wouldn't work because we
can run migration-test for different archs in parallel + there's the
ivshmem_test which uses 4M.
Maybe just leave it out of CI? Laptops will probably have enough shared
memory to not hit this. If we add a warning comment to the test, might
be enough.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH V2 6/6] tests/qtest: migration: add reboot mode test
2023-11-01 13:34 ` Fabiano Rosas
@ 2023-11-01 13:57 ` Steven Sistare
2023-11-01 16:26 ` Steven Sistare
0 siblings, 1 reply; 17+ messages in thread
From: Steven Sistare @ 2023-11-01 13:57 UTC (permalink / raw)
To: Fabiano Rosas, qemu-devel
Cc: Juan Quintela, Peter Xu, Leonardo Bras, Daniel P. Berrange
On 11/1/2023 9:34 AM, Fabiano Rosas wrote:
> Steve Sistare <steven.sistare@oracle.com> writes:
>
>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>> ---
>> tests/qtest/migration-test.c | 27 +++++++++++++++++++++++++++
>> 1 file changed, 27 insertions(+)
>>
>> diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
>> index e1c1105..de29fc5 100644
>> --- a/tests/qtest/migration-test.c
>> +++ b/tests/qtest/migration-test.c
>> @@ -2001,6 +2001,31 @@ static void test_precopy_file_offset_bad(void)
>> test_file_common(&args, false);
>> }
>>
>> +static void *test_mode_reboot_start(QTestState *from, QTestState *to)
>> +{
>> + migrate_set_parameter_str(from, "mode", "cpr-reboot");
>> + migrate_set_parameter_str(to, "mode", "cpr-reboot");
>> +
>> + migrate_set_capability(from, "x-ignore-shared", true);
>> + migrate_set_capability(to, "x-ignore-shared", true);
>> +
>> + return NULL;
>> +}
>> +
>> +static void test_mode_reboot(void)
>> +{
>> + g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
>> + FILE_TEST_FILENAME);
>> + MigrateCommon args = {
>> + .start.use_shmem = true,
>> + .connect_uri = uri,
>> + .listen_uri = "defer",
>> + .start_hook = test_mode_reboot_start
>> + };
>> +
>> + test_file_common(&args, true);
>> +}
>> +
>> static void test_precopy_tcp_plain(void)
>> {
>> MigrateCommon args = {
>> @@ -3056,6 +3081,8 @@ int main(int argc, char **argv)
>> qtest_add_func("/migration/precopy/file/offset/bad",
>> test_precopy_file_offset_bad);
>>
>> + qtest_add_func("/migration/mode/reboot", test_mode_reboot);
>> +
>> #ifdef CONFIG_GNUTLS
>> qtest_add_func("/migration/precopy/unix/tls/psk",
>> test_precopy_unix_tls_psk);
>
> We have an issue with this test on CI:
>
> $ df -h /dev/shm
> Filesystem Size Used Avail Use% Mounted on
> shm 64M 0 64M 0% /dev/shm
>
> These are shared CI runners, so AFAICT there's no way to increase the
> shared memory size.
>
> Reducing the memory for this single test also wouldn't work because we
> can run migration-test for different archs in parallel + there's the
> ivshmem_test which uses 4M.
>
> Maybe just leave it out of CI? Laptops will probably have enough shared
> memory to not hit this. If we add a warning comment to the test, might
> be enough.
in test_migrate_start, I could set memory_size very small if use_shmem, and adjust
start_address and end_address. Can you suggest a safe size?
- Steve
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH V2 6/6] tests/qtest: migration: add reboot mode test
2023-11-01 13:57 ` Steven Sistare
@ 2023-11-01 16:26 ` Steven Sistare
2023-11-01 16:52 ` Fabiano Rosas
0 siblings, 1 reply; 17+ messages in thread
From: Steven Sistare @ 2023-11-01 16:26 UTC (permalink / raw)
To: Fabiano Rosas, qemu-devel
Cc: Juan Quintela, Peter Xu, Leonardo Bras, Daniel P. Berrange
On 11/1/2023 9:57 AM, Steven Sistare wrote:
> On 11/1/2023 9:34 AM, Fabiano Rosas wrote:
>> Steve Sistare <steven.sistare@oracle.com> writes:
>>
>>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>>> ---
>>> tests/qtest/migration-test.c | 27 +++++++++++++++++++++++++++
>>> 1 file changed, 27 insertions(+)
>>>
>>> diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
>>> index e1c1105..de29fc5 100644
>>> --- a/tests/qtest/migration-test.c
>>> +++ b/tests/qtest/migration-test.c
>>> @@ -2001,6 +2001,31 @@ static void test_precopy_file_offset_bad(void)
>>> test_file_common(&args, false);
>>> }
>>>
>>> +static void *test_mode_reboot_start(QTestState *from, QTestState *to)
>>> +{
>>> + migrate_set_parameter_str(from, "mode", "cpr-reboot");
>>> + migrate_set_parameter_str(to, "mode", "cpr-reboot");
>>> +
>>> + migrate_set_capability(from, "x-ignore-shared", true);
>>> + migrate_set_capability(to, "x-ignore-shared", true);
>>> +
>>> + return NULL;
>>> +}
>>> +
>>> +static void test_mode_reboot(void)
>>> +{
>>> + g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
>>> + FILE_TEST_FILENAME);
>>> + MigrateCommon args = {
>>> + .start.use_shmem = true,
>>> + .connect_uri = uri,
>>> + .listen_uri = "defer",
>>> + .start_hook = test_mode_reboot_start
>>> + };
>>> +
>>> + test_file_common(&args, true);
>>> +}
>>> +
>>> static void test_precopy_tcp_plain(void)
>>> {
>>> MigrateCommon args = {
>>> @@ -3056,6 +3081,8 @@ int main(int argc, char **argv)
>>> qtest_add_func("/migration/precopy/file/offset/bad",
>>> test_precopy_file_offset_bad);
>>>
>>> + qtest_add_func("/migration/mode/reboot", test_mode_reboot);
>>> +
>>> #ifdef CONFIG_GNUTLS
>>> qtest_add_func("/migration/precopy/unix/tls/psk",
>>> test_precopy_unix_tls_psk);
>>
>> We have an issue with this test on CI:
>>
>> $ df -h /dev/shm
>> Filesystem Size Used Avail Use% Mounted on
>> shm 64M 0 64M 0% /dev/shm
>>
>> These are shared CI runners, so AFAICT there's no way to increase the
>> shared memory size.
>>
>> Reducing the memory for this single test also wouldn't work because we
>> can run migration-test for different archs in parallel + there's the
>> ivshmem_test which uses 4M.
>>
>> Maybe just leave it out of CI? Laptops will probably have enough shared
>> memory to not hit this. If we add a warning comment to the test, might
>> be enough.
>
> in test_migrate_start, I could set memory_size very small if use_shmem, and adjust
> start_address and end_address. Can you suggest a safe size?
Ugh, I would also need to dynamically change TEST_MEM_END and ARM_TEST_MEM_END in
a-b-bootblock.S and a-b-kernel.S, like I do for the suspend_me variable in my
work-in-progress patch "tests/qtest: option to suspend during migration".
- Steve
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: [PATCH V2 6/6] tests/qtest: migration: add reboot mode test
2023-11-01 16:26 ` Steven Sistare
@ 2023-11-01 16:52 ` Fabiano Rosas
0 siblings, 0 replies; 17+ messages in thread
From: Fabiano Rosas @ 2023-11-01 16:52 UTC (permalink / raw)
To: Steven Sistare, qemu-devel
Cc: Juan Quintela, Peter Xu, Leonardo Bras, Daniel P. Berrange
Steven Sistare <steven.sistare@oracle.com> writes:
> On 11/1/2023 9:57 AM, Steven Sistare wrote:
>> On 11/1/2023 9:34 AM, Fabiano Rosas wrote:
>>> Steve Sistare <steven.sistare@oracle.com> writes:
>>>
>>>> Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
>>>> ---
>>>> tests/qtest/migration-test.c | 27 +++++++++++++++++++++++++++
>>>> 1 file changed, 27 insertions(+)
>>>>
>>>> diff --git a/tests/qtest/migration-test.c b/tests/qtest/migration-test.c
>>>> index e1c1105..de29fc5 100644
>>>> --- a/tests/qtest/migration-test.c
>>>> +++ b/tests/qtest/migration-test.c
>>>> @@ -2001,6 +2001,31 @@ static void test_precopy_file_offset_bad(void)
>>>> test_file_common(&args, false);
>>>> }
>>>>
>>>> +static void *test_mode_reboot_start(QTestState *from, QTestState *to)
>>>> +{
>>>> + migrate_set_parameter_str(from, "mode", "cpr-reboot");
>>>> + migrate_set_parameter_str(to, "mode", "cpr-reboot");
>>>> +
>>>> + migrate_set_capability(from, "x-ignore-shared", true);
>>>> + migrate_set_capability(to, "x-ignore-shared", true);
>>>> +
>>>> + return NULL;
>>>> +}
>>>> +
>>>> +static void test_mode_reboot(void)
>>>> +{
>>>> + g_autofree char *uri = g_strdup_printf("file:%s/%s", tmpfs,
>>>> + FILE_TEST_FILENAME);
>>>> + MigrateCommon args = {
>>>> + .start.use_shmem = true,
>>>> + .connect_uri = uri,
>>>> + .listen_uri = "defer",
>>>> + .start_hook = test_mode_reboot_start
>>>> + };
>>>> +
>>>> + test_file_common(&args, true);
>>>> +}
>>>> +
>>>> static void test_precopy_tcp_plain(void)
>>>> {
>>>> MigrateCommon args = {
>>>> @@ -3056,6 +3081,8 @@ int main(int argc, char **argv)
>>>> qtest_add_func("/migration/precopy/file/offset/bad",
>>>> test_precopy_file_offset_bad);
>>>>
>>>> + qtest_add_func("/migration/mode/reboot", test_mode_reboot);
>>>> +
>>>> #ifdef CONFIG_GNUTLS
>>>> qtest_add_func("/migration/precopy/unix/tls/psk",
>>>> test_precopy_unix_tls_psk);
>>>
>>> We have an issue with this test on CI:
>>>
>>> $ df -h /dev/shm
>>> Filesystem Size Used Avail Use% Mounted on
>>> shm 64M 0 64M 0% /dev/shm
>>>
>>> These are shared CI runners, so AFAICT there's no way to increase the
>>> shared memory size.
>>>
>>> Reducing the memory for this single test also wouldn't work because we
>>> can run migration-test for different archs in parallel + there's the
>>> ivshmem_test which uses 4M.
>>>
>>> Maybe just leave it out of CI? Laptops will probably have enough shared
>>> memory to not hit this. If we add a warning comment to the test, might
>>> be enough.
>>
>> in test_migrate_start, I could set memory_size very small if use_shmem, and adjust
>> start_address and end_address. Can you suggest a safe size?
We need at least ~4M for the MAGIC_MARKER logic to work. Then each
architecture will have a minimum memory size it needs to even be able to
boot. Then we'll need ~2M (to be safe) for the a-b code itself.
One issue I can see already is that ppc needs at least 256M to boot. We
currently only test ppc with KVM, but we need to make sure the custom
runners (not even sure we have ppc baremetal) would have enough shared
memory. Another issue is that there's not much stopping us from testing
ppc with TCG as well. In fact, I'm highly in favor of bringing back
s390x and ppc64le with TCG for migration-test. It's just a pain to test
those otherwise.
x86 seems like it could go as low as ~6M.
aarch64 only needs 512k for the kernel, but I'm not having success with
less than 110M. Probably some firmware + device tree taking up space,
I'm not sure.
>
> Ugh, I would also need to dynamically change TEST_MEM_END and ARM_TEST_MEM_END in
> a-b-bootblock.S and a-b-kernel.S, like I do for the suspend_me variable in my
> work-in-progress patch "tests/qtest: option to suspend during migration".
I'm leaning towards just checking the GITLAB_CI environment variable and
skipping the test on CI.
Juan, any preference?
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2023-11-01 16:52 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-10-25 19:44 [PATCH V2 0/6] Live Update reboot mode Steve Sistare
2023-10-25 19:44 ` [PATCH V2 1/6] migration: mode parameter Steve Sistare
2023-10-31 13:17 ` Juan Quintela
2023-10-25 19:44 ` [PATCH V2 2/6] migration: per-mode blockers Steve Sistare
2023-10-25 19:44 ` [PATCH V2 3/6] cpr: relax blockdev migration blockers Steve Sistare
2023-10-31 15:41 ` Peter Xu
2023-10-25 19:44 ` [PATCH V2 4/6] cpr: relax vhost " Steve Sistare
2023-10-31 15:44 ` Peter Xu
2023-10-25 19:44 ` [PATCH V2 5/6] cpr: reboot mode Steve Sistare
2023-10-31 13:21 ` Juan Quintela
2023-10-25 19:44 ` [PATCH V2 6/6] tests/qtest: migration: add reboot mode test Steve Sistare
2023-10-31 13:19 ` Juan Quintela
2023-11-01 13:34 ` Fabiano Rosas
2023-11-01 13:57 ` Steven Sistare
2023-11-01 16:26 ` Steven Sistare
2023-11-01 16:52 ` Fabiano Rosas
-- strict thread matches above, loose matches on Subject: below --
2023-10-26 20:08 [PATCH V2 0/6] Live Update reboot mode Steve Sistare
2023-10-26 20:08 ` [PATCH V2 5/6] cpr: " Steve Sistare
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).