1/*
2 * QEMU migration vmstate registration
3 *
4 * Copyright IBM, Corp. 2008
5 *
6 * Authors:
7 * Anthony Liguori <aliguori@us.ibm.com>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
11 *
12 */
13
14#ifndef MIGRATION_REGISTER_H
15#define MIGRATION_REGISTER_H
16
17typedef struct SaveVMHandlers {
18 /* This runs inside the iothread lock. */
19 SaveStateHandler *save_state;
20
21 void (*save_cleanup)(void *opaque);
22 int (*save_live_complete_postcopy)(QEMUFile *f, void *opaque);
23 int (*save_live_complete_precopy)(QEMUFile *f, void *opaque);
24
25 /* This runs both outside and inside the iothread lock. */
26 bool (*is_active)(void *opaque);
27 bool (*has_postcopy)(void *opaque);
28
29 /* is_active_iterate
30 * If it is not NULL then qemu_savevm_state_iterate will skip iteration if
31 * it returns false. For example, it is needed for only-postcopy-states,
32 * which needs to be handled by qemu_savevm_state_setup and
33 * qemu_savevm_state_pending, but do not need iterations until not in
34 * postcopy stage.
35 */
36 bool (*is_active_iterate)(void *opaque);
37
38 /* This runs outside the iothread lock in the migration case, and
39 * within the lock in the savevm case. The callback had better only
40 * use data that is local to the migration thread or protected
41 * by other locks.
42 */
43 int (*save_live_iterate)(QEMUFile *f, void *opaque);
44
45 /* This runs outside the iothread lock! */
46 int (*save_setup)(QEMUFile *f, void *opaque);
47 void (*save_live_pending)(QEMUFile *f, void *opaque,
48 uint64_t threshold_size,
49 uint64_t *res_precopy_only,
50 uint64_t *res_compatible,
51 uint64_t *res_postcopy_only);
52 /* Note for save_live_pending:
53 * - res_precopy_only is for data which must be migrated in precopy phase
54 * or in stopped state, in other words - before target vm start
55 * - res_compatible is for data which may be migrated in any phase
56 * - res_postcopy_only is for data which must be migrated in postcopy phase
57 * or in stopped state, in other words - after source vm stop
58 *
59 * Sum of res_postcopy_only, res_compatible and res_postcopy_only is the
60 * whole amount of pending data.
61 */
62
63
64 LoadStateHandler *load_state;
65 int (*load_setup)(QEMUFile *f, void *opaque);
66 int (*load_cleanup)(void *opaque);
67 /* Called when postcopy migration wants to resume from failure */
68 int (*resume_prepare)(MigrationState *s, void *opaque);
69} SaveVMHandlers;
70
71int register_savevm_live(DeviceState *dev,
72 const char *idstr,
73 int instance_id,
74 int version_id,
75 const SaveVMHandlers *ops,
76 void *opaque);
77
78void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque);
79
80#endif
81