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 | |