|
|
d740ea |
From cc224bcb3c12238466f8a6a366d3f813fb866a16 Mon Sep 17 00:00:00 2001
|
|
|
d740ea |
From: Alex Williamson <alex.williamson@redhat.com>
|
|
|
d740ea |
Date: Thu, 13 Dec 2018 21:54:28 +0100
|
|
|
d740ea |
Subject: [PATCH 1/5] Inhibit ballooning during postcopy
|
|
|
d740ea |
|
|
|
d740ea |
RH-Author: Alex Williamson <alex.williamson@redhat.com>
|
|
|
d740ea |
Message-id: <154473806860.22725.2305869657628116679.stgit@gimli.home>
|
|
|
d740ea |
Patchwork-id: 83493
|
|
|
d740ea |
O-Subject: [RHEL-7.7 qemu-kvm PATCH 1/5] Inhibit ballooning during postcopy
|
|
|
d740ea |
Bugzilla: 1659229
|
|
|
d740ea |
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
|
|
d740ea |
RH-Acked-by: Cornelia Huck <cohuck@redhat.com>
|
|
|
d740ea |
RH-Acked-by: Auger Eric <eric.auger@redhat.com>
|
|
|
d740ea |
|
|
|
d740ea |
From: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
d740ea |
|
|
|
d740ea |
Bugzilla: 1659229
|
|
|
d740ea |
Notes: Dropped all but balloon inhibitor infrastructure
|
|
|
d740ea |
|
|
|
d740ea |
Postcopy detects accesses to pages that haven't been transferred yet
|
|
|
d740ea |
using userfaultfd, and it causes exceptions on pages that are 'not
|
|
|
d740ea |
present'.
|
|
|
d740ea |
Ballooning also causes pages to be marked as 'not present' when the
|
|
|
d740ea |
guest inflates the balloon.
|
|
|
d740ea |
Potentially a balloon could be inflated to discard pages that are
|
|
|
d740ea |
currently inflight during postcopy and that may be arriving at about
|
|
|
d740ea |
the same time.
|
|
|
d740ea |
|
|
|
d740ea |
To avoid this confusion, disable ballooning during postcopy.
|
|
|
d740ea |
|
|
|
d740ea |
When disabled we drop balloon requests from the guest. Since ballooning
|
|
|
d740ea |
is generally initiated by the host, the management system should avoid
|
|
|
d740ea |
initiating any balloon instructions to the guest during migration,
|
|
|
d740ea |
although it's not possible to know how long it would take a guest to
|
|
|
d740ea |
process a request made prior to the start of migration.
|
|
|
d740ea |
Guest initiated ballooning will not know if it's really freed a page
|
|
|
d740ea |
of host memory or not.
|
|
|
d740ea |
|
|
|
d740ea |
Queueing the requests until after migration would be nice, but is
|
|
|
d740ea |
non-trivial, since the set of inflate/deflate requests have to
|
|
|
d740ea |
be compared with the state of the page to know what the final
|
|
|
d740ea |
outcome is allowed to be.
|
|
|
d740ea |
|
|
|
d740ea |
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
d740ea |
Reviewed-by: Juan Quintela <quintela@redhat.com>
|
|
|
d740ea |
Reviewed-by: Amit Shah <amit.shah@redhat.com>
|
|
|
d740ea |
Signed-off-by: Juan Quintela <quintela@redhat.com>
|
|
|
d740ea |
(cherry picked from commit 371ff5a3f04cd7d05bab49ac6e80da319026d95b)
|
|
|
d740ea |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
d740ea |
---
|
|
|
d740ea |
balloon.c | 11 +++++++++++
|
|
|
d740ea |
hw/virtio/virtio-balloon.c | 4 +++-
|
|
|
d740ea |
include/sysemu/balloon.h | 2 ++
|
|
|
d740ea |
3 files changed, 16 insertions(+), 1 deletion(-)
|
|
|
d740ea |
|
|
|
d740ea |
diff --git a/balloon.c b/balloon.c
|
|
|
d740ea |
index e321f2c..c7a0cf1 100644
|
|
|
d740ea |
--- a/balloon.c
|
|
|
d740ea |
+++ b/balloon.c
|
|
|
d740ea |
@@ -35,6 +35,17 @@
|
|
|
d740ea |
static QEMUBalloonEvent *balloon_event_fn;
|
|
|
d740ea |
static QEMUBalloonStatus *balloon_stat_fn;
|
|
|
d740ea |
static void *balloon_opaque;
|
|
|
d740ea |
+static bool balloon_inhibited;
|
|
|
d740ea |
+
|
|
|
d740ea |
+bool qemu_balloon_is_inhibited(void)
|
|
|
d740ea |
+{
|
|
|
d740ea |
+ return balloon_inhibited;
|
|
|
d740ea |
+}
|
|
|
d740ea |
+
|
|
|
d740ea |
+void qemu_balloon_inhibit(bool state)
|
|
|
d740ea |
+{
|
|
|
d740ea |
+ balloon_inhibited = state;
|
|
|
d740ea |
+}
|
|
|
d740ea |
|
|
|
d740ea |
int qemu_add_balloon_handler(QEMUBalloonEvent *event_func,
|
|
|
d740ea |
QEMUBalloonStatus *stat_func, void *opaque)
|
|
|
d740ea |
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c
|
|
|
d740ea |
index 1a60d3c..c9562ef 100644
|
|
|
d740ea |
--- a/hw/virtio/virtio-balloon.c
|
|
|
d740ea |
+++ b/hw/virtio/virtio-balloon.c
|
|
|
d740ea |
@@ -34,9 +34,11 @@
|
|
|
d740ea |
static void balloon_page(void *addr, int deflate)
|
|
|
d740ea |
{
|
|
|
d740ea |
#if defined(__linux__)
|
|
|
d740ea |
- if (!kvm_enabled() || kvm_has_sync_mmu())
|
|
|
d740ea |
+ if (!qemu_balloon_is_inhibited() && (!kvm_enabled() ||
|
|
|
d740ea |
+ kvm_has_sync_mmu())) {
|
|
|
d740ea |
qemu_madvise(addr, TARGET_PAGE_SIZE,
|
|
|
d740ea |
deflate ? QEMU_MADV_WILLNEED : QEMU_MADV_DONTNEED);
|
|
|
d740ea |
+ }
|
|
|
d740ea |
#endif
|
|
|
d740ea |
}
|
|
|
d740ea |
|
|
|
d740ea |
diff --git a/include/sysemu/balloon.h b/include/sysemu/balloon.h
|
|
|
d740ea |
index bd9d395..eb5af19 100644
|
|
|
d740ea |
--- a/include/sysemu/balloon.h
|
|
|
d740ea |
+++ b/include/sysemu/balloon.h
|
|
|
d740ea |
@@ -23,6 +23,8 @@ typedef void (QEMUBalloonStatus)(void *opaque, BalloonInfo *info);
|
|
|
d740ea |
int qemu_add_balloon_handler(QEMUBalloonEvent *event_func,
|
|
|
d740ea |
QEMUBalloonStatus *stat_func, void *opaque);
|
|
|
d740ea |
void qemu_remove_balloon_handler(void *opaque);
|
|
|
d740ea |
+bool qemu_balloon_is_inhibited(void);
|
|
|
d740ea |
+void qemu_balloon_inhibit(bool state);
|
|
|
d740ea |
|
|
|
d740ea |
void qemu_balloon_changed(int64_t actual);
|
|
|
d740ea |
|
|
|
d740ea |
--
|
|
|
d740ea |
1.8.3.1
|
|
|
d740ea |
|