[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 03/16] postcopy: Chunk discards for hugepages
From: |
Laurent Vivier |
Subject: |
Re: [Qemu-devel] [PATCH v2 03/16] postcopy: Chunk discards for hugepages |
Date: |
Fri, 24 Feb 2017 14:48:13 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0 |
On 06/02/2017 18:32, Dr. David Alan Gilbert (git) wrote:
> From: "Dr. David Alan Gilbert" <address@hidden>
>
> 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 <address@hidden>
> Reviewed-by: Juan Quintela <address@hidden>
Reviewed-by: Laurent Vivier <address@hidden>
> ---
> 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();
>