Add migrate_set_cache_size command
Change XBZRLE cache size in bytes (the size should be a power of 2, it will be rounded down to the nearest power of 2). If XBZRLE cache size is too small there will be many cache miss. New query-migrate-cache-size QMP command and 'info migrate_cache_size' HMP command to query cache value. Signed-off-by: Benoit Hudzia <benoit.hudzia@sap.com> Signed-off-by: Petter Svard <petters@cs.umu.se> Signed-off-by: Aidan Shribman <aidan.shribman@sap.com> Signed-off-by: Orit Wasserman <owasserm@redhat.com> Reviewed-by: Luiz Capitulino <lcapitulino@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
17ad9b358b
commit
9e1ba4cc4e
10
arch_init.c
10
arch_init.c
@ -191,6 +191,16 @@ static struct {
|
||||
.cache = NULL,
|
||||
};
|
||||
|
||||
|
||||
int64_t xbzrle_cache_resize(int64_t new_size)
|
||||
{
|
||||
if (XBZRLE.cache != NULL) {
|
||||
return cache_resize(XBZRLE.cache, new_size / TARGET_PAGE_SIZE) *
|
||||
TARGET_PAGE_SIZE;
|
||||
}
|
||||
return pow2floor(new_size);
|
||||
}
|
||||
|
||||
static void save_block_hdr(QEMUFile *f, RAMBlock *block, ram_addr_t offset,
|
||||
int cont, int flag)
|
||||
{
|
||||
|
@ -829,6 +829,26 @@ STEXI
|
||||
@item migrate_cancel
|
||||
@findex migrate_cancel
|
||||
Cancel the current VM migration.
|
||||
|
||||
ETEXI
|
||||
|
||||
{
|
||||
.name = "migrate_set_cache_size",
|
||||
.args_type = "value:o",
|
||||
.params = "value",
|
||||
.help = "set cache size (in bytes) for XBZRLE migrations,"
|
||||
"the cache size will be rounded down to the nearest "
|
||||
"power of 2.\n"
|
||||
"The cache size affects the number of cache misses."
|
||||
"In case of a high cache miss ratio you need to increase"
|
||||
" the cache size",
|
||||
.mhandler.cmd = hmp_migrate_set_cache_size,
|
||||
},
|
||||
|
||||
STEXI
|
||||
@item migrate_set_cache_size @var{value}
|
||||
@findex migrate_set_cache_size
|
||||
Set cache size to @var{value} (in bytes) for xbzrle migrations.
|
||||
ETEXI
|
||||
|
||||
{
|
||||
@ -1433,6 +1453,8 @@ show user network stack connection states
|
||||
show migration status
|
||||
@item info migrate_capabilities
|
||||
show current migration capabilities
|
||||
@item info migrate_cache_size
|
||||
show current migration XBZRLE cache size
|
||||
@item info balloon
|
||||
show balloon information
|
||||
@item info qtree
|
||||
|
19
hmp.c
19
hmp.c
@ -194,6 +194,12 @@ void hmp_info_migrate_capabilities(Monitor *mon)
|
||||
qapi_free_MigrationCapabilityStatusList(caps);
|
||||
}
|
||||
|
||||
void hmp_info_migrate_cache_size(Monitor *mon)
|
||||
{
|
||||
monitor_printf(mon, "xbzrel cache size: %" PRId64 " kbytes\n",
|
||||
qmp_query_migrate_cache_size(NULL) >> 10);
|
||||
}
|
||||
|
||||
void hmp_info_cpus(Monitor *mon)
|
||||
{
|
||||
CpuInfoList *cpu_list, *cpu;
|
||||
@ -764,6 +770,19 @@ void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict)
|
||||
qmp_migrate_set_downtime(value, NULL);
|
||||
}
|
||||
|
||||
void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
int64_t value = qdict_get_int(qdict, "value");
|
||||
Error *err = NULL;
|
||||
|
||||
qmp_migrate_set_cache_size(value, &err);
|
||||
if (err) {
|
||||
monitor_printf(mon, "%s\n", error_get_pretty(err));
|
||||
error_free(err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
int64_t value = qdict_get_int(qdict, "value");
|
||||
|
2
hmp.h
2
hmp.h
@ -26,6 +26,7 @@ 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_migrate_cache_size(Monitor *mon);
|
||||
void hmp_info_cpus(Monitor *mon);
|
||||
void hmp_info_block(Monitor *mon);
|
||||
void hmp_info_blockstats(Monitor *mon);
|
||||
@ -53,6 +54,7 @@ void hmp_migrate_cancel(Monitor *mon, const QDict *qdict);
|
||||
void hmp_migrate_set_downtime(Monitor *mon, const QDict *qdict);
|
||||
void hmp_migrate_set_speed(Monitor *mon, const QDict *qdict);
|
||||
void hmp_migrate_set_capability(Monitor *mon, const QDict *qdict);
|
||||
void hmp_migrate_set_cache_size(Monitor *mon, const QDict *qdict);
|
||||
void hmp_set_password(Monitor *mon, const QDict *qdict);
|
||||
void hmp_expire_password(Monitor *mon, const QDict *qdict);
|
||||
void hmp_eject(Monitor *mon, const QDict *qdict);
|
||||
|
19
migration.c
19
migration.c
@ -511,6 +511,25 @@ void qmp_migrate_cancel(Error **errp)
|
||||
migrate_fd_cancel(migrate_get_current());
|
||||
}
|
||||
|
||||
void qmp_migrate_set_cache_size(int64_t value, Error **errp)
|
||||
{
|
||||
MigrationState *s = migrate_get_current();
|
||||
|
||||
/* Check for truncation */
|
||||
if (value != (size_t)value) {
|
||||
error_set(errp, QERR_INVALID_PARAMETER_VALUE, "cache size",
|
||||
"exceeding address space");
|
||||
return;
|
||||
}
|
||||
|
||||
s->xbzrle_cache_size = xbzrle_cache_resize(value);
|
||||
}
|
||||
|
||||
int64_t qmp_query_migrate_cache_size(Error **errp)
|
||||
{
|
||||
return migrate_xbzrle_cache_size();
|
||||
}
|
||||
|
||||
void qmp_migrate_set_speed(int64_t value, Error **errp)
|
||||
{
|
||||
MigrationState *s;
|
||||
|
@ -108,4 +108,6 @@ int xbzrle_decode_buffer(uint8_t *src, int slen, uint8_t *dst, int dlen);
|
||||
int migrate_use_xbzrle(void);
|
||||
int64_t migrate_xbzrle_cache_size(void);
|
||||
|
||||
int64_t xbzrle_cache_resize(int64_t new_size);
|
||||
|
||||
#endif
|
||||
|
@ -2661,6 +2661,13 @@ static mon_cmd_t info_cmds[] = {
|
||||
.help = "show current migration capabilities",
|
||||
.mhandler.info = hmp_info_migrate_capabilities,
|
||||
},
|
||||
{
|
||||
.name = "migrate_cache_size",
|
||||
.args_type = "",
|
||||
.params = "",
|
||||
.help = "show current migration xbzrle cache size",
|
||||
.mhandler.info = hmp_info_migrate_cache_size,
|
||||
},
|
||||
{
|
||||
.name = "balloon",
|
||||
.args_type = "",
|
||||
|
@ -1394,6 +1394,33 @@
|
||||
##
|
||||
{ 'command': 'migrate_set_speed', 'data': {'value': 'int'} }
|
||||
|
||||
##
|
||||
# @migrate-set-cache-size
|
||||
#
|
||||
# Set XBZRLE cache size
|
||||
#
|
||||
# @value: cache size in bytes
|
||||
#
|
||||
# The size will be rounded down to the nearest power of 2.
|
||||
# The cache size can be modified before and during ongoing migration
|
||||
#
|
||||
# Returns: nothing on success
|
||||
#
|
||||
# Since: 1.2
|
||||
##
|
||||
{ 'command': 'migrate-set-cache-size', 'data': {'value': 'int'} }
|
||||
|
||||
##
|
||||
# @query-migrate-cache-size
|
||||
#
|
||||
# query XBZRLE cache size
|
||||
#
|
||||
# Returns: XBZRLE cache size in bytes
|
||||
#
|
||||
# Since: 1.2
|
||||
##
|
||||
{ 'command': 'query-migrate-cache-size', 'returns': 'int' }
|
||||
|
||||
##
|
||||
# @ObjectPropertyInfo:
|
||||
#
|
||||
|
@ -519,6 +519,50 @@ Example:
|
||||
-> { "execute": "migrate_cancel" }
|
||||
<- { "return": {} }
|
||||
|
||||
EQMP
|
||||
{
|
||||
.name = "migrate-set-cache-size",
|
||||
.args_type = "value:o",
|
||||
.mhandler.cmd_new = qmp_marshal_input_migrate_set_cache_size,
|
||||
},
|
||||
|
||||
SQMP
|
||||
migrate-set-cache-size
|
||||
---------------------
|
||||
|
||||
Set cache size to be used by XBZRLE migration, the cache size will be rounded
|
||||
down to the nearest power of 2
|
||||
|
||||
Arguments:
|
||||
|
||||
- "value": cache size in bytes (json-int)
|
||||
|
||||
Example:
|
||||
|
||||
-> { "execute": "migrate-set-cache-size", "arguments": { "value": 536870912 } }
|
||||
<- { "return": {} }
|
||||
|
||||
EQMP
|
||||
{
|
||||
.name = "query-migrate-cache-size",
|
||||
.args_type = "",
|
||||
.mhandler.cmd_new = qmp_marshal_input_query_migrate_cache_size,
|
||||
},
|
||||
|
||||
SQMP
|
||||
query-migrate-cache-size
|
||||
---------------------
|
||||
|
||||
Show cache size to be used by XBZRLE migration
|
||||
|
||||
returns a json-object with the following information:
|
||||
- "size" : json-int
|
||||
|
||||
Example:
|
||||
|
||||
-> { "execute": "query-migrate-cache-size" }
|
||||
<- { "return": 67108864 }
|
||||
|
||||
EQMP
|
||||
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user