migration: Add blocker information
Modify query-migrate so that it has a flag indicating if outbound migration is blocked, and if it is a list of reasons. Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Message-Id: <20210202135522.127380-2-dgilbert@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Peter Xu <peterx@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
54270c450a
commit
3af8554bd0
@ -174,6 +174,8 @@ INITIALIZE_MIGRATE_CAPS_SET(check_caps_background_snapshot,
|
|||||||
static MigrationState *current_migration;
|
static MigrationState *current_migration;
|
||||||
static MigrationIncomingState *current_incoming;
|
static MigrationIncomingState *current_incoming;
|
||||||
|
|
||||||
|
static GSList *migration_blockers;
|
||||||
|
|
||||||
static bool migration_object_check(MigrationState *ms, Error **errp);
|
static bool migration_object_check(MigrationState *ms, Error **errp);
|
||||||
static int migration_maybe_pause(MigrationState *s,
|
static int migration_maybe_pause(MigrationState *s,
|
||||||
int *current_active_state,
|
int *current_active_state,
|
||||||
@ -1074,6 +1076,27 @@ static void fill_source_migration_info(MigrationInfo *info)
|
|||||||
{
|
{
|
||||||
MigrationState *s = migrate_get_current();
|
MigrationState *s = migrate_get_current();
|
||||||
|
|
||||||
|
info->blocked = migration_is_blocked(NULL);
|
||||||
|
info->has_blocked_reasons = info->blocked;
|
||||||
|
info->blocked_reasons = NULL;
|
||||||
|
if (info->blocked) {
|
||||||
|
GSList *cur_blocker = migration_blockers;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There are two types of reasons a migration might be blocked;
|
||||||
|
* a) devices marked in VMState as non-migratable, and
|
||||||
|
* b) Explicit migration blockers
|
||||||
|
* We need to add both of them here.
|
||||||
|
*/
|
||||||
|
qemu_savevm_non_migratable_list(&info->blocked_reasons);
|
||||||
|
|
||||||
|
while (cur_blocker) {
|
||||||
|
QAPI_LIST_PREPEND(info->blocked_reasons,
|
||||||
|
g_strdup(error_get_pretty(cur_blocker->data)));
|
||||||
|
cur_blocker = g_slist_next(cur_blocker);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (s->state) {
|
switch (s->state) {
|
||||||
case MIGRATION_STATUS_NONE:
|
case MIGRATION_STATUS_NONE:
|
||||||
/* no migration has happened ever */
|
/* no migration has happened ever */
|
||||||
@ -2025,8 +2048,6 @@ void migrate_init(MigrationState *s)
|
|||||||
s->threshold_size = 0;
|
s->threshold_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GSList *migration_blockers;
|
|
||||||
|
|
||||||
int migrate_add_blocker(Error *reason, Error **errp)
|
int migrate_add_blocker(Error *reason, Error **errp)
|
||||||
{
|
{
|
||||||
if (only_migratable) {
|
if (only_migratable) {
|
||||||
|
@ -1154,6 +1154,19 @@ bool qemu_savevm_state_blocked(Error **errp)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void qemu_savevm_non_migratable_list(strList **reasons)
|
||||||
|
{
|
||||||
|
SaveStateEntry *se;
|
||||||
|
|
||||||
|
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
|
||||||
|
if (se->vmsd && se->vmsd->unmigratable) {
|
||||||
|
QAPI_LIST_PREPEND(*reasons,
|
||||||
|
g_strdup_printf("non-migratable device: %s",
|
||||||
|
se->idstr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void qemu_savevm_state_header(QEMUFile *f)
|
void qemu_savevm_state_header(QEMUFile *f)
|
||||||
{
|
{
|
||||||
trace_savevm_state_header();
|
trace_savevm_state_header();
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#define QEMU_VM_SECTION_FOOTER 0x7e
|
#define QEMU_VM_SECTION_FOOTER 0x7e
|
||||||
|
|
||||||
bool qemu_savevm_state_blocked(Error **errp);
|
bool qemu_savevm_state_blocked(Error **errp);
|
||||||
|
void qemu_savevm_non_migratable_list(strList **reasons);
|
||||||
void qemu_savevm_state_setup(QEMUFile *f);
|
void qemu_savevm_state_setup(QEMUFile *f);
|
||||||
bool qemu_savevm_state_guest_unplug_pending(void);
|
bool qemu_savevm_state_guest_unplug_pending(void);
|
||||||
int qemu_savevm_state_resume_prepare(MigrationState *s);
|
int qemu_savevm_state_resume_prepare(MigrationState *s);
|
||||||
|
@ -224,6 +224,10 @@
|
|||||||
# only returned if VFIO device is present, migration is supported by all
|
# only returned if VFIO device is present, migration is supported by all
|
||||||
# VFIO devices and status is 'active' or 'completed' (since 5.2)
|
# VFIO devices and status is 'active' or 'completed' (since 5.2)
|
||||||
#
|
#
|
||||||
|
# @blocked: True if outgoing migration is blocked (since 6.0)
|
||||||
|
#
|
||||||
|
# @blocked-reasons: A list of reasons an outgoing migration is blocked (since 6.0)
|
||||||
|
#
|
||||||
# Since: 0.14
|
# Since: 0.14
|
||||||
##
|
##
|
||||||
{ 'struct': 'MigrationInfo',
|
{ 'struct': 'MigrationInfo',
|
||||||
@ -237,6 +241,8 @@
|
|||||||
'*setup-time': 'int',
|
'*setup-time': 'int',
|
||||||
'*cpu-throttle-percentage': 'int',
|
'*cpu-throttle-percentage': 'int',
|
||||||
'*error-desc': 'str',
|
'*error-desc': 'str',
|
||||||
|
'blocked': 'bool',
|
||||||
|
'*blocked-reasons': ['str'],
|
||||||
'*postcopy-blocktime' : 'uint32',
|
'*postcopy-blocktime' : 'uint32',
|
||||||
'*postcopy-vcpu-blocktime': ['uint32'],
|
'*postcopy-vcpu-blocktime': ['uint32'],
|
||||||
'*compression': 'CompressionStats',
|
'*compression': 'CompressionStats',
|
||||||
|
Loading…
Reference in New Issue
Block a user