Message ID | 20191107123907.29791-4-richardw.yang@linux.intel.com |
---|---|
State | New |
Headers | show |
Series | migration/postcopy: enable compress during postcopy | expand |
Wei Yang <richardw.yang@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.yang@linux.intel.com> > Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com>
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;