0a122b
From 38dcbd1ff68da81b9172d8036622e41fe591c5c0 Mon Sep 17 00:00:00 2001
0a122b
From: Andrea Arcangeli <aarcange@redhat.com>
0a122b
Date: Fri, 7 Feb 2014 11:02:33 +0100
0a122b
Subject: [PATCH 10/28] exec: always use MADV_DONTFORK
0a122b
0a122b
RH-Author: Andrea Arcangeli <aarcange@redhat.com>
0a122b
Message-id: <1391770953-20138-2-git-send-email-aarcange@redhat.com>
0a122b
Patchwork-id: 57131
0a122b
O-Subject: [RHEL-7.0 qemu-kvm PATCH] exec: always use MADV_DONTFORK
0a122b
Bugzilla: 1004197
0a122b
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
0a122b
RH-Acked-by: Andrew Jones <drjones@redhat.com>
0a122b
RH-Acked-by: Dr. David Alan Gilbert (git) <dgilbert@redhat.com>
0a122b
0a122b
MADV_DONTFORK prevents fork to fail with -ENOMEM if the default
0a122b
overcommit heuristics decides there's too much anonymous virtual
0a122b
memory allocated. If the KVM secondary MMU is synchronized with MMU
0a122b
notifiers or not, doesn't make a difference in that regard.
0a122b
0a122b
Secondly it's always more efficient to avoid copying the guest
0a122b
physical address space in the fork child (so we avoid to mark all the
0a122b
guest memory readonly in the parent and so we skip the establishment
0a122b
and teardown of lots of pagetables in the child).
0a122b
0a122b
In the common case we can ignore the error if MADV_DONTFORK is not
0a122b
available. Leave a second invocation that errors out in the KVM path
0a122b
if MMU notifiers are missing and KVM is enabled, to abort in such
0a122b
case.
0a122b
0a122b
Signed-off-by: Andrea Arcangeli <aarcange@redhat.com>
0a122b
Tested-By: Benoit Canet <benoit@irqsave.net>
0a122b
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
0a122b
Signed-off-by: Gleb Natapov <gleb@redhat.com>
0a122b
(cherry picked from upstream commit 3e469dbfe413c25d48321c3a19ddfae0727dc6e5)
0a122b
---
0a122b
 exec.c | 1 +
0a122b
 1 file changed, 1 insertion(+)
0a122b
0a122b
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
0a122b
---
0a122b
 exec.c |    1 +
0a122b
 1 files changed, 1 insertions(+), 0 deletions(-)
0a122b
0a122b
diff --git a/exec.c b/exec.c
0a122b
index ce9310c..6fe2fe7 100644
0a122b
--- a/exec.c
0a122b
+++ b/exec.c
0a122b
@@ -1194,6 +1194,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
0a122b
 
0a122b
     qemu_ram_setup_dump(new_block->host, size);
0a122b
     qemu_madvise(new_block->host, size, QEMU_MADV_HUGEPAGE);
0a122b
+    qemu_madvise(new_block->host, size, QEMU_MADV_DONTFORK);
0a122b
 
0a122b
     if (kvm_enabled())
0a122b
         kvm_setup_guest_memory(new_block->host, size);
0a122b
-- 
0a122b
1.7.1
0a122b