Commit e5cac10a authored by Peter Maydell's avatar Peter Maydell
Browse files

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



migration/next for 20170531

# gpg: Signature made Wed 31 May 2017 08:53:06 BST
# gpg:                using RSA key 0xF487EF185872D723
# gpg: Good signature from "Juan Quintela <quintela@redhat.com>"
# gpg:                 aka "Juan Quintela <quintela@trasno.org>"
# Primary key fingerprint: 1899 FF8E DEBF 58CC EE03  4B82 F487 EF18 5872 D723

* remotes/juanquintela/tags/migration/20170531:
  migration: use dirty_rate_high_cnt more aggressively
  migration: set bytes_xfer_* outside of autoconverge logic
  migration: set dirty_pages_rate before autoconverge logic
  migration: keep bytes_xfer_prev init'd to zero
  migration: Create savevm.h for functions exported from savevm.c

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents 61462af6 b4a3c64b
Loading
Loading
Loading
Loading
+0 −47
Original line number Diff line number Diff line
@@ -97,53 +97,6 @@ int load_vmstate(const char *name, Error **errp);

void qemu_announce_self(void);

/* Subcommands for QEMU_VM_COMMAND */
enum qemu_vm_cmd {
    MIG_CMD_INVALID = 0,   /* Must be 0 */
    MIG_CMD_OPEN_RETURN_PATH,  /* Tell the dest to open the Return path */
    MIG_CMD_PING,              /* Request a PONG on the RP */

    MIG_CMD_POSTCOPY_ADVISE,       /* Prior to any page transfers, just
                                      warn we might want to do PC */
    MIG_CMD_POSTCOPY_LISTEN,       /* Start listening for incoming
                                      pages as it's running. */
    MIG_CMD_POSTCOPY_RUN,          /* Start execution */

    MIG_CMD_POSTCOPY_RAM_DISCARD,  /* A list of pages to discard that
                                      were previously sent during
                                      precopy but are dirty. */
    MIG_CMD_PACKAGED,          /* Send a wrapped stream within this stream */
    MIG_CMD_MAX
};

#define MAX_VM_CMD_PACKAGED_SIZE (1ul << 24)

bool qemu_savevm_state_blocked(Error **errp);
void qemu_savevm_state_begin(QEMUFile *f);
void qemu_savevm_state_header(QEMUFile *f);
int qemu_savevm_state_iterate(QEMUFile *f, bool postcopy);
void qemu_savevm_state_cleanup(void);
void qemu_savevm_state_complete_postcopy(QEMUFile *f);
void qemu_savevm_state_complete_precopy(QEMUFile *f, bool iterable_only);
void qemu_savevm_state_pending(QEMUFile *f, uint64_t max_size,
                               uint64_t *res_non_postcopiable,
                               uint64_t *res_postcopiable);
void qemu_savevm_command_send(QEMUFile *f, enum qemu_vm_cmd command,
                              uint16_t len, uint8_t *data);
void qemu_savevm_send_ping(QEMUFile *f, uint32_t value);
void qemu_savevm_send_open_return_path(QEMUFile *f);
int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t *buf, size_t len);
void qemu_savevm_send_postcopy_advise(QEMUFile *f);
void qemu_savevm_send_postcopy_listen(QEMUFile *f);
void qemu_savevm_send_postcopy_run(QEMUFile *f);

void qemu_savevm_send_postcopy_ram_discard(QEMUFile *f, const char *name,
                                           uint16_t len,
                                           uint64_t *start_list,
                                           uint64_t *length_list);

int qemu_loadvm_state(QEMUFile *f);

extern int autostart;

typedef enum {
+1 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#include "qemu-file-channel.h"
#include "migration/migration.h"
#include "migration/qemu-file.h"
#include "savevm.h"
#include "migration/colo.h"
#include "migration/block.h"
#include "io/channel-buffer.h"
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include "qemu/main-loop.h"
#include "migration/blocker.h"
#include "migration/migration.h"
#include "savevm.h"
#include "qemu-file-channel.h"
#include "migration/qemu-file.h"
#include "migration/vmstate.h"
+1 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include "exec/target_page.h"
#include "migration/migration.h"
#include "migration/qemu-file.h"
#include "savevm.h"
#include "postcopy-ram.h"
#include "sysemu/sysemu.h"
#include "sysemu/balloon.h"
+11 −12
Original line number Diff line number Diff line
@@ -673,10 +673,6 @@ static void migration_bitmap_sync(RAMState *rs)

    rs->bitmap_sync_count++;

    if (!rs->bytes_xfer_prev) {
        rs->bytes_xfer_prev = ram_bytes_transferred();
    }

    if (!rs->time_last_bitmap_sync) {
        rs->time_last_bitmap_sync = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
    }
@@ -698,23 +694,25 @@ static void migration_bitmap_sync(RAMState *rs)

    /* more than 1 second = 1000 millisecons */
    if (end_time > rs->time_last_bitmap_sync + 1000) {
        /* calculate period counters */
        rs->dirty_pages_rate = rs->num_dirty_pages_period * 1000
            / (end_time - rs->time_last_bitmap_sync);
        bytes_xfer_now = ram_bytes_transferred();

        if (migrate_auto_converge()) {
            /* The following detection logic can be refined later. For now:
               Check to see if the dirtied bytes is 50% more than the approx.
               amount of bytes that just got transferred since the last time we
               were in this routine. If that happens twice, start or increase
               throttling */
            bytes_xfer_now = ram_bytes_transferred();

            if (rs->dirty_pages_rate &&
               (rs->num_dirty_pages_period * TARGET_PAGE_SIZE >
            if ((rs->num_dirty_pages_period * TARGET_PAGE_SIZE >
                   (bytes_xfer_now - rs->bytes_xfer_prev) / 2) &&
               (rs->dirty_rate_high_cnt++ >= 2)) {
                (++rs->dirty_rate_high_cnt >= 2)) {
                    trace_migration_throttle();
                    rs->dirty_rate_high_cnt = 0;
                    mig_throttle_guest_down();
            }
             rs->bytes_xfer_prev = bytes_xfer_now;
        }

        if (migrate_use_xbzrle()) {
@@ -727,10 +725,11 @@ static void migration_bitmap_sync(RAMState *rs)
            rs->iterations_prev = rs->iterations;
            rs->xbzrle_cache_miss_prev = rs->xbzrle_cache_miss;
        }
        rs->dirty_pages_rate = rs->num_dirty_pages_period * 1000
            / (end_time - rs->time_last_bitmap_sync);

        /* reset period counters */
        rs->time_last_bitmap_sync = end_time;
        rs->num_dirty_pages_period = 0;
        rs->bytes_xfer_prev = bytes_xfer_now;
    }
    if (migrate_use_events()) {
        qapi_event_send_migration_pass(rs->bitmap_sync_count, NULL);
Loading