[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] KVM: always use MADV_DONTFORK
From: |
Benoît Canet |
Subject: |
Re: [Qemu-devel] [PATCH] KVM: always use MADV_DONTFORK |
Date: |
Tue, 6 Aug 2013 19:06:20 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Le Thursday 25 Jul 2013 à 12:11:15 (+0200), Andrea Arcangeli a écrit :
> MADV_DONTFORK prevents fork to fail with -ENOMEM if the default
> overcommit heuristics decides there's too much anonymous virtual
> memory allocated. If the KVM secondary MMU is synchronized with MMU
> notifiers or not, doesn't make a difference in that regard.
>
> Secondly it's always more efficient to avoid copying the guest
> physical address space in the fork child (so we avoid to mark all the
> guest memory readonly in the parent and so we skip the establishment
> and teardown of lots of pagetables in the child).
>
> In the common case we can ignore the error if MADV_DONTFORK is not
> available. Leave a second invocation that errors out in the KVM path
> if MMU notifiers are missing and KVM is enabled, to abort in such
> case.
>
> Signed-off-by: Andrea Arcangeli <address@hidden>
> ---
> exec.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/exec.c b/exec.c
> index c99a883..d3bb58d 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -1162,6 +1162,7 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size,
> void *host,
>
> qemu_ram_setup_dump(new_block->host, size);
> qemu_madvise(new_block->host, size, QEMU_MADV_HUGEPAGE);
> + qemu_madvise(new_block->host, size, QEMU_MADV_DONTFORK);
>
> if (kvm_enabled())
> kvm_setup_guest_memory(new_block->host, size);
>
This patch solve a bug where the network down script of a regular tap interface
is not executed because fork fail when a pci-assigment is done on a large guest.
Tested-By: Benoit Canet <address@hidden>