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