migration:

- postcopy is no longer experimental
  - fix a use-after-free in postcopy
  - fix a compile warning
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABAgAGBQJW4rotAAoJEB6aO1+FQIO2y5IP/jZk6TET5STLnoPxb6p/rYqF
 wSm39JZYef81FnnGtOtBjBYyhuQTPwvYx9wK4O9nqhXIxiq1tlfGIeP8lknmOH7O
 VOoSImefz7kKzRWlo4z2AUvCAESST+qHltqQLeENhDTZnn1loMqQgbDe4Ave9Png
 loR5xsqeZYkxkOhhPj1jcTwkcAyWuy/rFsfjq1KjQZwXefHiutyLuMfJLgzUXoUU
 wgzNO/wC8HPY8LdsfJTyCxdjH88Q1BE9KGybi9DTMizv8Jdm7Qg3C6AohxZBlDKG
 EXmEUbYgmMAQeQDMzq4r251mtIFkcYin7PwDxy4/sGW9E5PX/bm4MbPCZ4FO0Nha
 f1y/dUp7vxHn6jP8SX6NWkwFhpOsC8zdIb9UXTWSheTnxZvKuIF1V6pAe//0vVIn
 DhjZrZpwfBzHXEfeiZjYi3aVeX8xBe5r12K+iDs39DwghIFxwFhu0jLb+MTEviUP
 /6ui5ZHYeQV8j/6bE99ii3wVlNzAlE70pfXOqG3XsgP+tWgSuuUE5xLKNGZygFRY
 KlTigEKleipTzG0KAP8M7eKquFhGiV607aSEiboVMYGc53+I6ak6KQEtT2a7s7Xp
 ZVNaOlPy4dNkHuMqNnz8lhrLUtVWaOpzf1XqKxiOQPVGDsYber4L6FIdUcybxWLw
 Sty5ZTl4F/K/zIXacXED
 =6epX
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/amit-migration/tags/migration-for-2.6-7' into staging

migration:
 - postcopy is no longer experimental
 - fix a use-after-free in postcopy
 - fix a compile warning

# gpg: Signature made Fri 11 Mar 2016 12:29:33 GMT using RSA key ID 854083B6
# gpg: Good signature from "Amit Shah <amit@amitshah.net>"
# gpg:                 aka "Amit Shah <amit@kernel.org>"
# gpg:                 aka "Amit Shah <amitshah@gmx.net>"

* remotes/amit-migration/tags/migration-for-2.6-7:
  postcopy: Remove the x-
  postcopy: listen thread is never joined
  migration: fix use-after-free in loadvm_postcopy_handle_run_bh
  migration: fix warning for source_return_path_thread

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2016-03-14 13:51:21 +00:00
commit 0dcee62261
6 changed files with 26 additions and 19 deletions

View File

@ -333,7 +333,7 @@ doesn't finish in a given time the switch is made to postcopy.
To enable postcopy, issue this command on the monitor prior to the To enable postcopy, issue this command on the monitor prior to the
start of migration: start of migration:
migrate_set_capability x-postcopy-ram on migrate_set_capability postcopy-ram on
The normal commands are then used to start a migration, which is still The normal commands are then used to start a migration, which is still
started in precopy mode. Issuing: started in precopy mode. Issuing:

View File

@ -1026,7 +1026,7 @@ ETEXI
.args_type = "", .args_type = "",
.params = "", .params = "",
.help = "Followup to a migration command to switch the migration" .help = "Followup to a migration command to switch the migration"
" to postcopy mode. The x-postcopy-ram capability must " " to postcopy mode. The postcopy-ram capability must "
"be set before the original migration command.", "be set before the original migration command.",
.mhandler.cmd = hmp_migrate_start_postcopy, .mhandler.cmd = hmp_migrate_start_postcopy,
}, },

View File

@ -706,7 +706,7 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
*/ */
error_report("Postcopy is not currently compatible with " error_report("Postcopy is not currently compatible with "
"compression"); "compression");
s->enabled_capabilities[MIGRATION_CAPABILITY_X_POSTCOPY_RAM] = s->enabled_capabilities[MIGRATION_CAPABILITY_POSTCOPY_RAM] =
false; false;
} }
} }
@ -1125,7 +1125,7 @@ bool migrate_postcopy_ram(void)
s = migrate_get_current(); s = migrate_get_current();
return s->enabled_capabilities[MIGRATION_CAPABILITY_X_POSTCOPY_RAM]; return s->enabled_capabilities[MIGRATION_CAPABILITY_POSTCOPY_RAM];
} }
bool migrate_auto_converge(void) bool migrate_auto_converge(void)
@ -1269,8 +1269,7 @@ static void *source_return_path_thread(void *opaque)
MigrationState *ms = opaque; MigrationState *ms = opaque;
QEMUFile *rp = ms->rp_state.from_dst_file; QEMUFile *rp = ms->rp_state.from_dst_file;
uint16_t header_len, header_type; uint16_t header_len, header_type;
const int max_len = 512; uint8_t buf[512];
uint8_t buf[max_len];
uint32_t tmp32, sibling_error; uint32_t tmp32, sibling_error;
ram_addr_t start = 0; /* =0 to silence warning */ ram_addr_t start = 0; /* =0 to silence warning */
size_t len = 0, expected_len; size_t len = 0, expected_len;
@ -1293,7 +1292,7 @@ static void *source_return_path_thread(void *opaque)
if ((rp_cmd_args[header_type].len != -1 && if ((rp_cmd_args[header_type].len != -1 &&
header_len != rp_cmd_args[header_type].len) || header_len != rp_cmd_args[header_type].len) ||
header_len > max_len) { header_len > sizeof(buf)) {
error_report("RP: Received '%s' message (0x%04x) with" error_report("RP: Received '%s' message (0x%04x) with"
"incorrect length %d expecting %zu", "incorrect length %d expecting %zu",
rp_cmd_args[header_type].name, header_type, header_len, rp_cmd_args[header_type].name, header_type, header_len,

View File

@ -1494,17 +1494,22 @@ static int loadvm_postcopy_handle_listen(MigrationIncomingState *mis)
qemu_sem_init(&mis->listen_thread_sem, 0); qemu_sem_init(&mis->listen_thread_sem, 0);
qemu_thread_create(&mis->listen_thread, "postcopy/listen", qemu_thread_create(&mis->listen_thread, "postcopy/listen",
postcopy_ram_listen_thread, mis->from_src_file, postcopy_ram_listen_thread, mis->from_src_file,
QEMU_THREAD_JOINABLE); QEMU_THREAD_DETACHED);
qemu_sem_wait(&mis->listen_thread_sem); qemu_sem_wait(&mis->listen_thread_sem);
qemu_sem_destroy(&mis->listen_thread_sem); qemu_sem_destroy(&mis->listen_thread_sem);
return 0; return 0;
} }
typedef struct {
QEMUBH *bh;
} HandleRunBhData;
static void loadvm_postcopy_handle_run_bh(void *opaque) static void loadvm_postcopy_handle_run_bh(void *opaque)
{ {
Error *local_err = NULL; Error *local_err = NULL;
MigrationIncomingState *mis = opaque; HandleRunBhData *data = opaque;
/* TODO we should move all of this lot into postcopy_ram.c or a shared code /* TODO we should move all of this lot into postcopy_ram.c or a shared code
* in migration.c * in migration.c
@ -1532,13 +1537,15 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
runstate_set(RUN_STATE_PAUSED); runstate_set(RUN_STATE_PAUSED);
} }
qemu_bh_delete(mis->bh); qemu_bh_delete(data->bh);
g_free(data);
} }
/* After all discards we can start running and asking for pages */ /* After all discards we can start running and asking for pages */
static int loadvm_postcopy_handle_run(MigrationIncomingState *mis) static int loadvm_postcopy_handle_run(MigrationIncomingState *mis)
{ {
PostcopyState ps = postcopy_state_set(POSTCOPY_INCOMING_RUNNING); PostcopyState ps = postcopy_state_set(POSTCOPY_INCOMING_RUNNING);
HandleRunBhData *data;
trace_loadvm_postcopy_handle_run(); trace_loadvm_postcopy_handle_run();
if (ps != POSTCOPY_INCOMING_LISTENING) { if (ps != POSTCOPY_INCOMING_LISTENING) {
@ -1546,8 +1553,9 @@ static int loadvm_postcopy_handle_run(MigrationIncomingState *mis)
return -1; return -1;
} }
mis->bh = qemu_bh_new(loadvm_postcopy_handle_run_bh, NULL); data = g_new(HandleRunBhData, 1);
qemu_bh_schedule(mis->bh); data->bh = qemu_bh_new(loadvm_postcopy_handle_run_bh, data);
qemu_bh_schedule(data->bh);
/* We need to finish reading the stream from the package /* We need to finish reading the stream from the package
* and also stop reading anything more from the stream that loaded the * and also stop reading anything more from the stream that loaded the

View File

@ -540,15 +540,15 @@
# @auto-converge: If enabled, QEMU will automatically throttle down the guest # @auto-converge: If enabled, QEMU will automatically throttle down the guest
# to speed up convergence of RAM migration. (since 1.6) # to speed up convergence of RAM migration. (since 1.6)
# #
# @x-postcopy-ram: Start executing on the migration target before all of RAM has # @postcopy-ram: Start executing on the migration target before all of RAM has
# been migrated, pulling the remaining pages along as needed. NOTE: If # been migrated, pulling the remaining pages along as needed. NOTE: If
# the migration fails during postcopy the VM will fail. (since 2.5) # the migration fails during postcopy the VM will fail. (since 2.6)
# #
# Since: 1.2 # Since: 1.2
## ##
{ 'enum': 'MigrationCapability', { 'enum': 'MigrationCapability',
'data': ['xbzrle', 'rdma-pin-all', 'auto-converge', 'zero-blocks', 'data': ['xbzrle', 'rdma-pin-all', 'auto-converge', 'zero-blocks',
'compress', 'events', 'x-postcopy-ram'] } 'compress', 'events', 'postcopy-ram'] }
## ##
# @MigrationCapabilityStatus # @MigrationCapabilityStatus
@ -705,7 +705,7 @@
# @migrate-start-postcopy # @migrate-start-postcopy
# #
# Followup to a migration command to switch the migration to postcopy mode. # Followup to a migration command to switch the migration to postcopy mode.
# The x-postcopy-ram capability must be set before the original migration # The postcopy-ram capability must be set before the original migration
# command. # command.
# #
# Since: 2.5 # Since: 2.5

View File

@ -3683,7 +3683,7 @@ Enable/Disable migration capabilities
- "zero-blocks": compress zero blocks during block migration - "zero-blocks": compress zero blocks during block migration
- "compress": use multiple compression threads to accelerate live migration - "compress": use multiple compression threads to accelerate live migration
- "events": generate events for each migration state change - "events": generate events for each migration state change
- "x-postcopy-ram": postcopy mode for live migration - "postcopy-ram": postcopy mode for live migration
Arguments: Arguments:
@ -3713,7 +3713,7 @@ Query current migration capabilities
- "zero-blocks" : Zero Blocks state (json-bool) - "zero-blocks" : Zero Blocks state (json-bool)
- "compress": Multiple compression threads state (json-bool) - "compress": Multiple compression threads state (json-bool)
- "events": Migration state change event state (json-bool) - "events": Migration state change event state (json-bool)
- "x-postcopy-ram": postcopy ram state (json-bool) - "postcopy-ram": postcopy ram state (json-bool)
Arguments: Arguments:
@ -3727,7 +3727,7 @@ Example:
{"state": false, "capability": "zero-blocks"}, {"state": false, "capability": "zero-blocks"},
{"state": false, "capability": "compress"}, {"state": false, "capability": "compress"},
{"state": true, "capability": "events"}, {"state": true, "capability": "events"},
{"state": false, "capability": "x-postcopy-ram"} {"state": false, "capability": "postcopy-ram"}
]} ]}
EQMP EQMP