Skip to content

Commit

Permalink
migration: Check in savevm_state_handler_insert for dups
Browse files Browse the repository at this point in the history
Before finally register one SaveStateEntry, we detect for duplicated
entries.  This could be helpful to notify us asap instead of get
silent migration failures which could be hard to diagnose.

For example, this patch will generate a message like this (if without
previous fixes on x2apic) as long as we wants to boot a VM instance
with "-smp 200,maxcpus=288,sockets=2,cores=72,threads=2" and QEMU will
bail out even before VM starts:

savevm_state_handler_insert: Detected duplicate SaveStateEntry: id=apic, instance_id=0x0

Suggested-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Message-ID: <20231020090731.28701-10-quintela@redhat.com>
  • Loading branch information
xzpeter authored and Juan Quintela committed Oct 24, 2023
1 parent 49d9a71 commit 23c0efc
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions migration/savevm.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,8 @@ static SaveState savevm_state = {
.global_section_id = 0,
};

static SaveStateEntry *find_se(const char *idstr, uint32_t instance_id);

static bool should_validate_capability(int capability)
{
assert(capability >= 0 && capability < MIGRATION_CAPABILITY__MAX);
Expand Down Expand Up @@ -716,6 +718,18 @@ static void savevm_state_handler_insert(SaveStateEntry *nse)

assert(priority <= MIG_PRI_MAX);

/*
* This should never happen otherwise migration will probably fail
* silently somewhere because we can be wrongly applying one
* object properties upon another one. Bail out ASAP.
*/
if (find_se(nse->idstr, nse->instance_id)) {
error_report("%s: Detected duplicate SaveStateEntry: "
"id=%s, instance_id=0x%"PRIx32, __func__,
nse->idstr, nse->instance_id);
exit(EXIT_FAILURE);
}

for (i = priority - 1; i >= 0; i--) {
se = savevm_state.handler_pri_head[i];
if (se != NULL) {
Expand Down

0 comments on commit 23c0efc

Please sign in to comment.