On 30/03/2015 19:46, Dr. David Alan Gilbert wrote: >>> > > +PostcopyState postcopy_state_get(MigrationIncomingState *mis) >>> > > +{ >>> > > + return atomic_fetch_add(&mis->postcopy_state, 0); >>> > > +} >>> > > + >>> > > +/* Set the state and return the old state */ >>> > > +PostcopyState postcopy_state_set(MigrationIncomingState *mis, >>> > > + PostcopyState new_state) >>> > > +{ >>> > > + return atomic_xchg(&mis->postcopy_state, new_state); >>> > > +} >> > >> > Which are the (multiple) threads are calling these functions? > The main thread receiving the migration and the postcopy ram_listen_thread > receiving the RAM pages. > It's not actually racy between multiple threads updating it, > it's sequenced so that the main thread initialises it and then > hands over to the listen thread that takes it over from that point.
I would use atomic_mb_read/atomic_mb_set here. Paolo