@ -81,6 +81,28 @@ int postcopy_place_page(MigrationIncomingState *mis, void *host, void *from,
int postcopy_place_page_zero ( MigrationIncomingState * mis , void * host ,
size_t pagesize ) ;
/* The current postcopy state is read/set by postcopy_state_get/set
* which update it atomically .
* The state is updated as postcopy messages are received , and
* in general only one thread should be writing to the state at any one
* time , initially the main thread and then the listen thread ;
* Corner cases are where either thread finishes early and / or errors .
* The state is checked as messages are received to ensure that
* the source is sending us messages in the correct order .
* The state is also used by the RAM reception code to know if it
* has to place pages atomically , and the cleanup code at the end of
* the main thread to know if it has to delay cleanup until the end
* of postcopy .
*/
typedef enum {
POSTCOPY_INCOMING_NONE = 0 , /* Initial state - no postcopy */
POSTCOPY_INCOMING_ADVISE ,
POSTCOPY_INCOMING_DISCARD ,
POSTCOPY_INCOMING_LISTENING ,
POSTCOPY_INCOMING_RUNNING ,
POSTCOPY_INCOMING_END
} PostcopyState ;
/*
* Allocate a page of memory that can be mapped at a later point in time
* using postcopy_place_page
@ -88,4 +110,8 @@ int postcopy_place_page_zero(MigrationIncomingState *mis, void *host,
*/
void * postcopy_get_tmp_page ( MigrationIncomingState * mis ) ;
PostcopyState postcopy_state_get ( void ) ;
/* Set the state and return the old state */
PostcopyState postcopy_state_set ( PostcopyState new_state ) ;
# endif