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