Code that does need to be visible is kept well contained inside this file and this is the only new additional file to the entire patch. This file includes the entire protocol and interfaces required to perform RDMA migration. Also, the configure and Makefile modifications to link this file are included. Full documentation is in docs/rdma.txt Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Chegu Vinod <chegu_vinod@hp.com> Tested-by: Chegu Vinod <chegu_vinod@hp.com> Tested-by: Michael R. Hines <mrhines@us.ibm.com> Signed-off-by: Michael R. Hines <mrhines@us.ibm.com> Signed-off-by: Juan Quintela <quintela@redhat.com>
165 lines
4.7 KiB
C
165 lines
4.7 KiB
C
/*
|
|
* QEMU live migration
|
|
*
|
|
* Copyright IBM, Corp. 2008
|
|
*
|
|
* Authors:
|
|
* Anthony Liguori <aliguori@us.ibm.com>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2. See
|
|
* the COPYING file in the top-level directory.
|
|
*
|
|
*/
|
|
|
|
#ifndef QEMU_MIGRATION_H
|
|
#define QEMU_MIGRATION_H
|
|
|
|
#include "qapi/qmp/qdict.h"
|
|
#include "qemu-common.h"
|
|
#include "qemu/thread.h"
|
|
#include "qemu/notify.h"
|
|
#include "qapi/error.h"
|
|
#include "migration/vmstate.h"
|
|
#include "qapi-types.h"
|
|
#include "exec/cpu-common.h"
|
|
|
|
struct MigrationParams {
|
|
bool blk;
|
|
bool shared;
|
|
};
|
|
|
|
typedef struct MigrationState MigrationState;
|
|
|
|
struct MigrationState
|
|
{
|
|
int64_t bandwidth_limit;
|
|
size_t bytes_xfer;
|
|
size_t xfer_limit;
|
|
QemuThread thread;
|
|
QEMUBH *cleanup_bh;
|
|
QEMUFile *file;
|
|
|
|
int state;
|
|
MigrationParams params;
|
|
double mbps;
|
|
int64_t total_time;
|
|
int64_t downtime;
|
|
int64_t expected_downtime;
|
|
int64_t dirty_pages_rate;
|
|
int64_t dirty_bytes_rate;
|
|
bool enabled_capabilities[MIGRATION_CAPABILITY_MAX];
|
|
int64_t xbzrle_cache_size;
|
|
};
|
|
|
|
void process_incoming_migration(QEMUFile *f);
|
|
|
|
void qemu_start_incoming_migration(const char *uri, Error **errp);
|
|
|
|
uint64_t migrate_max_downtime(void);
|
|
|
|
void do_info_migrate_print(Monitor *mon, const QObject *data);
|
|
|
|
void do_info_migrate(Monitor *mon, QObject **ret_data);
|
|
|
|
void exec_start_incoming_migration(const char *host_port, Error **errp);
|
|
|
|
void exec_start_outgoing_migration(MigrationState *s, const char *host_port, Error **errp);
|
|
|
|
void tcp_start_incoming_migration(const char *host_port, Error **errp);
|
|
|
|
void tcp_start_outgoing_migration(MigrationState *s, const char *host_port, Error **errp);
|
|
|
|
void unix_start_incoming_migration(const char *path, Error **errp);
|
|
|
|
void unix_start_outgoing_migration(MigrationState *s, const char *path, Error **errp);
|
|
|
|
void fd_start_incoming_migration(const char *path, Error **errp);
|
|
|
|
void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **errp);
|
|
|
|
void rdma_start_outgoing_migration(void *opaque, const char *host_port, Error **errp);
|
|
|
|
void rdma_start_incoming_migration(const char *host_port, Error **errp);
|
|
|
|
void migrate_fd_error(MigrationState *s);
|
|
|
|
void migrate_fd_connect(MigrationState *s);
|
|
|
|
int migrate_fd_close(MigrationState *s);
|
|
|
|
void add_migration_state_change_notifier(Notifier *notify);
|
|
void remove_migration_state_change_notifier(Notifier *notify);
|
|
bool migration_is_active(MigrationState *);
|
|
bool migration_has_finished(MigrationState *);
|
|
bool migration_has_failed(MigrationState *);
|
|
MigrationState *migrate_get_current(void);
|
|
|
|
uint64_t ram_bytes_remaining(void);
|
|
uint64_t ram_bytes_transferred(void);
|
|
uint64_t ram_bytes_total(void);
|
|
|
|
void acct_update_position(QEMUFile *f, size_t size, bool zero);
|
|
|
|
extern SaveVMHandlers savevm_ram_handlers;
|
|
|
|
uint64_t dup_mig_bytes_transferred(void);
|
|
uint64_t dup_mig_pages_transferred(void);
|
|
uint64_t skipped_mig_bytes_transferred(void);
|
|
uint64_t skipped_mig_pages_transferred(void);
|
|
uint64_t norm_mig_bytes_transferred(void);
|
|
uint64_t norm_mig_pages_transferred(void);
|
|
uint64_t xbzrle_mig_bytes_transferred(void);
|
|
uint64_t xbzrle_mig_pages_transferred(void);
|
|
uint64_t xbzrle_mig_pages_overflow(void);
|
|
uint64_t xbzrle_mig_pages_cache_miss(void);
|
|
|
|
void ram_handle_compressed(void *host, uint8_t ch, uint64_t size);
|
|
|
|
/**
|
|
* @migrate_add_blocker - prevent migration from proceeding
|
|
*
|
|
* @reason - an error to be returned whenever migration is attempted
|
|
*/
|
|
void migrate_add_blocker(Error *reason);
|
|
|
|
/**
|
|
* @migrate_del_blocker - remove a blocking error from migration
|
|
*
|
|
* @reason - the error blocking migration
|
|
*/
|
|
void migrate_del_blocker(Error *reason);
|
|
|
|
bool migrate_rdma_pin_all(void);
|
|
bool migrate_zero_blocks(void);
|
|
|
|
bool migrate_auto_converge(void);
|
|
|
|
int xbzrle_encode_buffer(uint8_t *old_buf, uint8_t *new_buf, int slen,
|
|
uint8_t *dst, int dlen);
|
|
int xbzrle_decode_buffer(uint8_t *src, int slen, uint8_t *dst, int dlen);
|
|
|
|
int migrate_use_xbzrle(void);
|
|
int64_t migrate_xbzrle_cache_size(void);
|
|
|
|
int64_t xbzrle_cache_resize(int64_t new_size);
|
|
|
|
void ram_control_before_iterate(QEMUFile *f, uint64_t flags);
|
|
void ram_control_after_iterate(QEMUFile *f, uint64_t flags);
|
|
void ram_control_load_hook(QEMUFile *f, uint64_t flags);
|
|
|
|
/* Whenever this is found in the data stream, the flags
|
|
* will be passed to ram_control_load_hook in the incoming-migration
|
|
* side. This lets before_ram_iterate/after_ram_iterate add
|
|
* transport-specific sections to the RAM migration data.
|
|
*/
|
|
#define RAM_SAVE_FLAG_HOOK 0x80
|
|
|
|
#define RAM_SAVE_CONTROL_NOT_SUPP -1000
|
|
#define RAM_SAVE_CONTROL_DELAYED -2000
|
|
|
|
size_t ram_control_save_page(QEMUFile *f, ram_addr_t block_offset,
|
|
ram_addr_t offset, size_t size,
|
|
int *bytes_sent);
|
|
|
|
#endif
|