qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v5 45/45] Inhibit ballooning during postcopy


From: David Gibson
Subject: Re: [Qemu-devel] [PATCH v5 45/45] Inhibit ballooning during postcopy
Date: Mon, 23 Mar 2015 15:32:09 +1100
User-agent: Mutt/1.5.23 (2014-03-12)

On Wed, Feb 25, 2015 at 04:52:08PM +0000, Dr. David Alan Gilbert (git) wrote:
> From: "Dr. David Alan Gilbert" <address@hidden>
> 
> The userfault mechanism used for postcopy generates faults
> for us on pages that are 'not present', inflating a balloon in
> the guest causes host pages to be marked as 'not present'; doing
> this during a postcopy, as potentially the same pages were being
> received from the source, would confuse the state of the received
> page -> disable ballooning during postcopy.

That is a ludicrously long sentence, which I have great difficulty parsing.

> When disabled we drop balloon requests from the guest.  Since ballooning
> is generally initiated by the host, the management system should avoid
> initiating any balloon instructions to the guest during migration,
> although it's not possible to know how long it would take a guest to
> process a request made prior to the start of migration.

Yeah :/.  It would be nice if it could queue the guest actions,
instead of dropping them.

> 
> Signed-off-by: Dr. David Alan Gilbert <address@hidden>
> ---
>  balloon.c                  | 11 +++++++++++
>  hw/virtio/virtio-balloon.c |  4 +++-
>  include/sysemu/balloon.h   |  2 ++
>  migration/postcopy-ram.c   |  9 +++++++++
>  4 files changed, 25 insertions(+), 1 deletion(-)
> 
> diff --git a/balloon.c b/balloon.c
> index dea19a4..faedb60 100644
> --- a/balloon.c
> +++ b/balloon.c
> @@ -35,6 +35,17 @@
>  static QEMUBalloonEvent *balloon_event_fn;
>  static QEMUBalloonStatus *balloon_stat_fn;
>  static void *balloon_opaque;
> +static bool balloon_inhibited;
> +
> +bool qemu_balloon_is_inhibited(void)
> +{
> +    return balloon_inhibited;
> +}
> +
> +void qemu_balloon_inhibit(bool state)
> +{
> +    balloon_inhibited = state;
> +}
>  
>  static bool have_ballon(Error **errp)
>  {
> diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
> index 7bfbb75..b0e94ee 100644
> --- a/hw/virtio/virtio-balloon.c
> +++ b/hw/virtio/virtio-balloon.c
> @@ -36,9 +36,11 @@
>  static void balloon_page(void *addr, int deflate)
>  {
>  #if defined(__linux__)
> -    if (!kvm_enabled() || kvm_has_sync_mmu())
> +    if (!qemu_balloon_is_inhibited() && (!kvm_enabled() ||
> +                                         kvm_has_sync_mmu())) {
>          qemu_madvise(addr, TARGET_PAGE_SIZE,
>                  deflate ? QEMU_MADV_WILLNEED : QEMU_MADV_DONTNEED);
> +    }
>  #endif
>  }
>  
> diff --git a/include/sysemu/balloon.h b/include/sysemu/balloon.h
> index 0345e01..6851d99 100644
> --- a/include/sysemu/balloon.h
> +++ b/include/sysemu/balloon.h
> @@ -23,5 +23,7 @@ typedef void (QEMUBalloonStatus)(void *opaque, BalloonInfo 
> *info);
>  int qemu_add_balloon_handler(QEMUBalloonEvent *event_func,
>                            QEMUBalloonStatus *stat_func, void *opaque);
>  void qemu_remove_balloon_handler(void *opaque);
> +bool qemu_balloon_is_inhibited(void);
> +void qemu_balloon_inhibit(bool state);
>  
>  #endif
> diff --git a/migration/postcopy-ram.c b/migration/postcopy-ram.c
> index d8f5ccd..b9f5848 100644
> --- a/migration/postcopy-ram.c
> +++ b/migration/postcopy-ram.c
> @@ -24,6 +24,7 @@
>  #include "migration/migration.h"
>  #include "migration/postcopy-ram.h"
>  #include "sysemu/sysemu.h"
> +#include "sysemu/balloon.h"
>  #include "qemu/bitmap.h"
>  #include "qemu/error-report.h"
>  #include "trace.h"
> @@ -531,6 +532,8 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState 
> *mis)
>          mis->have_fault_thread = false;
>      }
>  
> +    qemu_balloon_inhibit(false);
> +
>      if (enable_mlock) {
>          if (os_mlock() < 0) {
>              error_report("mlock: %s", strerror(errno));
> @@ -780,6 +783,12 @@ int postcopy_ram_enable_notify(MigrationIncomingState 
> *mis)
>          return -1;
>      }
>  
> +    /*
> +     * Ballooning can mark pages as absent while we're postcopying
> +     * that would cause false userfaults.
> +     */
> +    qemu_balloon_inhibit(true);
> +
>      trace_postcopy_ram_enable_notify();
>  
>      return 0;

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: pgpn3dDVdXPxl.pgp
Description: PGP signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]