Commit 0dcee622 authored by Peter Maydell's avatar Peter Maydell
Browse files

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: default avatarPeter Maydell <peter.maydell@linaro.org>
parents 8326ec2c 32c3db5b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
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
started in precopy mode.  Issuing:
+1 −1
Original line number Diff line number Diff line
@@ -1026,7 +1026,7 @@ ETEXI
        .args_type  = "",
        .params     = "",
        .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.",
        .mhandler.cmd = hmp_migrate_start_postcopy,
    },
+4 −5
Original line number Diff line number Diff line
@@ -706,7 +706,7 @@ void qmp_migrate_set_capabilities(MigrationCapabilityStatusList *params,
             */
            error_report("Postcopy is not currently compatible with "
                         "compression");
            s->enabled_capabilities[MIGRATION_CAPABILITY_X_POSTCOPY_RAM] =
            s->enabled_capabilities[MIGRATION_CAPABILITY_POSTCOPY_RAM] =
                false;
        }
    }
@@ -1125,7 +1125,7 @@ bool migrate_postcopy_ram(void)

    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)
@@ -1269,8 +1269,7 @@ static void *source_return_path_thread(void *opaque)
    MigrationState *ms = opaque;
    QEMUFile *rp = ms->rp_state.from_dst_file;
    uint16_t header_len, header_type;
    const int max_len = 512;
    uint8_t buf[max_len];
    uint8_t buf[512];
    uint32_t tmp32, sibling_error;
    ram_addr_t start = 0; /* =0 to silence warning */
    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 &&
            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"
                    "incorrect length %d expecting %zu",
                    rp_cmd_args[header_type].name, header_type, header_len,
+13 −5
Original line number Diff line number Diff line
@@ -1494,17 +1494,22 @@ static int loadvm_postcopy_handle_listen(MigrationIncomingState *mis)
    qemu_sem_init(&mis->listen_thread_sem, 0);
    qemu_thread_create(&mis->listen_thread, "postcopy/listen",
                       postcopy_ram_listen_thread, mis->from_src_file,
                       QEMU_THREAD_JOINABLE);
                       QEMU_THREAD_DETACHED);
    qemu_sem_wait(&mis->listen_thread_sem);
    qemu_sem_destroy(&mis->listen_thread_sem);

    return 0;
}


typedef struct {
    QEMUBH *bh;
} HandleRunBhData;

static void loadvm_postcopy_handle_run_bh(void *opaque)
{
    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
     * in migration.c
@@ -1532,13 +1537,15 @@ static void loadvm_postcopy_handle_run_bh(void *opaque)
        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 */
static int loadvm_postcopy_handle_run(MigrationIncomingState *mis)
{
    PostcopyState ps = postcopy_state_set(POSTCOPY_INCOMING_RUNNING);
    HandleRunBhData *data;

    trace_loadvm_postcopy_handle_run();
    if (ps != POSTCOPY_INCOMING_LISTENING) {
@@ -1546,8 +1553,9 @@ static int loadvm_postcopy_handle_run(MigrationIncomingState *mis)
        return -1;
    }

    mis->bh = qemu_bh_new(loadvm_postcopy_handle_run_bh, NULL);
    qemu_bh_schedule(mis->bh);
    data = g_new(HandleRunBhData, 1);
    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
     * and also stop reading anything more from the stream that loaded the
+4 −4
Original line number Diff line number Diff line
@@ -540,15 +540,15 @@
# @auto-converge: If enabled, QEMU will automatically throttle down the guest
#          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
#          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
##
{ 'enum': 'MigrationCapability',
  'data': ['xbzrle', 'rdma-pin-all', 'auto-converge', 'zero-blocks',
           'compress', 'events', 'x-postcopy-ram'] }
           'compress', 'events', 'postcopy-ram'] }

##
# @MigrationCapabilityStatus
@@ -705,7 +705,7 @@
# @migrate-start-postcopy
#
# 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.
#
# Since: 2.5
Loading