From d3a5038c461b9436e5bc82a802b7a843b79f417f Mon Sep 17 00:00:00 2001 From: Dr. David Alan Gilbert Date: Fri, 24 Feb 2017 18:28:32 +0000 Subject: exec: ram_block_discard_range Create ram_block_discard_range in exec.c to replace postcopy_ram_discard_range and most of ram_discard_range. Those two routines are a bit of a weird combination, and ram_discard_range is about to get more complex for hugepages. It's OS dependent code (so shouldn't be in migration/ram.c) but it needs quite a bit of the innards of RAMBlock so doesn't belong in the os*.c. Signed-off-by: Dr. David Alan Gilbert Reviewed-by: Juan Quintela Reviewed-by: Laurent Vivier Message-Id: <20170224182844.32452-5-dgilbert@redhat.com> Signed-off-by: Dr. David Alan Gilbert --- include/exec/cpu-common.h | 1 + 1 file changed, 1 insertion(+) (limited to 'include/exec/cpu-common.h') diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h index bd15853e51..1350c2e441 100644 --- a/include/exec/cpu-common.h +++ b/include/exec/cpu-common.h @@ -105,6 +105,7 @@ typedef int (RAMBlockIterFunc)(const char *block_name, void *host_addr, ram_addr_t offset, ram_addr_t length, void *opaque); int qemu_ram_foreach_block(RAMBlockIterFunc func, void *opaque); +int ram_block_discard_range(RAMBlock *rb, uint64_t start, size_t length); #endif -- cgit v1.2.3-55-g7522 From 67f11b5c23fca79845c04ace6af0b686c82e0f22 Mon Sep 17 00:00:00 2001 From: Dr. David Alan Gilbert Date: Fri, 24 Feb 2017 18:28:34 +0000 Subject: postcopy: Record largest page size Record the largest page size in use; we'll need it soon for allocating temporary buffers. Signed-off-by: Dr. David Alan Gilbert Reviewed-by: Juan Quintela Reviewed-by: Laurent Vivier Message-Id: <20170224182844.32452-7-dgilbert@redhat.com> Signed-off-by: Dr. David Alan Gilbert --- exec.c | 13 +++++++++++++ include/exec/cpu-common.h | 1 + include/migration/migration.h | 1 + migration/migration.c | 1 + 4 files changed, 16 insertions(+) (limited to 'include/exec/cpu-common.h') diff --git a/exec.c b/exec.c index 24cdf64226..785d20f648 100644 --- a/exec.c +++ b/exec.c @@ -1524,6 +1524,19 @@ size_t qemu_ram_pagesize(RAMBlock *rb) return rb->page_size; } +/* Returns the largest size of page in use */ +size_t qemu_ram_pagesize_largest(void) +{ + RAMBlock *block; + size_t largest = 0; + + QLIST_FOREACH_RCU(block, &ram_list.blocks, next) { + largest = MAX(largest, qemu_ram_pagesize(block)); + } + + return largest; +} + static int memory_try_enable_merging(void *addr, size_t len) { if (!machine_mem_merge(current_machine)) { diff --git a/include/exec/cpu-common.h b/include/exec/cpu-common.h index 1350c2e441..8c305aa4fa 100644 --- a/include/exec/cpu-common.h +++ b/include/exec/cpu-common.h @@ -64,6 +64,7 @@ void qemu_ram_set_idstr(RAMBlock *block, const char *name, DeviceState *dev); void qemu_ram_unset_idstr(RAMBlock *block); const char *qemu_ram_get_idstr(RAMBlock *rb); size_t qemu_ram_pagesize(RAMBlock *block); +size_t qemu_ram_pagesize_largest(void); void cpu_physical_memory_rw(hwaddr addr, uint8_t *buf, int len, int is_write); diff --git a/include/migration/migration.h b/include/migration/migration.h index 6272adfaba..08b98e9911 100644 --- a/include/migration/migration.h +++ b/include/migration/migration.h @@ -93,6 +93,7 @@ struct MigrationIncomingState { */ QemuEvent main_thread_load_event; + size_t largest_page_size; bool have_fault_thread; QemuThread fault_thread; QemuSemaphore fault_thread_sem; diff --git a/migration/migration.c b/migration/migration.c index 481c540a6d..3dab6845b1 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -387,6 +387,7 @@ static void process_incoming_migration_co(void *opaque) int ret; mis->from_src_file = f; + mis->largest_page_size = qemu_ram_pagesize_largest(); postcopy_state_set(POSTCOPY_INCOMING_NONE); migrate_set_state(&mis->state, MIGRATION_STATUS_NONE, MIGRATION_STATUS_ACTIVE); -- cgit v1.2.3-55-g7522