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();
> 


Reply via email to