1f2a8f0a6SJuan Quintela /* 2f2a8f0a6SJuan Quintela * QEMU migration vmstate registration 3f2a8f0a6SJuan Quintela * 4f2a8f0a6SJuan Quintela * Copyright IBM, Corp. 2008 5f2a8f0a6SJuan Quintela * 6f2a8f0a6SJuan Quintela * Authors: 7f2a8f0a6SJuan Quintela * Anthony Liguori <aliguori@us.ibm.com> 8f2a8f0a6SJuan Quintela * 9f2a8f0a6SJuan Quintela * This work is licensed under the terms of the GNU GPL, version 2. See 10f2a8f0a6SJuan Quintela * the COPYING file in the top-level directory. 11f2a8f0a6SJuan Quintela * 12f2a8f0a6SJuan Quintela */ 13f2a8f0a6SJuan Quintela 14f2a8f0a6SJuan Quintela #ifndef MIGRATION_REGISTER_H 15f2a8f0a6SJuan Quintela #define MIGRATION_REGISTER_H 16f2a8f0a6SJuan Quintela 17107b5969SMarc-André Lureau #include "hw/vmstate-if.h" 18107b5969SMarc-André Lureau 19ee8bb867SCédric Le Goater /** 20ee8bb867SCédric Le Goater * struct SaveVMHandlers: handler structure to finely control 21ee8bb867SCédric Le Goater * migration of complex subsystems and devices, such as RAM, block and 22ee8bb867SCédric Le Goater * VFIO. 23ee8bb867SCédric Le Goater */ 24f2a8f0a6SJuan Quintela typedef struct SaveVMHandlers { 25ee8bb867SCédric Le Goater 26ee8bb867SCédric Le Goater /* The following handlers run inside the BQL. */ 27ee8bb867SCédric Le Goater 28ee8bb867SCédric Le Goater /** 29ee8bb867SCédric Le Goater * @save_state 30ee8bb867SCédric Le Goater * 31ee8bb867SCédric Le Goater * Saves state section on the source using the latest state format 32ee8bb867SCédric Le Goater * version. 33ee8bb867SCédric Le Goater * 34ee8bb867SCédric Le Goater * Legacy method. Should be deprecated when all users are ported 35ee8bb867SCédric Le Goater * to VMStateDescription. 36ee8bb867SCédric Le Goater * 37ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 38ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 39ee8bb867SCédric Le Goater */ 40f61efdeeSCédric Le Goater void (*save_state)(QEMUFile *f, void *opaque); 41f2a8f0a6SJuan Quintela 42ee8bb867SCédric Le Goater /** 43ee8bb867SCédric Le Goater * @save_prepare 44ee8bb867SCédric Le Goater * 45ee8bb867SCédric Le Goater * Called early, even before migration starts, and can be used to 46ee8bb867SCédric Le Goater * perform early checks. 47ee8bb867SCédric Le Goater * 48ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 49ee8bb867SCédric Le Goater * @errp: pointer to Error*, to store an error if it happens. 50ee8bb867SCédric Le Goater * 51ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 5208fc4cb5SAvihai Horon */ 5308fc4cb5SAvihai Horon int (*save_prepare)(void *opaque, Error **errp); 54ee8bb867SCédric Le Goater 55ee8bb867SCédric Le Goater /** 56ee8bb867SCédric Le Goater * @save_setup 57ee8bb867SCédric Le Goater * 58ee8bb867SCédric Le Goater * Initializes the data structures on the source and transmits 59ee8bb867SCédric Le Goater * first section containing information on the device 60ee8bb867SCédric Le Goater * 61ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 62ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 63ee8bb867SCédric Le Goater * 64ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 65ee8bb867SCédric Le Goater */ 66930e239dSFiona Ebner int (*save_setup)(QEMUFile *f, void *opaque); 67ee8bb867SCédric Le Goater 68ee8bb867SCédric Le Goater /** 69ee8bb867SCédric Le Goater * @save_cleanup 70ee8bb867SCédric Le Goater * 71ee8bb867SCédric Le Goater * Uninitializes the data structures on the source 72ee8bb867SCédric Le Goater * 73ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 74ee8bb867SCédric Le Goater */ 7570f794fcSJuan Quintela void (*save_cleanup)(void *opaque); 76ee8bb867SCédric Le Goater 77ee8bb867SCédric Le Goater /** 78ee8bb867SCédric Le Goater * @save_live_complete_postcopy 79ee8bb867SCédric Le Goater * 80ee8bb867SCédric Le Goater * Called at the end of postcopy for all postcopyable devices. 81ee8bb867SCédric Le Goater * 82ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 83ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 84ee8bb867SCédric Le Goater * 85ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 86ee8bb867SCédric Le Goater */ 87f2a8f0a6SJuan Quintela int (*save_live_complete_postcopy)(QEMUFile *f, void *opaque); 88ee8bb867SCédric Le Goater 89ee8bb867SCédric Le Goater /** 90ee8bb867SCédric Le Goater * @save_live_complete_precopy 91ee8bb867SCédric Le Goater * 92ee8bb867SCédric Le Goater * Transmits the last section for the device containing any 93ee8bb867SCédric Le Goater * remaining data at the end of a precopy phase. When postcopy is 94ee8bb867SCédric Le Goater * enabled, devices that support postcopy will skip this step, 95ee8bb867SCédric Le Goater * where the final data will be flushed at the end of postcopy via 96ee8bb867SCédric Le Goater * @save_live_complete_postcopy instead. 97ee8bb867SCédric Le Goater * 98ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 99ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 100ee8bb867SCédric Le Goater * 101ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 102ee8bb867SCédric Le Goater */ 103f2a8f0a6SJuan Quintela int (*save_live_complete_precopy)(QEMUFile *f, void *opaque); 104f2a8f0a6SJuan Quintela 105a4a411fbSStefan Hajnoczi /* This runs both outside and inside the BQL. */ 106ee8bb867SCédric Le Goater 107ee8bb867SCédric Le Goater /** 108ee8bb867SCédric Le Goater * @is_active 109ee8bb867SCédric Le Goater * 110ee8bb867SCédric Le Goater * Will skip a state section if not active 111ee8bb867SCédric Le Goater * 112ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 113ee8bb867SCédric Le Goater * 114ee8bb867SCédric Le Goater * Returns true if state section is active else false 115ee8bb867SCédric Le Goater */ 116f2a8f0a6SJuan Quintela bool (*is_active)(void *opaque); 117ee8bb867SCédric Le Goater 118ee8bb867SCédric Le Goater /** 119ee8bb867SCédric Le Goater * @has_postcopy 120ee8bb867SCédric Le Goater * 121ee8bb867SCédric Le Goater * Checks if a device supports postcopy 122ee8bb867SCédric Le Goater * 123ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 124ee8bb867SCédric Le Goater * 125ee8bb867SCédric Le Goater * Returns true for postcopy support else false 126ee8bb867SCédric Le Goater */ 127c6467627SVladimir Sementsov-Ogievskiy bool (*has_postcopy)(void *opaque); 128f2a8f0a6SJuan Quintela 129ee8bb867SCédric Le Goater /** 130ee8bb867SCédric Le Goater * @is_active_iterate 131ee8bb867SCédric Le Goater * 132ee8bb867SCédric Le Goater * As #SaveVMHandlers.is_active(), will skip an inactive state 133ee8bb867SCédric Le Goater * section in qemu_savevm_state_iterate. 134ee8bb867SCédric Le Goater * 135ee8bb867SCédric Le Goater * For example, it is needed for only-postcopy-states, which needs 136ee8bb867SCédric Le Goater * to be handled by qemu_savevm_state_setup() and 137ee8bb867SCédric Le Goater * qemu_savevm_state_pending(), but do not need iterations until 138ee8bb867SCédric Le Goater * not in postcopy stage. 139ee8bb867SCédric Le Goater * 140ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 141ee8bb867SCédric Le Goater * 142ee8bb867SCédric Le Goater * Returns true if state section is active else false 143c865d848SVladimir Sementsov-Ogievskiy */ 144c865d848SVladimir Sementsov-Ogievskiy bool (*is_active_iterate)(void *opaque); 145c865d848SVladimir Sementsov-Ogievskiy 146a4a411fbSStefan Hajnoczi /* This runs outside the BQL in the migration case, and 147f2a8f0a6SJuan Quintela * within the lock in the savevm case. The callback had better only 148f2a8f0a6SJuan Quintela * use data that is local to the migration thread or protected 149f2a8f0a6SJuan Quintela * by other locks. 150f2a8f0a6SJuan Quintela */ 151ee8bb867SCédric Le Goater 152ee8bb867SCédric Le Goater /** 153ee8bb867SCédric Le Goater * @save_live_iterate 154ee8bb867SCédric Le Goater * 155ee8bb867SCédric Le Goater * Should send a chunk of data until the point that stream 156ee8bb867SCédric Le Goater * bandwidth limits tell it to stop. Each call generates one 157ee8bb867SCédric Le Goater * section. 158ee8bb867SCédric Le Goater * 159ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 160ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 161ee8bb867SCédric Le Goater * 162ee8bb867SCédric Le Goater * Returns 0 to indicate that there is still more data to send, 163ee8bb867SCédric Le Goater * 1 that there is no more data to send and 164ee8bb867SCédric Le Goater * negative to indicate an error. 165ee8bb867SCédric Le Goater */ 166f2a8f0a6SJuan Quintela int (*save_live_iterate)(QEMUFile *f, void *opaque); 167f2a8f0a6SJuan Quintela 168a4a411fbSStefan Hajnoczi /* This runs outside the BQL! */ 169ee8bb867SCédric Le Goater 170ee8bb867SCédric Le Goater /** 171ee8bb867SCédric Le Goater * @state_pending_estimate 17247995026SVladimir Sementsov-Ogievskiy * 173ee8bb867SCédric Le Goater * This estimates the remaining data to transfer 17424beea4eSJuan Quintela * 175ee8bb867SCédric Le Goater * Sum of @can_postcopy and @must_postcopy is the whole amount of 17624beea4eSJuan Quintela * pending data. 177ee8bb867SCédric Le Goater * 178ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 179ee8bb867SCédric Le Goater * @must_precopy: amount of data that must be migrated in precopy 180ee8bb867SCédric Le Goater * or in stopped state, i.e. that must be migrated 181ee8bb867SCédric Le Goater * before target start. 182ee8bb867SCédric Le Goater * @can_postcopy: amount of data that can be migrated in postcopy 183ee8bb867SCédric Le Goater * or in stopped state, i.e. after target start. 184ee8bb867SCédric Le Goater * Some can also be migrated during precopy (RAM). 185ee8bb867SCédric Le Goater * Some must be migrated after source stops 186ee8bb867SCédric Le Goater * (block-dirty-bitmap) 18747995026SVladimir Sementsov-Ogievskiy */ 18824beea4eSJuan Quintela void (*state_pending_estimate)(void *opaque, uint64_t *must_precopy, 18924beea4eSJuan Quintela uint64_t *can_postcopy); 190ee8bb867SCédric Le Goater 191ee8bb867SCédric Le Goater /** 192ee8bb867SCédric Le Goater * @state_pending_exact 193ee8bb867SCédric Le Goater * 194ee8bb867SCédric Le Goater * This calculates the exact remaining data to transfer 195ee8bb867SCédric Le Goater * 196ee8bb867SCédric Le Goater * Sum of @can_postcopy and @must_postcopy is the whole amount of 197ee8bb867SCédric Le Goater * pending data. 198ee8bb867SCédric Le Goater * 199ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 200ee8bb867SCédric Le Goater * @must_precopy: amount of data that must be migrated in precopy 201ee8bb867SCédric Le Goater * or in stopped state, i.e. that must be migrated 202ee8bb867SCédric Le Goater * before target start. 203ee8bb867SCédric Le Goater * @can_postcopy: amount of data that can be migrated in postcopy 204ee8bb867SCédric Le Goater * or in stopped state, i.e. after target start. 205ee8bb867SCédric Le Goater * Some can also be migrated during precopy (RAM). 206ee8bb867SCédric Le Goater * Some must be migrated after source stops 207ee8bb867SCédric Le Goater * (block-dirty-bitmap) 208ee8bb867SCédric Le Goater */ 20924beea4eSJuan Quintela void (*state_pending_exact)(void *opaque, uint64_t *must_precopy, 21024beea4eSJuan Quintela uint64_t *can_postcopy); 211ee8bb867SCédric Le Goater 212ee8bb867SCédric Le Goater /** 213ee8bb867SCédric Le Goater * @load_state 214ee8bb867SCédric Le Goater * 215ee8bb867SCédric Le Goater * Load sections generated by any of the save functions that 216ee8bb867SCédric Le Goater * generate sections. 217ee8bb867SCédric Le Goater * 218ee8bb867SCédric Le Goater * Legacy method. Should be deprecated when all users are ported 219ee8bb867SCédric Le Goater * to VMStateDescription. 220ee8bb867SCédric Le Goater * 221ee8bb867SCédric Le Goater * @f: QEMUFile where to receive the data 222ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 223ee8bb867SCédric Le Goater * @version_id: the maximum version_id supported 224ee8bb867SCédric Le Goater * 225ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 226ee8bb867SCédric Le Goater */ 227f61efdeeSCédric Le Goater int (*load_state)(QEMUFile *f, void *opaque, int version_id); 228ee8bb867SCédric Le Goater 229ee8bb867SCédric Le Goater /** 230ee8bb867SCédric Le Goater * @load_setup 231ee8bb867SCédric Le Goater * 232ee8bb867SCédric Le Goater * Initializes the data structures on the destination. 233ee8bb867SCédric Le Goater * 234ee8bb867SCédric Le Goater * @f: QEMUFile where to receive the data 235ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 236ee8bb867SCédric Le Goater * 237ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 238ee8bb867SCédric Le Goater */ 239acb5ea86SJuan Quintela int (*load_setup)(QEMUFile *f, void *opaque); 240ee8bb867SCédric Le Goater 241ee8bb867SCédric Le Goater /** 242ee8bb867SCédric Le Goater * @load_cleanup 243ee8bb867SCédric Le Goater * 244ee8bb867SCédric Le Goater * Uninitializes the data structures on the destination. 245ee8bb867SCédric Le Goater * 246ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 247ee8bb867SCédric Le Goater * 248ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 249ee8bb867SCédric Le Goater */ 250acb5ea86SJuan Quintela int (*load_cleanup)(void *opaque); 251ee8bb867SCédric Le Goater 252ee8bb867SCédric Le Goater /** 253ee8bb867SCédric Le Goater * @resume_prepare 254ee8bb867SCédric Le Goater * 255ee8bb867SCédric Le Goater * Called when postcopy migration wants to resume from failure 256ee8bb867SCédric Le Goater * 257ee8bb867SCédric Le Goater * @s: Current migration state 258ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 259ee8bb867SCédric Le Goater * 260ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 261ee8bb867SCédric Le Goater */ 262d1b8eadbSPeter Xu int (*resume_prepare)(MigrationState *s, void *opaque); 263ee8bb867SCédric Le Goater 264ee8bb867SCédric Le Goater /** 265ee8bb867SCédric Le Goater * @switchover_ack_needed 266ee8bb867SCédric Le Goater * 267ee8bb867SCédric Le Goater * Checks if switchover ack should be used. Called only on 268ee8bb867SCédric Le Goater * destination. 269ee8bb867SCédric Le Goater * 270ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 271ee8bb867SCédric Le Goater * 272ee8bb867SCédric Le Goater * Returns true if switchover ack should be used and false 273ee8bb867SCédric Le Goater * otherwise 274ee8bb867SCédric Le Goater */ 2751b4adb10SAvihai Horon bool (*switchover_ack_needed)(void *opaque); 276f2a8f0a6SJuan Quintela } SaveVMHandlers; 277f2a8f0a6SJuan Quintela 278ee8bb867SCédric Le Goater /** 279ee8bb867SCédric Le Goater * register_savevm_live: Register a set of custom migration handlers 280ee8bb867SCédric Le Goater * 281ee8bb867SCédric Le Goater * @idstr: state section identifier 282ee8bb867SCédric Le Goater * @instance_id: instance id 283ee8bb867SCédric Le Goater * @version_id: version id supported 284ee8bb867SCédric Le Goater * @ops: SaveVMHandlers structure 285ee8bb867SCédric Le Goater * @opaque: data pointer passed to SaveVMHandlers handlers 286ee8bb867SCédric Le Goater */ 287ce62df53SDr. David Alan Gilbert int register_savevm_live(const char *idstr, 28893062e23SPeter Xu uint32_t instance_id, 289f2a8f0a6SJuan Quintela int version_id, 290de22ded0SMarc-André Lureau const SaveVMHandlers *ops, 291f2a8f0a6SJuan Quintela void *opaque); 292f2a8f0a6SJuan Quintela 293ee8bb867SCédric Le Goater /** 294ee8bb867SCédric Le Goater * unregister_savevm: Unregister custom migration handlers 295ee8bb867SCédric Le Goater * 296ee8bb867SCédric Le Goater * @obj: object associated with state section 297ee8bb867SCédric Le Goater * @idstr: state section identifier 298ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 299ee8bb867SCédric Le Goater */ 3003cad405bSMarc-André Lureau void unregister_savevm(VMStateIf *obj, const char *idstr, void *opaque); 301f2a8f0a6SJuan Quintela 302f2a8f0a6SJuan Quintela #endif 303