migration: Move static var in ram_block_from_stream() into global
Static variable is very unfriendly to threading of ram_block_from_stream(). Move it into MigrationIncomingState. Make the incoming state pointer to be passed over to ram_block_from_stream() on both caller sites. Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> Message-Id: <20220301083925.33483-8-peterx@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
095c12a4a2
commit
755e8d7cb6
@ -66,7 +66,8 @@ typedef struct {
|
|||||||
/* State for the incoming migration */
|
/* State for the incoming migration */
|
||||||
struct MigrationIncomingState {
|
struct MigrationIncomingState {
|
||||||
QEMUFile *from_src_file;
|
QEMUFile *from_src_file;
|
||||||
|
/* Previously received RAM's RAMBlock pointer */
|
||||||
|
RAMBlock *last_recv_block;
|
||||||
/* A hook to allow cleanup at the end of incoming migration */
|
/* A hook to allow cleanup at the end of incoming migration */
|
||||||
void *transport_data;
|
void *transport_data;
|
||||||
void (*transport_cleanup)(void *data);
|
void (*transport_cleanup)(void *data);
|
||||||
|
@ -3185,12 +3185,14 @@ static int load_xbzrle(QEMUFile *f, ram_addr_t addr, void *host)
|
|||||||
*
|
*
|
||||||
* Returns a pointer from within the RCU-protected ram_list.
|
* Returns a pointer from within the RCU-protected ram_list.
|
||||||
*
|
*
|
||||||
|
* @mis: the migration incoming state pointer
|
||||||
* @f: QEMUFile where to read the data from
|
* @f: QEMUFile where to read the data from
|
||||||
* @flags: Page flags (mostly to see if it's a continuation of previous block)
|
* @flags: Page flags (mostly to see if it's a continuation of previous block)
|
||||||
*/
|
*/
|
||||||
static inline RAMBlock *ram_block_from_stream(QEMUFile *f, int flags)
|
static inline RAMBlock *ram_block_from_stream(MigrationIncomingState *mis,
|
||||||
|
QEMUFile *f, int flags)
|
||||||
{
|
{
|
||||||
static RAMBlock *block;
|
RAMBlock *block = mis->last_recv_block;
|
||||||
char id[256];
|
char id[256];
|
||||||
uint8_t len;
|
uint8_t len;
|
||||||
|
|
||||||
@ -3217,6 +3219,8 @@ static inline RAMBlock *ram_block_from_stream(QEMUFile *f, int flags)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mis->last_recv_block = block;
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3669,7 +3673,7 @@ static int ram_load_postcopy(QEMUFile *f)
|
|||||||
trace_ram_load_postcopy_loop((uint64_t)addr, flags);
|
trace_ram_load_postcopy_loop((uint64_t)addr, flags);
|
||||||
if (flags & (RAM_SAVE_FLAG_ZERO | RAM_SAVE_FLAG_PAGE |
|
if (flags & (RAM_SAVE_FLAG_ZERO | RAM_SAVE_FLAG_PAGE |
|
||||||
RAM_SAVE_FLAG_COMPRESS_PAGE)) {
|
RAM_SAVE_FLAG_COMPRESS_PAGE)) {
|
||||||
block = ram_block_from_stream(f, flags);
|
block = ram_block_from_stream(mis, f, flags);
|
||||||
if (!block) {
|
if (!block) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
break;
|
break;
|
||||||
@ -3881,6 +3885,7 @@ void colo_flush_ram_cache(void)
|
|||||||
*/
|
*/
|
||||||
static int ram_load_precopy(QEMUFile *f)
|
static int ram_load_precopy(QEMUFile *f)
|
||||||
{
|
{
|
||||||
|
MigrationIncomingState *mis = migration_incoming_get_current();
|
||||||
int flags = 0, ret = 0, invalid_flags = 0, len = 0, i = 0;
|
int flags = 0, ret = 0, invalid_flags = 0, len = 0, i = 0;
|
||||||
/* ADVISE is earlier, it shows the source has the postcopy capability on */
|
/* ADVISE is earlier, it shows the source has the postcopy capability on */
|
||||||
bool postcopy_advised = postcopy_is_advised();
|
bool postcopy_advised = postcopy_is_advised();
|
||||||
@ -3919,7 +3924,7 @@ static int ram_load_precopy(QEMUFile *f)
|
|||||||
|
|
||||||
if (flags & (RAM_SAVE_FLAG_ZERO | RAM_SAVE_FLAG_PAGE |
|
if (flags & (RAM_SAVE_FLAG_ZERO | RAM_SAVE_FLAG_PAGE |
|
||||||
RAM_SAVE_FLAG_COMPRESS_PAGE | RAM_SAVE_FLAG_XBZRLE)) {
|
RAM_SAVE_FLAG_COMPRESS_PAGE | RAM_SAVE_FLAG_XBZRLE)) {
|
||||||
RAMBlock *block = ram_block_from_stream(f, flags);
|
RAMBlock *block = ram_block_from_stream(mis, f, flags);
|
||||||
|
|
||||||
host = host_from_ram_block_offset(block, addr);
|
host = host_from_ram_block_offset(block, addr);
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user