15d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner/* 25d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * QEMU live migration 35d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 45d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Copyright IBM, Corp. 2008 55d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 65d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Authors: 75d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * Anthony Liguori <aliguori@us.ibm.com> 85d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 95d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * This work is licensed under the terms of the GNU GPL, version 2. See 105d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * the COPYING file in the top-level directory. 115d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner * 125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner */ 135d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 145d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#ifndef QEMU_MIGRATION_H 155d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define QEMU_MIGRATION_H 165d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 175d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-common.h" 185d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 195d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MIG_STATE_ERROR -1 205d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MIG_STATE_COMPLETED 0 215d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MIG_STATE_CANCELLED 1 225d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#define MIG_STATE_ACTIVE 2 235d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 245d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct MigrationState MigrationState; 255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 265d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct MigrationState 275d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 285d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner /* FIXME: add more accessors to print migration info */ 295d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void (*cancel)(MigrationState *s); 305d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int (*get_status)(MigrationState *s); 315d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void (*release)(MigrationState *s); 325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}; 335d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnertypedef struct FdMigrationState FdMigrationState; 355d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 365d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstruct FdMigrationState 375d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 385d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner MigrationState mig_state; 395d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int64_t bandwidth_limit; 405d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner QEMUFile *file; 415d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int fd; 425d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner Monitor *mon_resume; 435d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int state; 445d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int (*get_error)(struct FdMigrationState*); 455d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int (*close)(struct FdMigrationState*); 465d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int (*write)(struct FdMigrationState*, const void *, size_t); 475d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void *opaque; 485d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner}; 495d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 505d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_start_incoming_migration(const char *uri); 515d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 525d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid do_migrate(Monitor *mon, int detach, const char *uri); 535d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 545d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid do_migrate_cancel(Monitor *mon); 555d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 565d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid do_migrate_set_speed(Monitor *mon, const char *value); 575d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 585d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turneruint64_t migrate_max_downtime(void); 595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid do_migrate_set_downtime(Monitor *mon, const char *value); 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid do_info_migrate(Monitor *mon); 635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint exec_start_incoming_migration(const char *host_port); 655d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 665d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerMigrationState *exec_start_outgoing_migration(const char *host_port, 675d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int64_t bandwidth_limit, 685d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int detach); 695d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 705d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint tcp_start_incoming_migration(const char *host_port); 715d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 725d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' TurnerMigrationState *tcp_start_outgoing_migration(const char *host_port, 735d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int64_t bandwidth_limit, 745d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner int detach); 755d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 765d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid migrate_fd_monitor_suspend(FdMigrationState *s); 775d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 785d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid migrate_fd_error(FdMigrationState *s); 795d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 805d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid migrate_fd_cleanup(FdMigrationState *s); 815d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 825d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid migrate_fd_put_notify(void *opaque); 835d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 845d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerssize_t migrate_fd_put_buffer(void *opaque, const void *data, size_t size); 855d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 865d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid migrate_fd_connect(FdMigrationState *s); 875d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 885d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid migrate_fd_put_ready(void *opaque); 895d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 905d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint migrate_fd_get_status(MigrationState *mig_state); 915d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 925d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid migrate_fd_cancel(MigrationState *mig_state); 935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 945d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid migrate_fd_release(MigrationState *mig_state); 955d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 965d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid migrate_fd_wait_for_unfreeze(void *opaque); 975d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 985d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerint migrate_fd_close(void *opaque); 995d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 1005d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnerstatic inline FdMigrationState *migrate_to_fms(MigrationState *mig_state) 1015d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 1025d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner return container_of(mig_state, FdMigrationState, mig_state); 1035d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 1045d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 105280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turneruint64_t ram_bytes_remaining(void); 106280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turneruint64_t ram_bytes_transferred(void); 107280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turneruint64_t ram_bytes_total(void); 108280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 109280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerint ram_save_live(QEMUFile *f, int stage, void *opaque); 110280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turnerint ram_load(QEMUFile *f, void *opaque, int version_id); 111280afa072a7b829e581d884c2b3276530a6014b7David 'Digit' Turner 1125d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#endif 113