migration/next for 20151104

-----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABCAAGBQJWOf3fAAoJEPSH7xhYctcj5goQAJagmD9MCCVkuXaLVIwBYaMv
 CFca3xTfWjhkbucirF1X2cmhAbAlzzTDj/NxDyjIaIepBs1k4nrW6rfvAeZ0H5wM
 mLAzb041rnlpibg2p5976nir+9rh0N8y2DvLQfA7daCtc557SJMzG5v1lADVLTuu
 1gNI93jFQ2i+Mmm78RPRizCOBKSmspMnvoEMJ2SaI8UKbBNTUYnPyROswdO/qyOL
 YrEHFAFp1k6XswGkDr9Tzi2RcfdjdbFjLlWOVm0nTWS9ZuB06LPZr19GffE8gNmu
 Hqsj09Ou18uZOzgyiqzarhVIdLJJhFPlBNV454cA2vA7jvwdoJbdmxR//0dUs2Bn
 59lFqJzN1Z0VElY2WtNSXkNg6oTROfXCQFCEOfESzlu+FGXEO2AuvppUQJJq2cK8
 xN3XoJifZzGKK1FNryBPrzr/7x/B3L8Q2KoAKdvvlrGw/7m8Kf5eZI3J4YU9BdV5
 KuTcNz7MLoVS2fYX4Z3pos3XRb1rtIJS6XavmwkXQhy8uJUiW0XQBCLTWI9Ymg1d
 sYny4gO2vEk0p1N/KfP/irv1cpBJFGk3lisX99QvUvOKTsJ6s7zxOkifRrBJku58
 kRSu/+xuquEDUsjI9u0UC4Vx1ybT/Y9oMcAVztoyHwjH6BrVTIg11yqKS5dl7q1Q
 upIf7kxSP6FHdh+sOPGF
 =eOCY
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/juanquintela/tags/migration/20151104' into staging

migration/next for 20151104

# gpg: Signature made Wed 04 Nov 2015 12:45:19 GMT using RSA key ID 5872D723
# gpg: Good signature from "Juan Quintela <quintela@redhat.com>"
# gpg:                 aka "Juan Quintela <quintela@trasno.org>"

* remotes/juanquintela/tags/migration/20151104:
  migration: fix analyze-migration.py script
  migration: code clean up
  migration: rename cancel to cleanup in SaveVMHandles
  migration: rename qemu_savevm_state_cancel
  migration: defer migration_end & blk_mig_cleanup

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2015-11-05 10:10:57 +00:00
commit 6c5f30cad2
8 changed files with 31 additions and 31 deletions

View File

@ -39,7 +39,7 @@ typedef struct SaveVMHandlers {
void (*set_params)(const MigrationParams *params, void * opaque); void (*set_params)(const MigrationParams *params, void * opaque);
SaveStateHandler *save_state; SaveStateHandler *save_state;
void (*cancel)(void *opaque); void (*cleanup)(void *opaque);
int (*save_live_complete)(QEMUFile *f, void *opaque); int (*save_live_complete)(QEMUFile *f, void *opaque);
/* This runs both outside and inside the iothread lock. */ /* This runs both outside and inside the iothread lock. */

View File

@ -89,7 +89,7 @@ void qemu_savevm_state_begin(QEMUFile *f,
void qemu_savevm_state_header(QEMUFile *f); void qemu_savevm_state_header(QEMUFile *f);
int qemu_savevm_state_iterate(QEMUFile *f); int qemu_savevm_state_iterate(QEMUFile *f);
void qemu_savevm_state_complete(QEMUFile *f); void qemu_savevm_state_complete(QEMUFile *f);
void qemu_savevm_state_cancel(void); void qemu_savevm_state_cleanup(void);
uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size); uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size);
int qemu_loadvm_state(QEMUFile *f); int qemu_loadvm_state(QEMUFile *f);

View File

@ -591,7 +591,7 @@ static int64_t get_remaining_dirty(void)
/* Called with iothread lock taken. */ /* Called with iothread lock taken. */
static void blk_mig_cleanup(void) static void block_migration_cleanup(void *opaque)
{ {
BlkMigDevState *bmds; BlkMigDevState *bmds;
BlkMigBlock *blk; BlkMigBlock *blk;
@ -618,11 +618,6 @@ static void blk_mig_cleanup(void)
blk_mig_unlock(); blk_mig_unlock();
} }
static void block_migration_cancel(void *opaque)
{
blk_mig_cleanup();
}
static int block_save_setup(QEMUFile *f, void *opaque) static int block_save_setup(QEMUFile *f, void *opaque)
{ {
int ret; int ret;
@ -750,7 +745,6 @@ static int block_save_complete(QEMUFile *f, void *opaque)
qemu_put_be64(f, BLK_MIG_FLAG_EOS); qemu_put_be64(f, BLK_MIG_FLAG_EOS);
blk_mig_cleanup();
return 0; return 0;
} }
@ -885,7 +879,7 @@ static SaveVMHandlers savevm_block_handlers = {
.save_live_complete = block_save_complete, .save_live_complete = block_save_complete,
.save_live_pending = block_save_pending, .save_live_pending = block_save_pending,
.load_state = block_load, .load_state = block_load,
.cancel = block_migration_cancel, .cleanup = block_migration_cleanup,
.is_active = block_is_active, .is_active = block_is_active,
}; };

View File

@ -613,12 +613,9 @@ static void migrate_fd_cleanup(void *opaque)
assert(s->state != MIGRATION_STATUS_ACTIVE); assert(s->state != MIGRATION_STATUS_ACTIVE);
if (s->state != MIGRATION_STATUS_COMPLETED) { if (s->state == MIGRATION_STATUS_CANCELLING) {
qemu_savevm_state_cancel(); migrate_set_state(s, MIGRATION_STATUS_CANCELLING,
if (s->state == MIGRATION_STATUS_CANCELLING) { MIGRATION_STATUS_CANCELLED);
migrate_set_state(s, MIGRATION_STATUS_CANCELLING,
MIGRATION_STATUS_CANCELLED);
}
} }
notifier_list_notify(&migration_state_notifiers, s); notifier_list_notify(&migration_state_notifiers, s);
@ -1028,6 +1025,7 @@ static void *migration_thread(void *opaque)
int64_t initial_bytes = 0; int64_t initial_bytes = 0;
int64_t max_size = 0; int64_t max_size = 0;
int64_t start_time = initial_time; int64_t start_time = initial_time;
int64_t end_time;
bool old_vm_running = false; bool old_vm_running = false;
rcu_register_thread(); rcu_register_thread();
@ -1089,10 +1087,11 @@ static void *migration_thread(void *opaque)
/* If we enabled cpu throttling for auto-converge, turn it off. */ /* If we enabled cpu throttling for auto-converge, turn it off. */
cpu_throttle_stop(); cpu_throttle_stop();
end_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
qemu_mutex_lock_iothread(); qemu_mutex_lock_iothread();
qemu_savevm_state_cleanup();
if (s->state == MIGRATION_STATUS_COMPLETED) { if (s->state == MIGRATION_STATUS_COMPLETED) {
int64_t end_time = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
uint64_t transferred_bytes = qemu_ftell(s->file); uint64_t transferred_bytes = qemu_ftell(s->file);
s->total_time = end_time - s->total_time; s->total_time = end_time - s->total_time;
s->downtime = end_time - start_time; s->downtime = end_time - start_time;

View File

@ -1100,7 +1100,7 @@ static void migration_bitmap_free(struct BitmapRcu *bmap)
g_free(bmap); g_free(bmap);
} }
static void migration_end(void) static void ram_migration_cleanup(void *opaque)
{ {
/* caller have hold iothread lock or is in a bh, so there is /* caller have hold iothread lock or is in a bh, so there is
* no writing race against this migration_bitmap * no writing race against this migration_bitmap
@ -1124,11 +1124,6 @@ static void migration_end(void)
XBZRLE_cache_unlock(); XBZRLE_cache_unlock();
} }
static void ram_migration_cancel(void *opaque)
{
migration_end();
}
static void reset_ram_globals(void) static void reset_ram_globals(void)
{ {
last_seen_block = NULL; last_seen_block = NULL;
@ -1344,7 +1339,6 @@ static int ram_save_complete(QEMUFile *f, void *opaque)
rcu_read_unlock(); rcu_read_unlock();
migration_end();
qemu_put_be64(f, RAM_SAVE_FLAG_EOS); qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
return 0; return 0;
@ -1686,7 +1680,7 @@ static SaveVMHandlers savevm_ram_handlers = {
.save_live_complete = ram_save_complete, .save_live_complete = ram_save_complete,
.save_live_pending = ram_save_pending, .save_live_pending = ram_save_pending,
.load_state = ram_load, .load_state = ram_load,
.cancel = ram_migration_cancel, .cleanup = ram_migration_cleanup,
}; };
void ram_mig_init(void) void ram_mig_init(void)

View File

@ -902,14 +902,14 @@ uint64_t qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size)
return ret; return ret;
} }
void qemu_savevm_state_cancel(void) void qemu_savevm_state_cleanup(void)
{ {
SaveStateEntry *se; SaveStateEntry *se;
trace_savevm_state_cancel(); trace_savevm_state_cleanup();
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) { QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
if (se->ops && se->ops->cancel) { if (se->ops && se->ops->cleanup) {
se->ops->cancel(se->opaque); se->ops->cleanup(se->opaque);
} }
} }
} }
@ -943,7 +943,7 @@ static int qemu_savevm_state(QEMUFile *f, Error **errp)
ret = qemu_file_get_error(f); ret = qemu_file_get_error(f);
} }
if (ret != 0) { if (ret != 0) {
qemu_savevm_state_cancel(); qemu_savevm_state_cleanup();
error_setg_errno(errp, -ret, "Error while writing VM state"); error_setg_errno(errp, -ret, "Error while writing VM state");
} }
return ret; return ret;

View File

@ -252,6 +252,15 @@ def read(self):
def getDict(self): def getDict(self):
return "" return ""
class ConfigurationSection(object):
def __init__(self, file):
self.file = file
def read(self):
name_len = self.file.read32()
name = self.file.readstr(len = name_len)
class VMSDFieldGeneric(object): class VMSDFieldGeneric(object):
def __init__(self, desc, file): def __init__(self, desc, file):
self.file = file self.file = file
@ -474,6 +483,7 @@ class MigrationDump(object):
QEMU_VM_SECTION_FULL = 0x04 QEMU_VM_SECTION_FULL = 0x04
QEMU_VM_SUBSECTION = 0x05 QEMU_VM_SUBSECTION = 0x05
QEMU_VM_VMDESCRIPTION = 0x06 QEMU_VM_VMDESCRIPTION = 0x06
QEMU_VM_CONFIGURATION = 0x07
QEMU_VM_SECTION_FOOTER= 0x7e QEMU_VM_SECTION_FOOTER= 0x7e
def __init__(self, filename): def __init__(self, filename):
@ -514,6 +524,9 @@ def read(self, desc_only = False, dump_memory = False, write_memory = False):
section_type = file.read8() section_type = file.read8()
if section_type == self.QEMU_VM_EOF: if section_type == self.QEMU_VM_EOF:
break break
elif section_type == self.QEMU_VM_CONFIGURATION:
section = ConfigurationSection(file)
section.read()
elif section_type == self.QEMU_VM_SECTION_START or section_type == self.QEMU_VM_SECTION_FULL: elif section_type == self.QEMU_VM_SECTION_START or section_type == self.QEMU_VM_SECTION_FULL:
section_id = file.read32() section_id = file.read32()
name = file.readstr() name = file.readstr()

View File

@ -1211,7 +1211,7 @@ savevm_state_begin(void) ""
savevm_state_header(void) "" savevm_state_header(void) ""
savevm_state_iterate(void) "" savevm_state_iterate(void) ""
savevm_state_complete(void) "" savevm_state_complete(void) ""
savevm_state_cancel(void) "" savevm_state_cleanup(void) ""
vmstate_save(const char *idstr, const char *vmsd_name) "%s, %s" vmstate_save(const char *idstr, const char *vmsd_name) "%s, %s"
vmstate_load(const char *idstr, const char *vmsd_name) "%s, %s" vmstate_load(const char *idstr, const char *vmsd_name) "%s, %s"
qemu_announce_self_iter(const char *mac) "%s" qemu_announce_self_iter(const char *mac) "%s"