提交 29c59172 编写于 作者: D Dr. David Alan Gilbert

postcopy: Chunk discards for hugepages

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: NDr. David Alan Gilbert <dgilbert@redhat.com>
Reviewed-by: NJuan Quintela <quintela@redhat.com>
Reviewed-by: NLaurent Vivier <lvivier@redhat.com>
Message-Id: <20170224182844.32452-4-dgilbert@redhat.com>
Signed-off-by: NDr. David Alan Gilbert <dgilbert@redhat.com>
上级 ef08fb38
...@@ -1672,12 +1672,17 @@ static void postcopy_chunk_hostpages_pass(MigrationState *ms, bool unsent_pass, ...@@ -1672,12 +1672,17 @@ static void postcopy_chunk_hostpages_pass(MigrationState *ms, bool unsent_pass,
{ {
unsigned long *bitmap; unsigned long *bitmap;
unsigned long *unsentmap; 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 first = block->offset >> TARGET_PAGE_BITS;
unsigned long len = block->used_length >> TARGET_PAGE_BITS; unsigned long len = block->used_length >> TARGET_PAGE_BITS;
unsigned long last = first + (len - 1); unsigned long last = first + (len - 1);
unsigned long run_start; 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; bitmap = atomic_rcu_read(&migration_bitmap_rcu)->bmap;
unsentmap = atomic_rcu_read(&migration_bitmap_rcu)->unsentmap; unsentmap = atomic_rcu_read(&migration_bitmap_rcu)->unsentmap;
...@@ -1781,7 +1786,8 @@ static void postcopy_chunk_hostpages_pass(MigrationState *ms, bool unsent_pass, ...@@ -1781,7 +1786,8 @@ static void postcopy_chunk_hostpages_pass(MigrationState *ms, bool unsent_pass,
* Utility for the outgoing postcopy code. * Utility for the outgoing postcopy code.
* *
* Discard any partially sent host-page size chunks, mark any partially * 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 * Returns: 0 on success
*/ */
...@@ -1789,11 +1795,6 @@ static int postcopy_chunk_hostpages(MigrationState *ms) ...@@ -1789,11 +1795,6 @@ static int postcopy_chunk_hostpages(MigrationState *ms)
{ {
struct RAMBlock *block; 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 */ /* Easiest way to make sure we don't resume in the middle of a host-page */
last_seen_block = NULL; last_seen_block = NULL;
last_sent_block = NULL; last_sent_block = NULL;
...@@ -1849,7 +1850,7 @@ int ram_postcopy_send_discard_bitmap(MigrationState *ms) ...@@ -1849,7 +1850,7 @@ int ram_postcopy_send_discard_bitmap(MigrationState *ms)
return -EINVAL; return -EINVAL;
} }
/* Deal with TPS != HPS */ /* Deal with TPS != HPS and huge pages */
ret = postcopy_chunk_hostpages(ms); ret = postcopy_chunk_hostpages(ms);
if (ret) { if (ret) {
rcu_read_unlock(); rcu_read_unlock();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册