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 * 72d3237d0dSMaciej S. Szmigiero * Uninitializes the data structures on the source. 73d3237d0dSMaciej S. Szmigiero * Note that this handler can be called even if save_setup 74d3237d0dSMaciej S. Szmigiero * wasn't called earlier. 75ee8bb867SCédric Le Goater * 76ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 77ee8bb867SCédric Le Goater */ 7870f794fcSJuan Quintela void (*save_cleanup)(void *opaque); 79ee8bb867SCédric Le Goater 80ee8bb867SCédric Le Goater /** 81ee8bb867SCédric Le Goater * @save_live_complete_postcopy 82ee8bb867SCédric Le Goater * 83ee8bb867SCédric Le Goater * Called at the end of postcopy for all postcopyable devices. 84ee8bb867SCédric Le Goater * 85ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 86ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 87ee8bb867SCédric Le Goater * 88ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 89ee8bb867SCédric Le Goater */ 90f2a8f0a6SJuan Quintela int (*save_live_complete_postcopy)(QEMUFile *f, void *opaque); 91ee8bb867SCédric Le Goater 92ee8bb867SCédric Le Goater /** 93ee8bb867SCédric Le Goater * @save_live_complete_precopy 94ee8bb867SCédric Le Goater * 95ee8bb867SCédric Le Goater * Transmits the last section for the device containing any 96ee8bb867SCédric Le Goater * remaining data at the end of a precopy phase. When postcopy is 97ee8bb867SCédric Le Goater * enabled, devices that support postcopy will skip this step, 98ee8bb867SCédric Le Goater * where the final data will be flushed at the end of postcopy via 99ee8bb867SCédric Le Goater * @save_live_complete_postcopy instead. 100ee8bb867SCédric Le Goater * 101ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 102ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 103ee8bb867SCédric Le Goater * 104ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 105ee8bb867SCédric Le Goater */ 106f2a8f0a6SJuan Quintela int (*save_live_complete_precopy)(QEMUFile *f, void *opaque); 107f2a8f0a6SJuan Quintela 108*8305921aSMaciej S. Szmigiero /** 109*8305921aSMaciej S. Szmigiero * @save_live_complete_precopy_thread (invoked in a separate thread) 110*8305921aSMaciej S. Szmigiero * 111*8305921aSMaciej S. Szmigiero * Called at the end of a precopy phase from a separate worker thread 112*8305921aSMaciej S. Szmigiero * in configurations where multifd device state transfer is supported 113*8305921aSMaciej S. Szmigiero * in order to perform asynchronous transmission of the remaining data in 114*8305921aSMaciej S. Szmigiero * parallel with @save_live_complete_precopy handlers. 115*8305921aSMaciej S. Szmigiero * When postcopy is enabled, devices that support postcopy will skip this 116*8305921aSMaciej S. Szmigiero * step. 117*8305921aSMaciej S. Szmigiero * 118*8305921aSMaciej S. Szmigiero * @d: a #SaveLiveCompletePrecopyThreadData containing parameters that the 119*8305921aSMaciej S. Szmigiero * handler may need, including this device section idstr and instance_id, 120*8305921aSMaciej S. Szmigiero * and opaque data pointer passed to register_savevm_live(). 121*8305921aSMaciej S. Szmigiero * @errp: pointer to Error*, to store an error if it happens. 122*8305921aSMaciej S. Szmigiero * 123*8305921aSMaciej S. Szmigiero * Returns true to indicate success and false for errors. 124*8305921aSMaciej S. Szmigiero */ 125*8305921aSMaciej S. Szmigiero SaveLiveCompletePrecopyThreadHandler save_live_complete_precopy_thread; 126*8305921aSMaciej S. Szmigiero 127a4a411fbSStefan Hajnoczi /* This runs both outside and inside the BQL. */ 128ee8bb867SCédric Le Goater 129ee8bb867SCédric Le Goater /** 130ee8bb867SCédric Le Goater * @is_active 131ee8bb867SCédric Le Goater * 132ee8bb867SCédric Le Goater * Will skip a state section if not active 133ee8bb867SCédric Le Goater * 134ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 135ee8bb867SCédric Le Goater * 136ee8bb867SCédric Le Goater * Returns true if state section is active else false 137ee8bb867SCédric Le Goater */ 138f2a8f0a6SJuan Quintela bool (*is_active)(void *opaque); 139ee8bb867SCédric Le Goater 140ee8bb867SCédric Le Goater /** 141ee8bb867SCédric Le Goater * @has_postcopy 142ee8bb867SCédric Le Goater * 143ee8bb867SCédric Le Goater * Checks if a device supports postcopy 144ee8bb867SCédric Le Goater * 145ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 146ee8bb867SCédric Le Goater * 147ee8bb867SCédric Le Goater * Returns true for postcopy support else false 148ee8bb867SCédric Le Goater */ 149c6467627SVladimir Sementsov-Ogievskiy bool (*has_postcopy)(void *opaque); 150f2a8f0a6SJuan Quintela 151ee8bb867SCédric Le Goater /** 152ee8bb867SCédric Le Goater * @is_active_iterate 153ee8bb867SCédric Le Goater * 154ee8bb867SCédric Le Goater * As #SaveVMHandlers.is_active(), will skip an inactive state 155ee8bb867SCédric Le Goater * section in qemu_savevm_state_iterate. 156ee8bb867SCédric Le Goater * 157ee8bb867SCédric Le Goater * For example, it is needed for only-postcopy-states, which needs 158ee8bb867SCédric Le Goater * to be handled by qemu_savevm_state_setup() and 159ee8bb867SCédric Le Goater * qemu_savevm_state_pending(), but do not need iterations until 160ee8bb867SCédric Le Goater * not in postcopy stage. 161ee8bb867SCédric Le Goater * 162ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 163ee8bb867SCédric Le Goater * 164ee8bb867SCédric Le Goater * Returns true if state section is active else false 165c865d848SVladimir Sementsov-Ogievskiy */ 166c865d848SVladimir Sementsov-Ogievskiy bool (*is_active_iterate)(void *opaque); 167c865d848SVladimir Sementsov-Ogievskiy 168a4a411fbSStefan Hajnoczi /* This runs outside the BQL in the migration case, and 169f2a8f0a6SJuan Quintela * within the lock in the savevm case. The callback had better only 170f2a8f0a6SJuan Quintela * use data that is local to the migration thread or protected 171f2a8f0a6SJuan Quintela * by other locks. 172f2a8f0a6SJuan Quintela */ 173ee8bb867SCédric Le Goater 174ee8bb867SCédric Le Goater /** 175ee8bb867SCédric Le Goater * @save_live_iterate 176ee8bb867SCédric Le Goater * 177ee8bb867SCédric Le Goater * Should send a chunk of data until the point that stream 178ee8bb867SCédric Le Goater * bandwidth limits tell it to stop. Each call generates one 179ee8bb867SCédric Le Goater * section. 180ee8bb867SCédric Le Goater * 181ee8bb867SCédric Le Goater * @f: QEMUFile where to send the data 182ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 183ee8bb867SCédric Le Goater * 184ee8bb867SCédric Le Goater * Returns 0 to indicate that there is still more data to send, 185ee8bb867SCédric Le Goater * 1 that there is no more data to send and 186ee8bb867SCédric Le Goater * negative to indicate an error. 187ee8bb867SCédric Le Goater */ 188f2a8f0a6SJuan Quintela int (*save_live_iterate)(QEMUFile *f, void *opaque); 189f2a8f0a6SJuan Quintela 190a4a411fbSStefan Hajnoczi /* This runs outside the BQL! */ 191ee8bb867SCédric Le Goater 192ee8bb867SCédric Le Goater /** 193ee8bb867SCédric Le Goater * @state_pending_estimate 19447995026SVladimir Sementsov-Ogievskiy * 195ee8bb867SCédric Le Goater * This estimates the remaining data to transfer 19624beea4eSJuan Quintela * 197ee8bb867SCédric Le Goater * Sum of @can_postcopy and @must_postcopy is the whole amount of 19824beea4eSJuan Quintela * 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) 20947995026SVladimir Sementsov-Ogievskiy */ 21024beea4eSJuan Quintela void (*state_pending_estimate)(void *opaque, uint64_t *must_precopy, 21124beea4eSJuan Quintela uint64_t *can_postcopy); 212ee8bb867SCédric Le Goater 213ee8bb867SCédric Le Goater /** 214ee8bb867SCédric Le Goater * @state_pending_exact 215ee8bb867SCédric Le Goater * 216ee8bb867SCédric Le Goater * This calculates the exact remaining data to transfer 217ee8bb867SCédric Le Goater * 218ee8bb867SCédric Le Goater * Sum of @can_postcopy and @must_postcopy is the whole amount of 219ee8bb867SCédric Le Goater * pending data. 220ee8bb867SCédric Le Goater * 221ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 222ee8bb867SCédric Le Goater * @must_precopy: amount of data that must be migrated in precopy 223ee8bb867SCédric Le Goater * or in stopped state, i.e. that must be migrated 224ee8bb867SCédric Le Goater * before target start. 225ee8bb867SCédric Le Goater * @can_postcopy: amount of data that can be migrated in postcopy 226ee8bb867SCédric Le Goater * or in stopped state, i.e. after target start. 227ee8bb867SCédric Le Goater * Some can also be migrated during precopy (RAM). 228ee8bb867SCédric Le Goater * Some must be migrated after source stops 229ee8bb867SCédric Le Goater * (block-dirty-bitmap) 230ee8bb867SCédric Le Goater */ 23124beea4eSJuan Quintela void (*state_pending_exact)(void *opaque, uint64_t *must_precopy, 23224beea4eSJuan Quintela uint64_t *can_postcopy); 233ee8bb867SCédric Le Goater 234ee8bb867SCédric Le Goater /** 235ee8bb867SCédric Le Goater * @load_state 236ee8bb867SCédric Le Goater * 237ee8bb867SCédric Le Goater * Load sections generated by any of the save functions that 238ee8bb867SCédric Le Goater * generate sections. 239ee8bb867SCédric Le Goater * 240ee8bb867SCédric Le Goater * Legacy method. Should be deprecated when all users are ported 241ee8bb867SCédric Le Goater * to VMStateDescription. 242ee8bb867SCédric Le Goater * 243ee8bb867SCédric Le Goater * @f: QEMUFile where to receive the data 244ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 245ee8bb867SCédric Le Goater * @version_id: the maximum version_id supported 246ee8bb867SCédric Le Goater * 247ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 248ee8bb867SCédric Le Goater */ 249f61efdeeSCédric Le Goater int (*load_state)(QEMUFile *f, void *opaque, int version_id); 250ee8bb867SCédric Le Goater 251ee8bb867SCédric Le Goater /** 252a30363dbSMaciej S. Szmigiero * @load_state_buffer (invoked outside the BQL) 253a30363dbSMaciej S. Szmigiero * 254a30363dbSMaciej S. Szmigiero * Load device state buffer provided to qemu_loadvm_load_state_buffer(). 255a30363dbSMaciej S. Szmigiero * 256a30363dbSMaciej S. Szmigiero * @opaque: data pointer passed to register_savevm_live() 257a30363dbSMaciej S. Szmigiero * @buf: the data buffer to load 258a30363dbSMaciej S. Szmigiero * @len: the data length in buffer 259a30363dbSMaciej S. Szmigiero * @errp: pointer to Error*, to store an error if it happens. 260a30363dbSMaciej S. Szmigiero * 261a30363dbSMaciej S. Szmigiero * Returns true to indicate success and false for errors. 262a30363dbSMaciej S. Szmigiero */ 263a30363dbSMaciej S. Szmigiero bool (*load_state_buffer)(void *opaque, char *buf, size_t len, 264a30363dbSMaciej S. Szmigiero Error **errp); 265a30363dbSMaciej S. Szmigiero 266a30363dbSMaciej S. Szmigiero /** 267ee8bb867SCédric Le Goater * @load_setup 268ee8bb867SCédric Le Goater * 269ee8bb867SCédric Le Goater * Initializes the data structures on the destination. 270ee8bb867SCédric Le Goater * 271ee8bb867SCédric Le Goater * @f: QEMUFile where to receive the data 272ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 273e4fa064dSCédric Le Goater * @errp: pointer to Error*, to store an error if it happens. 274ee8bb867SCédric Le Goater * 275ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 276ee8bb867SCédric Le Goater */ 277e4fa064dSCédric Le Goater int (*load_setup)(QEMUFile *f, void *opaque, Error **errp); 278ee8bb867SCédric Le Goater 279ee8bb867SCédric Le Goater /** 280ee8bb867SCédric Le Goater * @load_cleanup 281ee8bb867SCédric Le Goater * 282ee8bb867SCédric Le Goater * Uninitializes the data structures on the destination. 283d3237d0dSMaciej S. Szmigiero * Note that this handler can be called even if load_setup 284d3237d0dSMaciej S. Szmigiero * wasn't called earlier. 285ee8bb867SCédric Le Goater * 286ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 287ee8bb867SCédric Le Goater * 288ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 289ee8bb867SCédric Le Goater */ 290acb5ea86SJuan Quintela int (*load_cleanup)(void *opaque); 291ee8bb867SCédric Le Goater 292ee8bb867SCédric Le Goater /** 293ee8bb867SCédric Le Goater * @resume_prepare 294ee8bb867SCédric Le Goater * 295ee8bb867SCédric Le Goater * Called when postcopy migration wants to resume from failure 296ee8bb867SCédric Le Goater * 297ee8bb867SCédric Le Goater * @s: Current migration state 298ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 299ee8bb867SCédric Le Goater * 300ee8bb867SCédric Le Goater * Returns zero to indicate success and negative for error 301ee8bb867SCédric Le Goater */ 302d1b8eadbSPeter Xu int (*resume_prepare)(MigrationState *s, void *opaque); 303ee8bb867SCédric Le Goater 304ee8bb867SCédric Le Goater /** 305ee8bb867SCédric Le Goater * @switchover_ack_needed 306ee8bb867SCédric Le Goater * 307ee8bb867SCédric Le Goater * Checks if switchover ack should be used. Called only on 308ee8bb867SCédric Le Goater * destination. 309ee8bb867SCédric Le Goater * 310ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 311ee8bb867SCédric Le Goater * 312ee8bb867SCédric Le Goater * Returns true if switchover ack should be used and false 313ee8bb867SCédric Le Goater * otherwise 314ee8bb867SCédric Le Goater */ 3151b4adb10SAvihai Horon bool (*switchover_ack_needed)(void *opaque); 3164e55cb3cSMaciej S. Szmigiero 3174e55cb3cSMaciej S. Szmigiero /** 3184e55cb3cSMaciej S. Szmigiero * @switchover_start 3194e55cb3cSMaciej S. Szmigiero * 3204e55cb3cSMaciej S. Szmigiero * Notifies that the switchover has started. Called only on 3214e55cb3cSMaciej S. Szmigiero * the destination. 3224e55cb3cSMaciej S. Szmigiero * 3234e55cb3cSMaciej S. Szmigiero * @opaque: data pointer passed to register_savevm_live() 3244e55cb3cSMaciej S. Szmigiero * 3254e55cb3cSMaciej S. Szmigiero * Returns zero to indicate success and negative for error 3264e55cb3cSMaciej S. Szmigiero */ 3274e55cb3cSMaciej S. Szmigiero int (*switchover_start)(void *opaque); 328f2a8f0a6SJuan Quintela } SaveVMHandlers; 329f2a8f0a6SJuan Quintela 330ee8bb867SCédric Le Goater /** 331ee8bb867SCédric Le Goater * register_savevm_live: Register a set of custom migration handlers 332ee8bb867SCédric Le Goater * 333ee8bb867SCédric Le Goater * @idstr: state section identifier 334ee8bb867SCédric Le Goater * @instance_id: instance id 335ee8bb867SCédric Le Goater * @version_id: version id supported 336ee8bb867SCédric Le Goater * @ops: SaveVMHandlers structure 337ee8bb867SCédric Le Goater * @opaque: data pointer passed to SaveVMHandlers handlers 338ee8bb867SCédric Le Goater */ 339ce62df53SDr. David Alan Gilbert int register_savevm_live(const char *idstr, 34093062e23SPeter Xu uint32_t instance_id, 341f2a8f0a6SJuan Quintela int version_id, 342de22ded0SMarc-André Lureau const SaveVMHandlers *ops, 343f2a8f0a6SJuan Quintela void *opaque); 344f2a8f0a6SJuan Quintela 345ee8bb867SCédric Le Goater /** 346ee8bb867SCédric Le Goater * unregister_savevm: Unregister custom migration handlers 347ee8bb867SCédric Le Goater * 348ee8bb867SCédric Le Goater * @obj: object associated with state section 349ee8bb867SCédric Le Goater * @idstr: state section identifier 350ee8bb867SCédric Le Goater * @opaque: data pointer passed to register_savevm_live() 351ee8bb867SCédric Le Goater */ 3523cad405bSMarc-André Lureau void unregister_savevm(VMStateIf *obj, const char *idstr, void *opaque); 353f2a8f0a6SJuan Quintela 354f2a8f0a6SJuan Quintela #endif 355