diff options
-rw-r--r-- | exec.c | 3 | ||||
-rw-r--r-- | kvm-all.c | 18 | ||||
-rw-r--r-- | kvm.h | 2 |
3 files changed, 23 insertions, 0 deletions
@@ -2484,6 +2484,9 @@ ram_addr_t qemu_ram_alloc(ram_addr_t size) last_ram_offset += size; + if (kvm_enabled()) + kvm_setup_guest_memory(new_block->host, size); + return new_block->offset; } @@ -773,6 +773,24 @@ int kvm_has_sync_mmu(void) return 0; } +void kvm_setup_guest_memory(void *start, size_t size) +{ + if (!kvm_has_sync_mmu()) { +#ifdef MADV_DONTFORK + int ret = madvise(start, size, MADV_DONTFORK); + + if (ret) { + perror("madvice"); + exit(1); + } +#else + fprintf(stderr, + "Need MADV_DONTFORK in absence of synchronous KVM MMU\n"); + exit(1); +#endif + } +} + #ifdef KVM_CAP_SET_GUEST_DEBUG struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *env, target_ulong pc) @@ -48,6 +48,8 @@ int kvm_log_stop(target_phys_addr_t phys_addr, ram_addr_t size); int kvm_has_sync_mmu(void); +void kvm_setup_guest_memory(void *start, size_t size); + int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); int kvm_uncoalesce_mmio_region(target_phys_addr_t start, ram_addr_t size); |