Commit 4f0fae7f authored by Juan Quintela's avatar Juan Quintela
Browse files

migration: Create migration_ioc_process_incoming()



We pass the ioc instead of the fd.  This will allow us to have more
than one channel open.  We also make sure that we set the
from_src_file sooner, so we don't need to pass it as a parameter.

Signed-off-by: default avatarJuan Quintela <quintela@redhat.com>
Reviewed-by: default avatarDaniel P. Berrange <berrange@redhat.com>

--

Do not assing mis->from_src_file (peterxu)
parent a6646074
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -36,8 +36,7 @@ void migration_channel_process_incoming(QIOChannel *ioc)
            error_report_err(local_err);
        }
    } else {
        QEMUFile *f = qemu_fopen_channel_input(ioc);
        migration_fd_process_incoming(f);
        migration_ioc_process_incoming(ioc);
    }
}

+18 −4
Original line number Diff line number Diff line
@@ -306,17 +306,16 @@ static void process_incoming_migration_bh(void *opaque)

static void process_incoming_migration_co(void *opaque)
{
    QEMUFile *f = opaque;
    MigrationIncomingState *mis = migration_incoming_get_current();
    PostcopyState ps;
    int ret;

    mis->from_src_file = f;
    assert(mis->from_src_file);
    mis->largest_page_size = qemu_ram_pagesize_largest();
    postcopy_state_set(POSTCOPY_INCOMING_NONE);
    migrate_set_state(&mis->state, MIGRATION_STATUS_NONE,
                      MIGRATION_STATUS_ACTIVE);
    ret = qemu_loadvm_state(f);
    ret = qemu_loadvm_state(mis->from_src_file);

    ps = postcopy_state_get();
    trace_process_incoming_migration_co_end(ret, ps);
@@ -364,12 +363,27 @@ static void process_incoming_migration_co(void *opaque)

void migration_fd_process_incoming(QEMUFile *f)
{
    Coroutine *co = qemu_coroutine_create(process_incoming_migration_co, f);
    Coroutine *co = qemu_coroutine_create(process_incoming_migration_co, NULL);
    MigrationIncomingState *mis = migration_incoming_get_current();

    if (!mis->from_src_file) {
        mis->from_src_file = f;
    }
    qemu_file_set_blocking(f, false);
    qemu_coroutine_enter(co);
}

void migration_ioc_process_incoming(QIOChannel *ioc)
{
    MigrationIncomingState *mis = migration_incoming_get_current();

    if (!mis->from_src_file) {
        QEMUFile *f = qemu_fopen_channel_input(ioc);
        migration_fd_process_incoming(f);
    }
    /* We still only have a single channel.  Nothing to do here yet */
}

/*
 * Send a 'SHUT' message on the return channel with the given value
 * to indicate that we've finished with the RP.  Non-0 value indicates
+2 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include "exec/cpu-common.h"
#include "qemu/coroutine_int.h"
#include "hw/qdev.h"
#include "io/channel.h"

/* State for the incoming migration */
struct MigrationIncomingState {
@@ -152,6 +153,7 @@ struct MigrationState
void migrate_set_state(int *state, int old_state, int new_state);

void migration_fd_process_incoming(QEMUFile *f);
void migration_ioc_process_incoming(QIOChannel *ioc);

uint64_t migrate_max_downtime(void);