* [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props
@ 2017-07-18 3:39 Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 01/10] qdev: provide DEFINE_PROP_INT64() Peter Xu
` (9 more replies)
0 siblings, 10 replies; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert
v3:
- add r-b properly on each patch
- patch 1: fix commit message [Eric]
- patch 4: dropped since not used any more [Eduardo]
- patch 7 (new patch 6): move the check from post_init() into
migration_object_init() [Eduardo]
- patch 10 (new patch 9): rename var "head" -> "list" [Juan]
- patch 11: rebased a lot due to patch 7's change, so removed Juan's r-b
v2:
- extended the series from 3 -> 11 patches
- renamed all the properties with "x-" prefix
- handled the cap/param check for these new properties (mostly patch
4-11, but it contains lots of refactorings in general)
We have the MigrationState as QDev now (which seems crazy). Let's
continue to benefit.
This series is exporting all migration capabilities/params as global
parameters. Then we can do something like this:
qemu -global migration.postcopy-ram=true \
-global migration.max-bandwidth=4096
The values will be inited just like we typed these values into HMP
monitor. It'll simplify lots of migration scripts.
The changes are fairly straightforward. One tiny loss is that we still
don't support:
-global migration.max-bandwidth=1g
...just like what we did in HMP:
migrate_set_speed 1g
...while we need to use:
-global migration.max-bandwidth=1073741824
However that should only be used in scripts, and that's good enough
imho.
These properties should only be used for debugging/testing purpose,
and we should not guarantee any interface compatibility for them (just
like HMP).
Please review. Thanks.
Peter Xu (10):
qdev: provide DEFINE_PROP_INT64()
migration: export parameters to props
migration: export capabilities to props
migration: introduce migrate_params_check()
migration: provide migrate_params_apply()
migration: check global params for validity
migration: remove check against colo support
migration: provide migrate_caps_check()
migration: provide migrate_cap_add()
migration: check global caps for validity
hw/core/qdev-properties.c | 32 ++++++
include/hw/qdev-properties.h | 3 +
include/migration/colo.h | 1 -
migration/colo.c | 5 -
migration/migration.c | 267 +++++++++++++++++++++++++++++++++----------
5 files changed, 242 insertions(+), 66 deletions(-)
--
2.7.4
^ permalink raw reply [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 01/10] qdev: provide DEFINE_PROP_INT64()
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 02/10] migration: export parameters to props Peter Xu
` (8 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert, Marc-André Lureau,
Marcel Apfelbaum, Eric Blake
We have nearly all the stuff, but this one is missing. Add it in.
Am going to use this new helper for MigrationParameters fields, since
most of them are int64_t.
CC: Markus Armbruster <armbru@redhat.com>
CC: Eduardo Habkost <ehabkost@redhat.com>
CC: Marc-André Lureau <marcandre.lureau@redhat.com>
CC: Peter Xu <peterx@redhat.com>
CC: Juan Quintela <quintela@redhat.com>
CC: Marcel Apfelbaum <marcel@redhat.com>
CC: Eric Blake <eblake@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Marcel Apfelbaum <marcel@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
hw/core/qdev-properties.c | 32 ++++++++++++++++++++++++++++++++
include/hw/qdev-properties.h | 3 +++
2 files changed, 35 insertions(+)
diff --git a/hw/core/qdev-properties.c b/hw/core/qdev-properties.c
index dcecdf0..c1d4e54 100644
--- a/hw/core/qdev-properties.c
+++ b/hw/core/qdev-properties.c
@@ -404,6 +404,31 @@ static void set_uint64(Object *obj, Visitor *v, const char *name,
visit_type_uint64(v, name, ptr, errp);
}
+static void get_int64(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ int64_t *ptr = qdev_get_prop_ptr(dev, prop);
+
+ visit_type_int64(v, name, ptr, errp);
+}
+
+static void set_int64(Object *obj, Visitor *v, const char *name,
+ void *opaque, Error **errp)
+{
+ DeviceState *dev = DEVICE(obj);
+ Property *prop = opaque;
+ int64_t *ptr = qdev_get_prop_ptr(dev, prop);
+
+ if (dev->realized) {
+ qdev_prop_set_after_realize(dev, name, errp);
+ return;
+ }
+
+ visit_type_int64(v, name, ptr, errp);
+}
+
const PropertyInfo qdev_prop_uint64 = {
.name = "uint64",
.get = get_uint64,
@@ -411,6 +436,13 @@ const PropertyInfo qdev_prop_uint64 = {
.set_default_value = set_default_value_uint,
};
+const PropertyInfo qdev_prop_int64 = {
+ .name = "int64",
+ .get = get_int64,
+ .set = set_int64,
+ .set_default_value = set_default_value_int,
+};
+
/* --- string --- */
static void release_string(Object *obj, const char *name, void *opaque)
diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h
index f6692d5..30af33b 100644
--- a/include/hw/qdev-properties.h
+++ b/include/hw/qdev-properties.h
@@ -13,6 +13,7 @@ extern const PropertyInfo qdev_prop_uint16;
extern const PropertyInfo qdev_prop_uint32;
extern const PropertyInfo qdev_prop_int32;
extern const PropertyInfo qdev_prop_uint64;
+extern const PropertyInfo qdev_prop_int64;
extern const PropertyInfo qdev_prop_size;
extern const PropertyInfo qdev_prop_string;
extern const PropertyInfo qdev_prop_chr;
@@ -136,6 +137,8 @@ extern const PropertyInfo qdev_prop_link;
DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_int32, int32_t)
#define DEFINE_PROP_UINT64(_n, _s, _f, _d) \
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_uint64, uint64_t)
+#define DEFINE_PROP_INT64(_n, _s, _f, _d) \
+ DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_int64, int64_t)
#define DEFINE_PROP_SIZE(_n, _s, _f, _d) \
DEFINE_PROP_UNSIGNED(_n, _s, _f, _d, qdev_prop_size, uint64_t)
#define DEFINE_PROP_PCI_DEVFN(_n, _s, _f, _d) \
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 02/10] migration: export parameters to props
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 01/10] qdev: provide DEFINE_PROP_INT64() Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 03/10] migration: export capabilities " Peter Xu
` (7 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert
Export migration parameters to qdev properties. Then we can use, for
example:
-global migration.x-cpu-throttle-initial=xxx
To specify migration parameters during init.
Prefix "x-" is appended for each parameter exported to show that this is
not a stable interface, and only for debugging/testing purpose.
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 35 +++++++++++++++++++++++++----------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index a0db40d..ad2505c 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2009,6 +2009,31 @@ static Property migration_properties[] = {
send_configuration, true),
DEFINE_PROP_BOOL("send-section-footer", MigrationState,
send_section_footer, true),
+
+ /* Migration parameters */
+ DEFINE_PROP_INT64("x-compress-level", MigrationState,
+ parameters.compress_level,
+ DEFAULT_MIGRATE_COMPRESS_LEVEL),
+ DEFINE_PROP_INT64("x-compress-threads", MigrationState,
+ parameters.compress_threads,
+ DEFAULT_MIGRATE_COMPRESS_THREAD_COUNT),
+ DEFINE_PROP_INT64("x-decompress-threads", MigrationState,
+ parameters.decompress_threads,
+ DEFAULT_MIGRATE_DECOMPRESS_THREAD_COUNT),
+ DEFINE_PROP_INT64("x-cpu-throttle-initial", MigrationState,
+ parameters.cpu_throttle_initial,
+ DEFAULT_MIGRATE_CPU_THROTTLE_INITIAL),
+ DEFINE_PROP_INT64("x-cpu-throttle-increment", MigrationState,
+ parameters.cpu_throttle_increment,
+ DEFAULT_MIGRATE_CPU_THROTTLE_INCREMENT),
+ DEFINE_PROP_INT64("x-max-bandwidth", MigrationState,
+ parameters.max_bandwidth, MAX_THROTTLE),
+ DEFINE_PROP_INT64("x-downtime-limit", MigrationState,
+ parameters.downtime_limit,
+ DEFAULT_MIGRATE_SET_DOWNTIME),
+ DEFINE_PROP_INT64("x-checkpoint-delay", MigrationState,
+ parameters.x_checkpoint_delay,
+ DEFAULT_MIGRATE_X_CHECKPOINT_DELAY),
DEFINE_PROP_END_OF_LIST(),
};
@@ -2027,16 +2052,6 @@ static void migration_instance_init(Object *obj)
ms->state = MIGRATION_STATUS_NONE;
ms->xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE;
ms->mbps = -1;
- ms->parameters = (MigrationParameters) {
- .compress_level = DEFAULT_MIGRATE_COMPRESS_LEVEL,
- .compress_threads = DEFAULT_MIGRATE_COMPRESS_THREAD_COUNT,
- .decompress_threads = DEFAULT_MIGRATE_DECOMPRESS_THREAD_COUNT,
- .cpu_throttle_initial = DEFAULT_MIGRATE_CPU_THROTTLE_INITIAL,
- .cpu_throttle_increment = DEFAULT_MIGRATE_CPU_THROTTLE_INCREMENT,
- .max_bandwidth = MAX_THROTTLE,
- .downtime_limit = DEFAULT_MIGRATE_SET_DOWNTIME,
- .x_checkpoint_delay = DEFAULT_MIGRATE_X_CHECKPOINT_DELAY,
- };
ms->parameters.tls_creds = g_strdup("");
ms->parameters.tls_hostname = g_strdup("");
}
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 03/10] migration: export capabilities to props
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 01/10] qdev: provide DEFINE_PROP_INT64() Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 02/10] migration: export parameters to props Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 04/10] migration: introduce migrate_params_check() Peter Xu
` (6 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert
Do the same thing to migration capabilities, just like what we did in
previous patch for migration parameters.
Reviewed-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Eduardo Habkost <ehabkost@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/migration/migration.c b/migration/migration.c
index ad2505c..3208162 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2001,6 +2001,9 @@ void migration_global_dump(Monitor *mon)
ms->send_configuration, ms->send_section_footer);
}
+#define DEFINE_PROP_MIG_CAP(name, x) \
+ DEFINE_PROP_BOOL(name, MigrationState, enabled_capabilities[x], false)
+
static Property migration_properties[] = {
DEFINE_PROP_BOOL("store-global-state", MigrationState,
store_global_state, true),
@@ -2034,6 +2037,20 @@ static Property migration_properties[] = {
DEFINE_PROP_INT64("x-checkpoint-delay", MigrationState,
parameters.x_checkpoint_delay,
DEFAULT_MIGRATE_X_CHECKPOINT_DELAY),
+
+ /* Migration capabilities */
+ DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE),
+ DEFINE_PROP_MIG_CAP("x-rdma-pin-all", MIGRATION_CAPABILITY_RDMA_PIN_ALL),
+ DEFINE_PROP_MIG_CAP("x-auto-converge", MIGRATION_CAPABILITY_AUTO_CONVERGE),
+ DEFINE_PROP_MIG_CAP("x-zero-blocks", MIGRATION_CAPABILITY_ZERO_BLOCKS),
+ DEFINE_PROP_MIG_CAP("x-compress", MIGRATION_CAPABILITY_COMPRESS),
+ DEFINE_PROP_MIG_CAP("x-events", MIGRATION_CAPABILITY_EVENTS),
+ DEFINE_PROP_MIG_CAP("x-postcopy-ram", MIGRATION_CAPABILITY_POSTCOPY_RAM),
+ DEFINE_PROP_MIG_CAP("x-colo", MIGRATION_CAPABILITY_X_COLO),
+ DEFINE_PROP_MIG_CAP("x-release-ram", MIGRATION_CAPABILITY_RELEASE_RAM),
+ DEFINE_PROP_MIG_CAP("x-block", MIGRATION_CAPABILITY_BLOCK),
+ DEFINE_PROP_MIG_CAP("x-return-path", MIGRATION_CAPABILITY_RETURN_PATH),
+
DEFINE_PROP_END_OF_LIST(),
};
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 04/10] migration: introduce migrate_params_check()
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
` (2 preceding siblings ...)
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 03/10] migration: export capabilities " Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 05/10] migration: provide migrate_params_apply() Peter Xu
` (5 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert
Helper to check the parameters. Abstracted from
qmp_migrate_set_parameters().
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 42 ++++++++++++++++++++++++++++++++----------
1 file changed, 32 insertions(+), 10 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 3208162..2821f8a 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -643,64 +643,86 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
}
}
-void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
+/*
+ * Check whether the parameters are valid. Error will be put into errp
+ * (if provided). Return true if valid, otherwise false.
+ */
+static bool migrate_params_check(MigrationParameters *params, Error **errp)
{
- MigrationState *s = migrate_get_current();
-
if (params->has_compress_level &&
(params->compress_level < 0 || params->compress_level > 9)) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "compress_level",
"is invalid, it should be in the range of 0 to 9");
- return;
+ return false;
}
+
if (params->has_compress_threads &&
(params->compress_threads < 1 || params->compress_threads > 255)) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
"compress_threads",
"is invalid, it should be in the range of 1 to 255");
- return;
+ return false;
}
+
if (params->has_decompress_threads &&
(params->decompress_threads < 1 || params->decompress_threads > 255)) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
"decompress_threads",
"is invalid, it should be in the range of 1 to 255");
- return;
+ return false;
}
+
if (params->has_cpu_throttle_initial &&
(params->cpu_throttle_initial < 1 ||
params->cpu_throttle_initial > 99)) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
"cpu_throttle_initial",
"an integer in the range of 1 to 99");
- return;
+ return false;
}
+
if (params->has_cpu_throttle_increment &&
(params->cpu_throttle_increment < 1 ||
params->cpu_throttle_increment > 99)) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
"cpu_throttle_increment",
"an integer in the range of 1 to 99");
- return;
+ return false;
}
+
if (params->has_max_bandwidth &&
(params->max_bandwidth < 0 || params->max_bandwidth > SIZE_MAX)) {
error_setg(errp, "Parameter 'max_bandwidth' expects an integer in the"
" range of 0 to %zu bytes/second", SIZE_MAX);
- return;
+ return false;
}
+
if (params->has_downtime_limit &&
(params->downtime_limit < 0 ||
params->downtime_limit > MAX_MIGRATE_DOWNTIME)) {
error_setg(errp, "Parameter 'downtime_limit' expects an integer in "
"the range of 0 to %d milliseconds",
MAX_MIGRATE_DOWNTIME);
- return;
+ return false;
}
+
if (params->has_x_checkpoint_delay && (params->x_checkpoint_delay < 0)) {
error_setg(errp, QERR_INVALID_PARAMETER_VALUE,
"x_checkpoint_delay",
"is invalid, it should be positive");
+ return false;
+ }
+
+ return true;
+}
+
+void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
+{
+ MigrationState *s = migrate_get_current();
+
+ if (!migrate_params_check(params, errp)) {
+ /* Invalid parameter */
+ return;
}
if (params->has_compress_level) {
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 05/10] migration: provide migrate_params_apply()
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
` (3 preceding siblings ...)
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 04/10] migration: introduce migrate_params_check() Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 06/10] migration: check global params for validity Peter Xu
` (4 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert
Abstracted from qmp_migrate_set_parameters().
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 2821f8a..8c65054 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -716,38 +716,40 @@ static bool migrate_params_check(MigrationParameters *params, Error **errp)
return true;
}
-void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
+static void migrate_params_apply(MigrationParameters *params)
{
MigrationState *s = migrate_get_current();
- if (!migrate_params_check(params, errp)) {
- /* Invalid parameter */
- return;
- }
-
if (params->has_compress_level) {
s->parameters.compress_level = params->compress_level;
}
+
if (params->has_compress_threads) {
s->parameters.compress_threads = params->compress_threads;
}
+
if (params->has_decompress_threads) {
s->parameters.decompress_threads = params->decompress_threads;
}
+
if (params->has_cpu_throttle_initial) {
s->parameters.cpu_throttle_initial = params->cpu_throttle_initial;
}
+
if (params->has_cpu_throttle_increment) {
s->parameters.cpu_throttle_increment = params->cpu_throttle_increment;
}
+
if (params->has_tls_creds) {
g_free(s->parameters.tls_creds);
s->parameters.tls_creds = g_strdup(params->tls_creds);
}
+
if (params->has_tls_hostname) {
g_free(s->parameters.tls_hostname);
s->parameters.tls_hostname = g_strdup(params->tls_hostname);
}
+
if (params->has_max_bandwidth) {
s->parameters.max_bandwidth = params->max_bandwidth;
if (s->to_dst_file) {
@@ -755,6 +757,7 @@ void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
s->parameters.max_bandwidth / XFER_LIMIT_RATIO);
}
}
+
if (params->has_downtime_limit) {
s->parameters.downtime_limit = params->downtime_limit;
}
@@ -765,11 +768,22 @@ void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
colo_checkpoint_notify(s);
}
}
+
if (params->has_block_incremental) {
s->parameters.block_incremental = params->block_incremental;
}
}
+void qmp_migrate_set_parameters(MigrationParameters *params, Error **errp)
+{
+ if (!migrate_params_check(params, errp)) {
+ /* Invalid parameter */
+ return;
+ }
+
+ migrate_params_apply(params);
+}
+
void qmp_migrate_start_postcopy(Error **errp)
{
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 06/10] migration: check global params for validity
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
` (4 preceding siblings ...)
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 05/10] migration: provide migrate_params_apply() Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 8:20 ` Juan Quintela
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 07/10] migration: remove check against colo support Peter Xu
` (3 subsequent siblings)
9 siblings, 1 reply; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert
Adding validity check for the migration parameters passed in via global
properties.
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 38 ++++++++++++++++++++++++++++++++++++--
1 file changed, 36 insertions(+), 2 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 8c65054..a4a8ed8 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -102,14 +102,22 @@ enum mig_rp_message_type {
static MigrationState *current_migration;
+static bool migration_object_check(MigrationState *ms, Error **errp);
+
void migration_object_init(void)
{
MachineState *ms = MACHINE(qdev_get_machine());
+ Error *err = NULL;
/* This can only be called once. */
assert(!current_migration);
current_migration = MIGRATION_OBJ(object_new(TYPE_MIGRATION));
+ if (!migration_object_check(current_migration, &err)) {
+ error_report_err(err);
+ exit(1);
+ }
+
/*
* We cannot really do this in migration_instance_init() since at
* that time global properties are not yet applied, then this
@@ -2101,12 +2109,38 @@ static void migration_class_init(ObjectClass *klass, void *data)
static void migration_instance_init(Object *obj)
{
MigrationState *ms = MIGRATION_OBJ(obj);
+ MigrationParameters *params = &ms->parameters;
ms->state = MIGRATION_STATUS_NONE;
ms->xbzrle_cache_size = DEFAULT_MIGRATE_CACHE_SIZE;
ms->mbps = -1;
- ms->parameters.tls_creds = g_strdup("");
- ms->parameters.tls_hostname = g_strdup("");
+
+ params->tls_hostname = g_strdup("");
+ params->tls_creds = g_strdup("");
+
+ /* Set has_* up only for parameter checks */
+ params->has_compress_level = true;
+ params->has_compress_threads = true;
+ params->has_decompress_threads = true;
+ params->has_cpu_throttle_initial = true;
+ params->has_cpu_throttle_increment = true;
+ params->has_max_bandwidth = true;
+ params->has_downtime_limit = true;
+ params->has_x_checkpoint_delay = true;
+ params->has_block_incremental = true;
+}
+
+/*
+ * Return true if check pass, false otherwise. Error will be put
+ * inside errp if provided.
+ */
+static bool migration_object_check(MigrationState *ms, Error **errp)
+{
+ if (!migrate_params_check(&ms->parameters, errp)) {
+ return false;
+ }
+
+ return true;
}
static const TypeInfo migration_type = {
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 07/10] migration: remove check against colo support
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
` (5 preceding siblings ...)
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 06/10] migration: check global params for validity Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 08/10] migration: provide migrate_caps_check() Peter Xu
` (2 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert, Paolo Bonzini,
Hailiang Zhang
Since commit a15215f3 ("build: remove --enable-colo/--disable-colo"),
colo is always supported. We don't need any colo_supported() now since
it is always true. Removing any extra code that depends on it.
CC: Paolo Bonzini <pbonzini@redhat.com>
CC: Hailiang Zhang <zhang.zhanghailiang@huawei.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
include/migration/colo.h | 1 -
migration/colo.c | 5 -----
migration/migration.c | 11 -----------
3 files changed, 17 deletions(-)
diff --git a/include/migration/colo.h b/include/migration/colo.h
index be6beba..ff9874e 100644
--- a/include/migration/colo.h
+++ b/include/migration/colo.h
@@ -15,7 +15,6 @@
#include "qemu-common.h"
-bool colo_supported(void);
void colo_info_init(void);
void migrate_start_colo_process(MigrationState *s);
diff --git a/migration/colo.c b/migration/colo.c
index ef35f00..a425543 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -29,11 +29,6 @@ static bool vmstate_loading;
#define COLO_BUFFER_BASE_SIZE (4 * 1024 * 1024)
-bool colo_supported(void)
-{
- return true;
-}
-
bool migration_in_colo_state(void)
{
MigrationState *s = migrate_get_current();
diff --git a/migration/migration.c b/migration/migration.c
index a4a8ed8..0f0de04 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -411,9 +411,6 @@ MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
continue;
}
#endif
- if (i == MIGRATION_CAPABILITY_X_COLO && !colo_supported()) {
- continue;
- }
if (head == NULL) {
head = g_malloc0(sizeof(*caps));
caps = head;
@@ -612,14 +609,6 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
continue;
}
#endif
- if (cap->value->capability == MIGRATION_CAPABILITY_X_COLO) {
- if (!colo_supported()) {
- error_setg(errp, "COLO is not currently supported, please"
- " configure with --enable-colo option in order to"
- " support COLO feature");
- continue;
- }
- }
s->enabled_capabilities[cap->value->capability] = cap->value->state;
}
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 08/10] migration: provide migrate_caps_check()
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
` (6 preceding siblings ...)
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 07/10] migration: remove check against colo support Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 09/10] migration: provide migrate_cap_add() Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 10/10] migration: check global caps for validity Peter Xu
9 siblings, 0 replies; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert
Abstract helper function to check migration capabilities (from the old
qmp_migrate_set_capabilities). Prepare to be used somewhere else.
There is side effect on the change: when applying the capabilities, we
were skipping the invalid ones, but still applying the valid ones (if
they are provided in the same QMP request). After this refactoring,
we'll ignore all the capabilities if we detected invalid setup along the
way. However, I don't think it is a problem since general users should
not provide anything invalid after all.
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 79 ++++++++++++++++++++++++++++++++++-----------------
1 file changed, 53 insertions(+), 26 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 0f0de04..43a2471 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -587,43 +587,49 @@ MigrationInfo *qmp_query_migrate(Error **errp)
return info;
}
-void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
- Error **errp)
+/**
+ * @migration_caps_check - check capability validity
+ *
+ * @cap_list: old capability list, array of bool
+ * @params: new capabilities to be applied soon
+ * @errp: set *errp if the check failed, with reason
+ *
+ * Returns true if check passed, otherwise false.
+ */
+static bool migrate_caps_check(bool *cap_list,
+ MigrationCapabilityStatusList *params,
+ Error **errp)
{
- MigrationState *s = migrate_get_current();
MigrationCapabilityStatusList *cap;
- bool old_postcopy_cap = migrate_postcopy_ram();
+ bool old_postcopy_cap;
- if (migration_is_setup_or_active(s->state)) {
- error_setg(errp, QERR_MIGRATION_ACTIVE);
- return;
- }
+ old_postcopy_cap = cap_list[MIGRATION_CAPABILITY_POSTCOPY_RAM];
for (cap = params; cap; cap = cap->next) {
+ cap_list[cap->value->capability] = cap->value->state;
+ }
+
#ifndef CONFIG_LIVE_BLOCK_MIGRATION
- if (cap->value->capability == MIGRATION_CAPABILITY_BLOCK
- && cap->value->state) {
- error_setg(errp, "QEMU compiled without old-style (blk/-b, inc/-i) "
- "block migration");
- error_append_hint(errp, "Use drive_mirror+NBD instead.\n");
- continue;
- }
-#endif
- s->enabled_capabilities[cap->value->capability] = cap->value->state;
+ if (cap_list[MIGRATION_CAPABILITY_BLOCK]) {
+ error_setg(errp, "QEMU compiled without old-style (blk/-b, inc/-i) "
+ "block migration");
+ error_append_hint(errp, "Use drive_mirror+NBD instead.\n");
+ return false;
}
+#endif
- if (migrate_postcopy_ram()) {
- if (migrate_use_compression()) {
+ if (cap_list[MIGRATION_CAPABILITY_POSTCOPY_RAM]) {
+ if (cap_list[MIGRATION_CAPABILITY_COMPRESS]) {
/* The decompression threads asynchronously write into RAM
* rather than use the atomic copies needed to avoid
* userfaulting. It should be possible to fix the decompression
* threads for compatibility in future.
*/
- error_report("Postcopy is not currently compatible with "
- "compression");
- s->enabled_capabilities[MIGRATION_CAPABILITY_POSTCOPY_RAM] =
- false;
+ error_setg(errp, "Postcopy is not currently compatible "
+ "with compression");
+ return false;
}
+
/* This check is reasonably expensive, so only when it's being
* set the first time, also it's only the destination that needs
* special support.
@@ -633,11 +639,32 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
/* postcopy_ram_supported_by_host will have emitted a more
* detailed message
*/
- error_report("Postcopy is not supported");
- s->enabled_capabilities[MIGRATION_CAPABILITY_POSTCOPY_RAM] =
- false;
+ error_setg(errp, "Postcopy is not supported");
+ return false;
}
}
+
+ return true;
+}
+
+void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
+ Error **errp)
+{
+ MigrationState *s = migrate_get_current();
+ MigrationCapabilityStatusList *cap;
+
+ if (migration_is_setup_or_active(s->state)) {
+ error_setg(errp, QERR_MIGRATION_ACTIVE);
+ return;
+ }
+
+ if (!migrate_caps_check(s->enabled_capabilities, params, errp)) {
+ return;
+ }
+
+ for (cap = params; cap; cap = cap->next) {
+ s->enabled_capabilities[cap->value->capability] = cap->value->state;
+ }
}
/*
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 09/10] migration: provide migrate_cap_add()
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
` (7 preceding siblings ...)
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 08/10] migration: provide migrate_caps_check() Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 10/10] migration: check global caps for validity Peter Xu
9 siblings, 0 replies; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert
Abstracted from migrate_set_block_enabled() to allocate
MigrationCapabilityStatusList properly.
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index 43a2471..db869c4 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -841,14 +841,27 @@ void migrate_set_state(int *state, int old_state, int new_state)
}
}
-void migrate_set_block_enabled(bool value, Error **errp)
+static MigrationCapabilityStatusList *migrate_cap_add(
+ MigrationCapabilityStatusList *list,
+ MigrationCapability index,
+ bool state)
{
MigrationCapabilityStatusList *cap;
cap = g_new0(MigrationCapabilityStatusList, 1);
cap->value = g_new0(MigrationCapabilityStatus, 1);
- cap->value->capability = MIGRATION_CAPABILITY_BLOCK;
- cap->value->state = value;
+ cap->value->capability = index;
+ cap->value->state = state;
+ cap->next = list;
+
+ return cap;
+}
+
+void migrate_set_block_enabled(bool value, Error **errp)
+{
+ MigrationCapabilityStatusList *cap;
+
+ cap = migrate_cap_add(NULL, MIGRATION_CAPABILITY_BLOCK, value);
qmp_migrate_set_capabilities(cap, errp);
qapi_free_MigrationCapabilityStatusList(cap);
}
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [Qemu-devel] [PATCH v3 10/10] migration: check global caps for validity
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
` (8 preceding siblings ...)
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 09/10] migration: provide migrate_cap_add() Peter Xu
@ 2017-07-18 3:39 ` Peter Xu
2017-07-18 8:21 ` Juan Quintela
9 siblings, 1 reply; 13+ messages in thread
From: Peter Xu @ 2017-07-18 3:39 UTC (permalink / raw)
To: qemu-devel
Cc: Eduardo Habkost, Laurent Vivier, Peter Xu, Markus Armbruster,
Juan Quintela, Dr . David Alan Gilbert
Checks validity for all the capabilities that we enabled with command
line.
Signed-off-by: Peter Xu <peterx@redhat.com>
---
migration/migration.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/migration/migration.c b/migration/migration.c
index db869c4..cdcf989 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -2165,11 +2165,27 @@ static void migration_instance_init(Object *obj)
*/
static bool migration_object_check(MigrationState *ms, Error **errp)
{
+ MigrationCapabilityStatusList *head = NULL;
+ /* Assuming all off */
+ bool cap_list[MIGRATION_CAPABILITY__MAX] = { 0 }, ret;
+ int i;
+
if (!migrate_params_check(&ms->parameters, errp)) {
return false;
}
- return true;
+ for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) {
+ if (ms->enabled_capabilities[i]) {
+ head = migrate_cap_add(head, i, true);
+ }
+ }
+
+ ret = migrate_caps_check(cap_list, head, errp);
+
+ /* It works with head == NULL */
+ qapi_free_MigrationCapabilityStatusList(head);
+
+ return ret;
}
static const TypeInfo migration_type = {
--
2.7.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 06/10] migration: check global params for validity
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 06/10] migration: check global params for validity Peter Xu
@ 2017-07-18 8:20 ` Juan Quintela
0 siblings, 0 replies; 13+ messages in thread
From: Juan Quintela @ 2017-07-18 8:20 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, Eduardo Habkost, Laurent Vivier, Markus Armbruster,
Dr . David Alan Gilbert
Peter Xu <peterx@redhat.com> wrote:
> Adding validity check for the migration parameters passed in via global
> properties.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [Qemu-devel] [PATCH v3 10/10] migration: check global caps for validity
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 10/10] migration: check global caps for validity Peter Xu
@ 2017-07-18 8:21 ` Juan Quintela
0 siblings, 0 replies; 13+ messages in thread
From: Juan Quintela @ 2017-07-18 8:21 UTC (permalink / raw)
To: Peter Xu
Cc: qemu-devel, Eduardo Habkost, Laurent Vivier, Markus Armbruster,
Dr . David Alan Gilbert
Peter Xu <peterx@redhat.com> wrote:
> Checks validity for all the capabilities that we enabled with command
> line.
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2017-07-18 8:21 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-18 3:39 [Qemu-devel] [PATCH v3 00/10] migration: export cap/params to qdev props Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 01/10] qdev: provide DEFINE_PROP_INT64() Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 02/10] migration: export parameters to props Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 03/10] migration: export capabilities " Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 04/10] migration: introduce migrate_params_check() Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 05/10] migration: provide migrate_params_apply() Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 06/10] migration: check global params for validity Peter Xu
2017-07-18 8:20 ` Juan Quintela
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 07/10] migration: remove check against colo support Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 08/10] migration: provide migrate_caps_check() Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 09/10] migration: provide migrate_cap_add() Peter Xu
2017-07-18 3:39 ` [Qemu-devel] [PATCH v3 10/10] migration: check global caps for validity Peter Xu
2017-07-18 8:21 ` Juan Quintela
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).