On 06/02/2017 18:32, Dr. David Alan Gilbert (git) wrote: > From: "Dr. David Alan Gilbert" <dgilb...@redhat.com> > > At the start of the postcopy phase, partially sent huge pages > must be discarded. The code for dealing with host page sizes larger > than the target page size can be reused for this case. > > Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> > Reviewed-by: Juan Quintela <quint...@redhat.com>
Reviewed-by: Laurent Vivier <lviv...@redhat.com> > --- > migration/ram.c | 17 +++++++++-------- > 1 file changed, 9 insertions(+), 8 deletions(-) > > diff --git a/migration/ram.c b/migration/ram.c > index 5726563..d33bd21 100644 > --- a/migration/ram.c > +++ b/migration/ram.c > @@ -1627,12 +1627,17 @@ static void > postcopy_chunk_hostpages_pass(MigrationState *ms, bool unsent_pass, > { > unsigned long *bitmap; > unsigned long *unsentmap; > - unsigned int host_ratio = qemu_host_page_size / TARGET_PAGE_SIZE; > + unsigned int host_ratio = block->page_size / TARGET_PAGE_SIZE; > unsigned long first = block->offset >> TARGET_PAGE_BITS; > unsigned long len = block->used_length >> TARGET_PAGE_BITS; > unsigned long last = first + (len - 1); > unsigned long run_start; > > + if (block->page_size == TARGET_PAGE_SIZE) { > + /* Easy case - TPS==HPS for a non-huge page RAMBlock */ > + return; > + } > + > bitmap = atomic_rcu_read(&migration_bitmap_rcu)->bmap; > unsentmap = atomic_rcu_read(&migration_bitmap_rcu)->unsentmap; > > @@ -1736,7 +1741,8 @@ static void > postcopy_chunk_hostpages_pass(MigrationState *ms, bool unsent_pass, > * Utility for the outgoing postcopy code. > * > * Discard any partially sent host-page size chunks, mark any partially > - * dirty host-page size chunks as all dirty. > + * dirty host-page size chunks as all dirty. In this case the host-page > + * is the host-page for the particular RAMBlock, i.e. it might be a huge page > * > * Returns: 0 on success > */ > @@ -1744,11 +1750,6 @@ static int postcopy_chunk_hostpages(MigrationState *ms) > { > struct RAMBlock *block; > > - if (qemu_host_page_size == TARGET_PAGE_SIZE) { > - /* Easy case - TPS==HPS - nothing to be done */ > - return 0; > - } > - > /* Easiest way to make sure we don't resume in the middle of a host-page > */ > last_seen_block = NULL; > last_sent_block = NULL; > @@ -1804,7 +1805,7 @@ int ram_postcopy_send_discard_bitmap(MigrationState *ms) > return -EINVAL; > } > > - /* Deal with TPS != HPS */ > + /* Deal with TPS != HPS and huge pages */ > ret = postcopy_chunk_hostpages(ms); > if (ret) { > rcu_read_unlock(); >