Skip to content

Commit

Permalink
Add migration capabilities
Browse files Browse the repository at this point in the history
The management can query the current migration capabilities using
query-migrate-capabilities QMP command.
The user can use 'info migrate_capabilities' HMP command.
Currently only XBZRLE capability is available.

Signed-off-by: Orit Wasserman <owasserm@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>

Reviewed-by: Luiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
  • Loading branch information
oritwas authored and Juan Quintela committed Aug 8, 2012
1 parent c03b0aa commit bbf6da3
Show file tree
Hide file tree
Showing 8 changed files with 140 additions and 0 deletions.
2 changes: 2 additions & 0 deletions hmp-commands.hx
Expand Up @@ -1417,6 +1417,8 @@ show CPU statistics
show user network stack connection states
@item info migrate
show migration status
@item info migrate_capabilities
show current migration capabilities
@item info balloon
show balloon information
@item info qtree
Expand Down
33 changes: 33 additions & 0 deletions hmp.c
Expand Up @@ -131,8 +131,21 @@ void hmp_info_mice(Monitor *mon)
void hmp_info_migrate(Monitor *mon)
{
MigrationInfo *info;
MigrationCapabilityStatusList *caps, *cap;

info = qmp_query_migrate(NULL);
caps = qmp_query_migrate_capabilities(NULL);

/* do not display parameters during setup */
if (info->has_status && caps) {
monitor_printf(mon, "capabilities: ");
for (cap = caps; cap; cap = cap->next) {
monitor_printf(mon, "%s: %s ",
MigrationCapability_lookup[cap->value->capability],
cap->value->state ? "on" : "off");
}
monitor_printf(mon, "\n");
}

if (info->has_status) {
monitor_printf(mon, "Migration status: %s\n", info->status);
Expand All @@ -159,6 +172,26 @@ void hmp_info_migrate(Monitor *mon)
}

qapi_free_MigrationInfo(info);
qapi_free_MigrationCapabilityStatusList(caps);
}

void hmp_info_migrate_capabilities(Monitor *mon)
{
MigrationCapabilityStatusList *caps, *cap;

caps = qmp_query_migrate_capabilities(NULL);

if (caps) {
monitor_printf(mon, "capabilities: ");
for (cap = caps; cap; cap = cap->next) {
monitor_printf(mon, "%s: %s ",
MigrationCapability_lookup[cap->value->capability],
cap->value->state ? "on" : "off");
}
monitor_printf(mon, "\n");
}

qapi_free_MigrationCapabilityStatusList(caps);
}

void hmp_info_cpus(Monitor *mon)
Expand Down
1 change: 1 addition & 0 deletions hmp.h
Expand Up @@ -25,6 +25,7 @@ void hmp_info_uuid(Monitor *mon);
void hmp_info_chardev(Monitor *mon);
void hmp_info_mice(Monitor *mon);
void hmp_info_migrate(Monitor *mon);
void hmp_info_migrate_capabilities(Monitor *mon);
void hmp_info_cpus(Monitor *mon);
void hmp_info_block(Monitor *mon);
void hmp_info_blockstats(Monitor *mon);
Expand Down
30 changes: 30 additions & 0 deletions migration.c
Expand Up @@ -113,6 +113,30 @@ uint64_t migrate_max_downtime(void)
return max_downtime;
}

MigrationCapabilityStatusList *qmp_query_migrate_capabilities(Error **errp)
{
MigrationCapabilityStatusList *head = NULL;
MigrationCapabilityStatusList *caps;
MigrationState *s = migrate_get_current();
int i;

for (i = 0; i < MIGRATION_CAPABILITY_MAX; i++) {
if (head == NULL) {
head = g_malloc0(sizeof(*caps));
caps = head;
} else {
caps->next = g_malloc0(sizeof(*caps));
caps = caps->next;
}
caps->value =
g_malloc(sizeof(*caps->value));
caps->value->capability = i;
caps->value->state = s->enabled_capabilities[i];
}

return head;
}

MigrationInfo *qmp_query_migrate(Error **errp)
{
MigrationInfo *info = g_malloc0(sizeof(*info));
Expand Down Expand Up @@ -375,10 +399,16 @@ static MigrationState *migrate_init(const MigrationParams *params)
{
MigrationState *s = migrate_get_current();
int64_t bandwidth_limit = s->bandwidth_limit;
bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];

memcpy(enabled_capabilities, s->enabled_capabilities,
sizeof(enabled_capabilities));

memset(s, 0, sizeof(*s));
s->bandwidth_limit = bandwidth_limit;
s->params = *params;
memcpy(s->enabled_capabilities, enabled_capabilities,
sizeof(enabled_capabilities));

s->bandwidth_limit = bandwidth_limit;
s->state = MIG_STATE_SETUP;
Expand Down
2 changes: 2 additions & 0 deletions migration.h
Expand Up @@ -19,6 +19,7 @@
#include "notify.h"
#include "error.h"
#include "vmstate.h"
#include "qapi-types.h"

struct MigrationParams {
bool blk;
Expand All @@ -39,6 +40,7 @@ struct MigrationState
void *opaque;
MigrationParams params;
int64_t total_time;
bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
};

void process_incoming_migration(QEMUFile *f);
Expand Down
7 changes: 7 additions & 0 deletions monitor.c
Expand Up @@ -2654,6 +2654,13 @@ static mon_cmd_t info_cmds[] = {
.help = "show migration status",
.mhandler.info = hmp_info_migrate,
},
{
.name = "migrate_capabilities",
.args_type = "",
.params = "",
.help = "show current migration capabilities",
.mhandler.info = hmp_info_migrate_capabilities,
},
{
.name = "balloon",
.args_type = "",
Expand Down
39 changes: 39 additions & 0 deletions qapi-schema.json
Expand Up @@ -305,6 +305,45 @@
##
{ 'command': 'query-migrate', 'returns': 'MigrationInfo' }

##
# @MigrationCapability
#
# Migration capabilities enumeration
#
# @xbzrle: Migration supports xbzrle (Xor Based Zero Run Length Encoding).
# This feature allows us to minimize migration traffic for certain work
# loads, by sending compressed difference of the pages
#
# Since: 1.2
##
{ 'enum': 'MigrationCapability',
'data': ['xbzrle'] }

##
# @MigrationCapabilityStatus
#
# Migration capability information
#
# @capability: capability enum
#
# @state: capability state bool
#
# Since: 1.2
##
{ 'type': 'MigrationCapabilityStatus',
'data': { 'capability' : 'MigrationCapability', 'state' : 'bool' } }

##
# @query-migrate-capabilities
#
# Returns information about the current migration capabilities status
#
# Returns: @MigrationCapabilitiesStatus
#
# Since: 1.2
##
{ 'command': 'query-migrate-capabilities', 'returns': ['MigrationCapabilityStatus']}

##
# @MouseInfo:
#
Expand Down
26 changes: 26 additions & 0 deletions qmp-commands.hx
Expand Up @@ -2142,6 +2142,32 @@ EQMP
.mhandler.cmd_new = qmp_marshal_input_query_migrate,
},

SQMP
query-migrate-capabilities
-------

Query current migration capabilities

- "capabilities": migration capabilities state
- "xbzrle" : XBZRLE state (json-bool)

Arguments:

Example:

-> { "execute": "query-migrate-capabilities" }
<- { "return": {
"capabilities" : [ { "capability" : "xbzrle", "state" : false } ]
}
}
EQMP

{
.name = "query-migrate-capabilities",
.args_type = "",
.mhandler.cmd_new = qmp_marshal_input_query_migrate_capabilities,
},

SQMP
query-balloon
-------------
Expand Down

0 comments on commit bbf6da3

Please sign in to comment.