From: Juan Quintela <quintela@redhat.com>
To: qemu-devel@nongnu.org
Cc: David Hildenbrand <david@redhat.com>,
Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>,
John Snow <jsnow@redhat.com>,
Stefan Hajnoczi <stefanha@redhat.com>,
Juan Quintela <quintela@redhat.com>,
qemu-block@nongnu.org, Hailiang Zhang <zhanghailiang@xfusion.com>,
Fam Zheng <fam@euphon.net>, "Michael S. Tsirkin" <mst@redhat.com>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
Eric Blake <eblake@redhat.com>
Subject: [PATCH 02/43] migration: Pass migrate_caps_check() the old and new caps
Date: Thu, 2 Mar 2023 17:33:29 +0100 [thread overview]
Message-ID: <20230302163410.11399-3-quintela@redhat.com> (raw)
In-Reply-To: <20230302163410.11399-1-quintela@redhat.com>
We used to pass the old capabilities array and the new
capabilities as a list.
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
migration/migration.c | 80 +++++++++++++++++--------------------------
1 file changed, 31 insertions(+), 49 deletions(-)
diff --git a/migration/migration.c b/migration/migration.c
index f7e7c4f2b3..119027a656 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -1267,30 +1267,20 @@ WriteTrackingSupport migrate_query_write_tracking(void)
}
/**
- * @migration_caps_check - check capability validity
+ * @migration_caps_check - check capability compatibility
*
- * @cap_list: old capability list, array of bool
- * @params: new capabilities to be applied soon
+ * @old_caps: old capability list
+ * @new_caps: new capability list
* @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)
+static bool migrate_caps_check(bool *old_caps, bool *new_caps, Error **errp)
{
- MigrationCapabilityStatusList *cap;
- bool old_postcopy_cap;
MigrationIncomingState *mis = migration_incoming_get_current();
- 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_list[MIGRATION_CAPABILITY_BLOCK]) {
+ if (new_caps[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");
@@ -1299,7 +1289,7 @@ static bool migrate_caps_check(bool *cap_list,
#endif
#ifndef CONFIG_REPLICATION
- if (cap_list[MIGRATION_CAPABILITY_X_COLO]) {
+ if (new_caps[MIGRATION_CAPABILITY_X_COLO]) {
error_setg(errp, "QEMU compiled without replication module"
" can't enable COLO");
error_append_hint(errp, "Please enable replication before COLO.\n");
@@ -1307,12 +1297,13 @@ static bool migrate_caps_check(bool *cap_list,
}
#endif
- if (cap_list[MIGRATION_CAPABILITY_POSTCOPY_RAM]) {
+ if (new_caps[MIGRATION_CAPABILITY_POSTCOPY_RAM]) {
/* 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.
*/
- if (!old_postcopy_cap && runstate_check(RUN_STATE_INMIGRATE) &&
+ if (!old_caps[MIGRATION_CAPABILITY_POSTCOPY_RAM] &&
+ runstate_check(RUN_STATE_INMIGRATE) &&
!postcopy_ram_supported_by_host(mis)) {
/* postcopy_ram_supported_by_host will have emitted a more
* detailed message
@@ -1321,13 +1312,13 @@ static bool migrate_caps_check(bool *cap_list,
return false;
}
- if (cap_list[MIGRATION_CAPABILITY_X_IGNORE_SHARED]) {
+ if (new_caps[MIGRATION_CAPABILITY_X_IGNORE_SHARED]) {
error_setg(errp, "Postcopy is not compatible with ignore-shared");
return false;
}
}
- if (cap_list[MIGRATION_CAPABILITY_BACKGROUND_SNAPSHOT]) {
+ if (new_caps[MIGRATION_CAPABILITY_BACKGROUND_SNAPSHOT]) {
WriteTrackingSupport wt_support;
int idx;
/*
@@ -1351,7 +1342,7 @@ static bool migrate_caps_check(bool *cap_list,
*/
for (idx = 0; idx < check_caps_background_snapshot.size; idx++) {
int incomp_cap = check_caps_background_snapshot.caps[idx];
- if (cap_list[incomp_cap]) {
+ if (new_caps[incomp_cap]) {
error_setg(errp,
"Background-snapshot is not compatible with %s",
MigrationCapability_str(incomp_cap));
@@ -1361,10 +1352,10 @@ static bool migrate_caps_check(bool *cap_list,
}
#ifdef CONFIG_LINUX
- if (cap_list[MIGRATION_CAPABILITY_ZERO_COPY_SEND] &&
- (!cap_list[MIGRATION_CAPABILITY_MULTIFD] ||
- cap_list[MIGRATION_CAPABILITY_COMPRESS] ||
- cap_list[MIGRATION_CAPABILITY_XBZRLE] ||
+ if (new_caps[MIGRATION_CAPABILITY_ZERO_COPY_SEND] &&
+ (!new_caps[MIGRATION_CAPABILITY_MULTIFD] ||
+ new_caps[MIGRATION_CAPABILITY_COMPRESS] ||
+ new_caps[MIGRATION_CAPABILITY_XBZRLE] ||
migrate_multifd_compression() ||
migrate_use_tls())) {
error_setg(errp,
@@ -1372,15 +1363,15 @@ static bool migrate_caps_check(bool *cap_list,
return false;
}
#else
- if (cap_list[MIGRATION_CAPABILITY_ZERO_COPY_SEND]) {
+ if (new_caps[MIGRATION_CAPABILITY_ZERO_COPY_SEND]) {
error_setg(errp,
"Zero copy currently only available on Linux");
return false;
}
#endif
- if (cap_list[MIGRATION_CAPABILITY_POSTCOPY_PREEMPT]) {
- if (!cap_list[MIGRATION_CAPABILITY_POSTCOPY_RAM]) {
+ if (new_caps[MIGRATION_CAPABILITY_POSTCOPY_PREEMPT]) {
+ if (!new_caps[MIGRATION_CAPABILITY_POSTCOPY_RAM]) {
error_setg(errp, "Postcopy preempt requires postcopy-ram");
return false;
}
@@ -1391,14 +1382,14 @@ static bool migrate_caps_check(bool *cap_list,
* different compression channels, which is not compatible with the
* preempt assumptions on channel assignments.
*/
- if (cap_list[MIGRATION_CAPABILITY_COMPRESS]) {
+ if (new_caps[MIGRATION_CAPABILITY_COMPRESS]) {
error_setg(errp, "Postcopy preempt not compatible with compress");
return false;
}
}
- if (cap_list[MIGRATION_CAPABILITY_MULTIFD]) {
- if (cap_list[MIGRATION_CAPABILITY_COMPRESS]) {
+ if (new_caps[MIGRATION_CAPABILITY_MULTIFD]) {
+ if (new_caps[MIGRATION_CAPABILITY_COMPRESS]) {
error_setg(errp, "Multifd is not compatible with compress");
return false;
}
@@ -1454,15 +1445,19 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
{
MigrationState *s = migrate_get_current();
MigrationCapabilityStatusList *cap;
- bool cap_list[MIGRATION_CAPABILITY__MAX];
+ bool new_caps[MIGRATION_CAPABILITY__MAX];
if (migration_is_running(s->state)) {
error_setg(errp, QERR_MIGRATION_ACTIVE);
return;
}
- memcpy(cap_list, s->capabilities, sizeof(cap_list));
- if (!migrate_caps_check(cap_list, params, errp)) {
+ memcpy(new_caps, s->capabilities, sizeof(new_caps));
+ for (cap = params; cap; cap = cap->next) {
+ new_caps[cap->value->capability] = cap->value->state;
+ }
+
+ if (!migrate_caps_check(s->capabilities, new_caps, errp)) {
return;
}
@@ -4566,27 +4561,14 @@ 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;
+ bool old_caps[MIGRATION_CAPABILITY__MAX] = { 0 };
if (!migrate_params_check(&ms->parameters, errp)) {
return false;
}
- for (i = 0; i < MIGRATION_CAPABILITY__MAX; i++) {
- if (ms->capabilities[i]) {
- QAPI_LIST_PREPEND(head, migrate_cap_add(i, true));
- }
- }
-
- ret = migrate_caps_check(cap_list, head, errp);
-
- /* It works with head == NULL */
- qapi_free_MigrationCapabilityStatusList(head);
-
- return ret;
+ return migrate_caps_check(old_caps, ms->capabilities, errp);
}
static const TypeInfo migration_type = {
--
2.39.2
next prev parent reply other threads:[~2023-03-02 16:37 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-02 16:33 [PATCH 00/43] Migration: Create options.c for capabilities/params/properties Juan Quintela
2023-03-02 16:33 ` [PATCH 01/43] migration: rename enabled_capabilities to capabilities Juan Quintela
2023-03-06 14:27 ` Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` Juan Quintela [this message]
2023-03-06 14:40 ` [PATCH 02/43] migration: Pass migrate_caps_check() the old and new caps Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` [PATCH 03/43] migration: Create migration_cap_set() Juan Quintela
2023-03-08 10:47 ` Dr. David Alan Gilbert
2023-04-20 12:32 ` Juan Quintela
2023-03-02 16:33 ` [PATCH 04/43] migration: create options.c Juan Quintela
2023-03-08 9:46 ` Dr. David Alan Gilbert
2023-04-20 13:02 ` Juan Quintela
2023-03-02 16:33 ` [PATCH 05/43] migration: Move migrate_colo_enabled() to options.c Juan Quintela
2023-04-20 12:54 ` Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` [PATCH 06/43] migration: Move migrate_use_compression() " Juan Quintela
2023-04-20 12:58 ` Vladimir Sementsov-Ogievskiy
2023-04-20 13:32 ` Juan Quintela
2023-03-02 16:33 ` [PATCH 07/43] migration: Move migrate_use_events() " Juan Quintela
2023-04-20 13:00 ` Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` [PATCH 08/43] migration: Move migrate_use_multifd() " Juan Quintela
2023-04-20 13:01 ` Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` [PATCH 09/43] migration: Move migrate_use_zero_copy_send() " Juan Quintela
2023-04-20 13:06 ` Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` [PATCH 10/43] migration: Move migrate_use_xbzrle() " Juan Quintela
2023-04-20 13:07 ` Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` [PATCH 11/43] migration: Move migrate_use_block() " Juan Quintela
2023-04-20 13:08 ` Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` [PATCH 12/43] migration: Move migrate_use_return() " Juan Quintela
2023-04-20 13:09 ` Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` [PATCH 13/43] migration: Create migrate_rdma_pin_all() function Juan Quintela
2023-04-20 13:12 ` Vladimir Sementsov-Ogievskiy
2023-03-02 16:33 ` [PATCH 14/43] migration: Move migrate_caps_check() to options.c Juan Quintela
2023-03-02 16:33 ` [PATCH 15/43] migration: Move qmp_query_migrate_capabilities() " Juan Quintela
2023-03-02 16:33 ` [PATCH 16/43] migration: Move qmp_migrate_set_capabilities() " Juan Quintela
2023-03-02 16:33 ` [PATCH 17/43] migration: Move migrate_cap_set() " Juan Quintela
2023-03-02 16:33 ` [PATCH 18/43] migration: Move parameters functions to option.c Juan Quintela
2023-03-02 16:33 ` [PATCH 19/43] migration: Use migrate_max_postcopy_bandwidth() Juan Quintela
2023-03-02 16:33 ` [PATCH 20/43] migration: Move migrate_use_block_incremental() to option.c Juan Quintela
2023-03-02 16:33 ` [PATCH 21/43] migration: Create migrate_throttle_trigger_threshold() Juan Quintela
2023-03-02 16:33 ` [PATCH 22/43] migration: Create migrate_checkpoint_delay() Juan Quintela
2023-03-02 16:33 ` [PATCH 23/43] migration: Create migrate_max_cpu_throttle() Juan Quintela
2023-03-02 16:33 ` [PATCH 24/43] migration: Move migrate_announce_params() to option.c Juan Quintela
2023-03-02 16:33 ` [PATCH 25/43] migration: Create migrate_cpu_throttle_initial() " Juan Quintela
2023-03-02 16:33 ` [PATCH 26/43] migration: Create migrate_cpu_throttle_increment() function Juan Quintela
2023-03-02 16:33 ` [PATCH 27/43] migration: Create migrate_cpu_throttle_tailslow() function Juan Quintela
2023-03-02 16:33 ` [PATCH 28/43] migration: Move migrate_use_tls() to options.c Juan Quintela
2023-03-02 16:33 ` [PATCH 29/43] migration: Move migrate_postcopy() " Juan Quintela
2023-03-02 16:33 ` [PATCH 30/43] migration: Create migrate_max_bandwidth() function Juan Quintela
2023-03-02 16:33 ` [PATCH 31/43] migration: Move qmp_query_migrate_parameters() to options.c Juan Quintela
2023-03-02 16:33 ` [PATCH 32/43] migration: Move qmp_migrate_set_parameters() " Juan Quintela
2023-03-02 16:34 ` [PATCH 33/43] migration: Create migrate_params_init() function Juan Quintela
2023-03-02 16:34 ` [PATCH 34/43] migration: Make all functions check have the same format Juan Quintela
2023-03-02 16:34 ` [PATCH 35/43] migration: Create migrate_downtime_limit() function Juan Quintela
2023-03-02 16:34 ` [PATCH 36/43] migration: Move migrate_set_block_incremental() to options.c Juan Quintela
2023-03-02 16:34 ` [PATCH 37/43] migration: Move block_cleanup_parameters() " Juan Quintela
2023-03-02 16:34 ` [PATCH 38/43] migration: Remove MigrationState from block_cleanup_parameters() Juan Quintela
2023-03-02 16:34 ` [PATCH 39/43] migration: Create migrate_tls_creds() function Juan Quintela
2023-03-02 16:34 ` [PATCH 40/43] migration: Create migrate_tls_authz() function Juan Quintela
2023-03-02 16:34 ` [PATCH 41/43] migration: Create migrate_tls_hostname() function Juan Quintela
2023-03-02 16:34 ` [PATCH 42/43] migration: Create migrate_block_bitmap_mapping() function Juan Quintela
2023-03-02 16:34 ` [PATCH 43/43] migration: Move migration_properties to options.c Juan Quintela
2023-03-06 14:29 ` [PATCH 00/43] Migration: Create options.c for capabilities/params/properties Vladimir Sementsov-Ogievskiy
2023-04-20 13:08 ` Juan Quintela
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230302163410.11399-3-quintela@redhat.com \
--to=quintela@redhat.com \
--cc=david@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=fam@euphon.net \
--cc=jsnow@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
--cc=vsementsov@yandex-team.ru \
--cc=zhanghailiang@xfusion.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).