Signed-off-by: Orit Wasserman <owass...@redhat.com> --- arch_init.c | 5 +++++ migration.c | 8 ++++++++ migration.h | 4 ++++ savevm.c | 9 ++++++--- 4 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/arch_init.c b/arch_init.c index 4ebf080..f864585 100644 --- a/arch_init.c +++ b/arch_init.c @@ -179,6 +179,11 @@ typedef struct ArchMigrationState { static ArchMigrationState arch_mig_state; +void arch_set_params(const MigrationParams *params, void *opaque) +{ + arch_mig_state.use_xbzrle = params->use_xbzrle; + arch_mig_state.xbzrle_cache_size = params->xbzrle_cache_size; +} /***********************************************************/ /* XBRLE page cache implementation */ static CacheItem *cache_item_get(unsigned long pos, int item) diff --git a/migration.c b/migration.c index c90740a..ce039e3 100644 --- a/migration.c +++ b/migration.c @@ -43,6 +43,11 @@ enum { #define MAX_THROTTLE (32 << 20) /* Migration speed throttling */ +/* Migration XBZRLE cache size */ +#define DEFAULT_MIGRATE_CACHE_SIZE (64 * 1024 * 1024) + +static int64_t migrate_cache_size = DEFAULT_MIGRATE_CACHE_SIZE; + static NotifierList migration_state_notifiers = NOTIFIER_LIST_INITIALIZER(migration_state_notifiers); @@ -425,6 +430,9 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data) params.blk = qdict_get_try_bool(qdict, "blk", 0); params.shared = qdict_get_try_bool(qdict, "inc", 0); + params.use_xbzrle = qdict_get_try_bool(qdict, "xbzrle", 0); + params.xbzrle_cache_size = migrate_cache_size; + if (s->state == MIG_STATE_ACTIVE) { monitor_printf(mon, "migration already in progress\n"); return -1; diff --git a/migration.h b/migration.h index 6362136..7e1c7c0 100644 --- a/migration.h +++ b/migration.h @@ -22,6 +22,8 @@ struct MigrationParams { int blk; int shared; + int use_xbzrle; + int64_t xbzrle_cache_size; }; typedef struct MigrationState MigrationState; @@ -107,4 +109,6 @@ int encode_page(uint8_t *old_buf, uint8_t *new_buf, int slen, uint8_t *dst, int dlen); int decode_page(uint8_t *src, int slen, uint8_t *dst, int dlen); +void arch_set_params(const MigrationParams *params, void *opaque); + #endif diff --git a/savevm.c b/savevm.c index 2d36d0c..bb93429 100644 --- a/savevm.c +++ b/savevm.c @@ -1278,7 +1278,8 @@ int register_savevm(DeviceState *dev, void *opaque) { return register_savevm_live(dev, idstr, instance_id, version_id, - NULL, NULL, save_state, load_state, opaque); + arch_set_params, NULL, save_state, + load_state, opaque); } void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque) @@ -1566,7 +1567,7 @@ int qemu_savevm_state_begin(Monitor *mon, QEMUFile *f, } se->set_params(params, se->opaque); } - + qemu_put_be32(f, QEMU_VM_FILE_MAGIC); qemu_put_be32(f, QEMU_VM_FILE_VERSION); @@ -1704,7 +1705,9 @@ static int qemu_savevm_state(Monitor *mon, QEMUFile *f) int ret; MigrationParams params = { .blk = 0, - .shared = 0 + .shared = 0, + .use_xbzrle = 0, + .xbzrle_cache_size = 0 }; if (qemu_savevm_state_blocked(mon)) { -- 1.7.6.5