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() 6301c3ac68SCédric Le Goater * @errp: pointer to Error*, to store an error if it happens. 64ee8bb867SCédric Le Goater * 65ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 66ee8bb867SCédric Le Goater */ 6701c3ac68SCédric Le Goater int (*save_setup)(QEMUFile *f, void *opaque, Error **errp); 68ee8bb867SCédric Le Goater 69ee8bb867SCédric Le Goater /** 70ee8bb867SCédric Le Goater * @save_cleanup 71ee8bb867SCédric Le Goater * 72ee8bb867SCédric Le Goater * Uninitializes the data structures on the source 73ee8bb867SCédric Le Goater * 74ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 75ee8bb867SCédric Le Goater */ 7670f794fcSJuan Quintela void (*save_cleanup)(void *opaque); 77ee8bb867SCédric Le Goater 78ee8bb867SCédric Le Goater /** 79ee8bb867SCédric Le Goater * @save_live_complete_postcopy 80ee8bb867SCédric Le Goater * 81ee8bb867SCédric Le Goater * Called at the end of postcopy for all postcopyable devices. 82ee8bb867SCédric Le Goater * 83ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 84ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 85ee8bb867SCédric Le Goater * 86ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 87ee8bb867SCédric Le Goater */ 88f2a8f0a6SJuan Quintela int (*save_live_complete_postcopy)(QEMUFile *f, void *opaque); 89ee8bb867SCédric Le Goater 90ee8bb867SCédric Le Goater /** 91ee8bb867SCédric Le Goater * @save_live_complete_precopy 92ee8bb867SCédric Le Goater * 93ee8bb867SCédric Le Goater * Transmits the last section for the device containing any 94ee8bb867SCédric Le Goater * remaining data at the end of a precopy phase. When postcopy is 95ee8bb867SCédric Le Goater * enabled, devices that support postcopy will skip this step, 96ee8bb867SCédric Le Goater * where the final data will be flushed at the end of postcopy via 97ee8bb867SCédric Le Goater * @save_live_complete_postcopy instead. 98ee8bb867SCédric Le Goater * 99ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 100ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 101ee8bb867SCédric Le Goater * 102ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 103ee8bb867SCédric Le Goater */ 104f2a8f0a6SJuan Quintela int (*save_live_complete_precopy)(QEMUFile *f, void *opaque); 105f2a8f0a6SJuan Quintela 106a4a411fbSStefan Hajnoczi /* This runs both outside and inside the BQL. */ 107ee8bb867SCédric Le Goater 108ee8bb867SCédric Le Goater /** 109ee8bb867SCédric Le Goater * @is_active 110ee8bb867SCédric Le Goater * 111ee8bb867SCédric Le Goater * Will skip a state section if not active 112ee8bb867SCédric Le Goater * 113ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 114ee8bb867SCédric Le Goater * 115ee8bb867SCédric Le Goater * Returns true if state section is active else false 116ee8bb867SCédric Le Goater */ 117f2a8f0a6SJuan Quintela bool (*is_active)(void *opaque); 118ee8bb867SCédric Le Goater 119ee8bb867SCédric Le Goater /** 120ee8bb867SCédric Le Goater * @has_postcopy 121ee8bb867SCédric Le Goater * 122ee8bb867SCédric Le Goater * Checks if a device supports postcopy 123ee8bb867SCédric Le Goater * 124ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 125ee8bb867SCédric Le Goater * 126ee8bb867SCédric Le Goater * Returns true for postcopy support else false 127ee8bb867SCédric Le Goater */ 128c6467627SVladimir Sementsov-Ogievskiy bool (*has_postcopy)(void *opaque); 129f2a8f0a6SJuan Quintela 130ee8bb867SCédric Le Goater /** 131ee8bb867SCédric Le Goater * @is_active_iterate 132ee8bb867SCédric Le Goater * 133ee8bb867SCédric Le Goater * As #SaveVMHandlers.is_active(), will skip an inactive state 134ee8bb867SCédric Le Goater * section in qemu_savevm_state_iterate. 135ee8bb867SCédric Le Goater * 136ee8bb867SCédric Le Goater * For example, it is needed for only-postcopy-states, which needs 137ee8bb867SCédric Le Goater * to be handled by qemu_savevm_state_setup() and 138ee8bb867SCédric Le Goater * qemu_savevm_state_pending(), but do not need iterations until 139ee8bb867SCédric Le Goater * not in postcopy stage. 140ee8bb867SCédric Le Goater * 141ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 142ee8bb867SCédric Le Goater * 143ee8bb867SCédric Le Goater * Returns true if state section is active else false 144c865d848SVladimir Sementsov-Ogievskiy */ 145c865d848SVladimir Sementsov-Ogievskiy bool (*is_active_iterate)(void *opaque); 146c865d848SVladimir Sementsov-Ogievskiy 147a4a411fbSStefan Hajnoczi /* This runs outside the BQL in the migration case, and 148f2a8f0a6SJuan Quintela * within the lock in the savevm case. The callback had better only 149f2a8f0a6SJuan Quintela * use data that is local to the migration thread or protected 150f2a8f0a6SJuan Quintela * by other locks. 151f2a8f0a6SJuan Quintela */ 152ee8bb867SCédric Le Goater 153ee8bb867SCédric Le Goater /** 154ee8bb867SCédric Le Goater * @save_live_iterate 155ee8bb867SCédric Le Goater * 156ee8bb867SCédric Le Goater * Should send a chunk of data until the point that stream 157ee8bb867SCédric Le Goater * bandwidth limits tell it to stop. Each call generates one 158ee8bb867SCédric Le Goater * section. 159ee8bb867SCédric Le Goater * 160ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 161ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 162ee8bb867SCédric Le Goater * 163ee8bb867SCédric Le Goater * Returns 0 to indicate that there is still more data to send, 164ee8bb867SCédric Le Goater * 1 that there is no more data to send and 165ee8bb867SCédric Le Goater * negative to indicate an error. 166ee8bb867SCédric Le Goater */ 167f2a8f0a6SJuan Quintela int (*save_live_iterate)(QEMUFile *f, void *opaque); 168f2a8f0a6SJuan Quintela 169a4a411fbSStefan Hajnoczi /* This runs outside the BQL! */ 170ee8bb867SCédric Le Goater 171ee8bb867SCédric Le Goater /** 172ee8bb867SCédric Le Goater * @state_pending_estimate 17347995026SVladimir Sementsov-Ogievskiy * 174ee8bb867SCédric Le Goater * This estimates the remaining data to transfer 17524beea4eSJuan Quintela * 176ee8bb867SCédric Le Goater * Sum of @can_postcopy and @must_postcopy is the whole amount of 17724beea4eSJuan Quintela * pending data. 178ee8bb867SCédric Le Goater * 179ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 180ee8bb867SCédric Le Goater * @must_precopy: amount of data that must be migrated in precopy 181ee8bb867SCédric Le Goater * or in stopped state, i.e. that must be migrated 182ee8bb867SCédric Le Goater * before target start. 183ee8bb867SCédric Le Goater * @can_postcopy: amount of data that can be migrated in postcopy 184ee8bb867SCédric Le Goater * or in stopped state, i.e. after target start. 185ee8bb867SCédric Le Goater * Some can also be migrated during precopy (RAM). 186ee8bb867SCédric Le Goater * Some must be migrated after source stops 187ee8bb867SCédric Le Goater * (block-dirty-bitmap) 18847995026SVladimir Sementsov-Ogievskiy */ 18924beea4eSJuan Quintela void (*state_pending_estimate)(void *opaque, uint64_t *must_precopy, 19024beea4eSJuan Quintela uint64_t *can_postcopy); 191ee8bb867SCédric Le Goater 192ee8bb867SCédric Le Goater /** 193ee8bb867SCédric Le Goater * @state_pending_exact 194ee8bb867SCédric Le Goater * 195ee8bb867SCédric Le Goater * This calculates the exact remaining data to transfer 196ee8bb867SCédric Le Goater * 197ee8bb867SCédric Le Goater * Sum of @can_postcopy and @must_postcopy is the whole amount of 198ee8bb867SCédric Le Goater * pending data. 199ee8bb867SCédric Le Goater * 200ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 201ee8bb867SCédric Le Goater * @must_precopy: amount of data that must be migrated in precopy 202ee8bb867SCédric Le Goater * or in stopped state, i.e. that must be migrated 203ee8bb867SCédric Le Goater * before target start. 204ee8bb867SCédric Le Goater * @can_postcopy: amount of data that can be migrated in postcopy 205ee8bb867SCédric Le Goater * or in stopped state, i.e. after target start. 206ee8bb867SCédric Le Goater * Some can also be migrated during precopy (RAM). 207ee8bb867SCédric Le Goater * Some must be migrated after source stops 208ee8bb867SCédric Le Goater * (block-dirty-bitmap) 209ee8bb867SCédric Le Goater */ 21024beea4eSJuan Quintela void (*state_pending_exact)(void *opaque, uint64_t *must_precopy, 21124beea4eSJuan Quintela uint64_t *can_postcopy); 212ee8bb867SCédric Le Goater 213ee8bb867SCédric Le Goater /** 214ee8bb867SCédric Le Goater * @load_state 215ee8bb867SCédric Le Goater * 216ee8bb867SCédric Le Goater * Load sections generated by any of the save functions that 217ee8bb867SCédric Le Goater * generate sections. 218ee8bb867SCédric Le Goater * 219ee8bb867SCédric Le Goater * Legacy method. Should be deprecated when all users are ported 220ee8bb867SCédric Le Goater * to VMStateDescription. 221ee8bb867SCédric Le Goater * 222ee8bb867SCédric Le Goater * @f: QEMUFile where to receive the data 223ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 224ee8bb867SCédric Le Goater * @version_id: the maximum version_id supported 225ee8bb867SCédric Le Goater * 226ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 227ee8bb867SCédric Le Goater */ 228f61efdeeSCédric Le Goater int (*load_state)(QEMUFile *f, void *opaque, int version_id); 229ee8bb867SCédric Le Goater 230ee8bb867SCédric Le Goater /** 231ee8bb867SCédric Le Goater * @load_setup 232ee8bb867SCédric Le Goater * 233ee8bb867SCédric Le Goater * Initializes the data structures on the destination. 234ee8bb867SCédric Le Goater * 235ee8bb867SCédric Le Goater * @f: QEMUFile where to receive the data 236ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 237e4fa064dSCédric Le Goater * @errp: pointer to Error*, to store an error if it happens. 238ee8bb867SCédric Le Goater * 239ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 240ee8bb867SCédric Le Goater */ 241e4fa064dSCédric Le Goater int (*load_setup)(QEMUFile *f, void *opaque, Error **errp); 242ee8bb867SCédric Le Goater 243ee8bb867SCédric Le Goater /** 244ee8bb867SCédric Le Goater * @load_cleanup 245ee8bb867SCédric Le Goater * 246ee8bb867SCédric Le Goater * Uninitializes the data structures on the destination. 247ee8bb867SCédric Le Goater * 248ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 249ee8bb867SCédric Le Goater * 250ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 251ee8bb867SCédric Le Goater */ 252acb5ea86SJuan Quintela int (*load_cleanup)(void *opaque); 253ee8bb867SCédric Le Goater 254ee8bb867SCédric Le Goater /** 255ee8bb867SCédric Le Goater * @resume_prepare 256ee8bb867SCédric Le Goater * 257ee8bb867SCédric Le Goater * Called when postcopy migration wants to resume from failure 258ee8bb867SCédric Le Goater * 259ee8bb867SCédric Le Goater * @s: Current migration state 260ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 261ee8bb867SCédric Le Goater * 262ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 263ee8bb867SCédric Le Goater */ 264d1b8eadbSPeter Xu int (*resume_prepare)(MigrationState *s, void *opaque); 265ee8bb867SCédric Le Goater 266ee8bb867SCédric Le Goater /** 267ee8bb867SCédric Le Goater * @switchover_ack_needed 268ee8bb867SCédric Le Goater * 269ee8bb867SCédric Le Goater * Checks if switchover ack should be used. Called only on 270ee8bb867SCédric Le Goater * destination. 271ee8bb867SCédric Le Goater * 272ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 273ee8bb867SCédric Le Goater * 274ee8bb867SCédric Le Goater * Returns true if switchover ack should be used and false 275ee8bb867SCédric Le Goater * otherwise 276ee8bb867SCédric Le Goater */ 2771b4adb10SAvihai Horon bool (*switchover_ack_needed)(void *opaque); 278f2a8f0a6SJuan Quintela } SaveVMHandlers; 279f2a8f0a6SJuan Quintela 280ee8bb867SCédric Le Goater /** 281ee8bb867SCédric Le Goater * register_savevm_live: Register a set of custom migration handlers 282ee8bb867SCédric Le Goater * 283ee8bb867SCédric Le Goater * @idstr: state section identifier 284ee8bb867SCédric Le Goater * @instance_id: instance id 285ee8bb867SCédric Le Goater * @version_id: version id supported 286ee8bb867SCédric Le Goater * @ops: SaveVMHandlers structure 287ee8bb867SCédric Le Goater * @opaque: data pointer passed to SaveVMHandlers handlers 288ee8bb867SCédric Le Goater */ 289ce62df53SDr. David Alan Gilbert int register_savevm_live(const char *idstr, 29093062e23SPeter Xu uint32_t instance_id, 291f2a8f0a6SJuan Quintela int version_id, 292de22ded0SMarc-André Lureau const SaveVMHandlers *ops, 293f2a8f0a6SJuan Quintela void *opaque); 294f2a8f0a6SJuan Quintela 295ee8bb867SCédric Le Goater /** 296ee8bb867SCédric Le Goater * unregister_savevm: Unregister custom migration handlers 297ee8bb867SCédric Le Goater * 298ee8bb867SCédric Le Goater * @obj: object associated with state section 299ee8bb867SCédric Le Goater * @idstr: state section identifier 300ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 301ee8bb867SCédric Le Goater */ 3023cad405bSMarc-André Lureau void unregister_savevm(VMStateIf *obj, const char *idstr, void *opaque); 303f2a8f0a6SJuan Quintela 304f2a8f0a6SJuan Quintela #endif 305