xref: /openbmc/qemu/include/migration/register.h (revision 40d6ee94)
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 
17 typedef 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 
71 int 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 
78 void unregister_savevm(DeviceState *dev, const char *idstr, void *opaque);
79 
80 #endif
81