* Wei Yang (richardw.y...@linux.intel.com) wrote: > In postcopy, it requires to place whole host page instead of target > page. > > Currently, it relies on the page offset to decide whether this is the > last target page. We also can count the target page number during the > iteration. When the number of target page equals > (host page size / target page size), this means it is the last target > page in the host page. > > This is a preparation for non-ordered target page transmission. > > Signed-off-by: Wei Yang <richardw.y...@linux.intel.com>
Reviewed-by: Dr. David Alan Gilbert <dgilb...@redhat.com> > --- > migration/ram.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/migration/ram.c b/migration/ram.c > index f59e3fe197..5c05376d8d 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -4017,6 +4017,7 @@ static int ram_load_postcopy(QEMUFile *f) > void *postcopy_host_page = mis->postcopy_tmp_page; > void *last_host = NULL; > bool all_zero = false; > + int target_pages = 0; > > while (!ret && !(flags & RAM_SAVE_FLAG_EOS)) { > ram_addr_t addr; > @@ -4051,6 +4052,7 @@ static int ram_load_postcopy(QEMUFile *f) > ret = -EINVAL; > break; > } > + target_pages++; > matches_target_page_size = block->page_size == TARGET_PAGE_SIZE; > /* > * Postcopy requires that we place whole host pages atomically; > @@ -4082,8 +4084,10 @@ static int ram_load_postcopy(QEMUFile *f) > * If it's the last part of a host page then we place the host > * page > */ > - place_needed = (((uintptr_t)host + TARGET_PAGE_SIZE) & > - (block->page_size - 1)) == 0; > + if (target_pages == (block->page_size / TARGET_PAGE_SIZE)) { > + place_needed = true; > + target_pages = 0; > + } > place_source = postcopy_host_page; > } > last_host = host; > -- > 2.17.1 > -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK