Message ID | 1460623807-12654-1-git-send-email-thuth@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, 14 Apr 2016 10:50:07 +0200 Thomas Huth <thuth@redhat.com> wrote: > The balloon code currently calls madvise() with TARGET_PAGE_SIZE as > length parameter. Since the virtio-balloon protocol is always based > on 4k pages, no matter what the host and guest are using as page size, > this could cause problems: If TARGET_PAGE_SIZE is bigger than 4k, the > madvise call also destroys the 4k areas after the current one - which > might be wrong since the guest did not want free that area yet (in > case the guest used as smaller MMU page size than the hard-coded > TARGET_PAGE_SIZE). So to fix this issue, introduce a proper define > called BALLOON_PAGE_SIZE (which is 4096) to use this as the size > parameter for the madvise() call instead. > > Signed-off-by: Thomas Huth <thuth@redhat.com> Reviewed-by: David Gibson <dgibson@redhat.com> > --- > hw/virtio/virtio-balloon.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c > index c74101e..9dbe681 100644 > --- a/hw/virtio/virtio-balloon.c > +++ b/hw/virtio/virtio-balloon.c > @@ -19,7 +19,6 @@ > #include "qemu-common.h" > #include "hw/virtio/virtio.h" > #include "hw/i386/pc.h" > -#include "cpu.h" > #include "sysemu/balloon.h" > #include "hw/virtio/virtio-balloon.h" > #include "sysemu/kvm.h" > @@ -35,12 +34,14 @@ > #include "hw/virtio/virtio-bus.h" > #include "hw/virtio/virtio-access.h" > > +#define BALLOON_PAGE_SIZE (1 << VIRTIO_BALLOON_PFN_SHIFT) > + > static void balloon_page(void *addr, int deflate) > { > #if defined(__linux__) > if (!qemu_balloon_is_inhibited() && (!kvm_enabled() || > kvm_has_sync_mmu())) { > - qemu_madvise(addr, TARGET_PAGE_SIZE, > + qemu_madvise(addr, BALLOON_PAGE_SIZE, > deflate ? QEMU_MADV_WILLNEED : QEMU_MADV_DONTNEED); > } > #endif > -- > 1.8.3.1 >
diff --git a/hw/virtio/virtio-balloon.c b/hw/virtio/virtio-balloon.c index c74101e..9dbe681 100644 --- a/hw/virtio/virtio-balloon.c +++ b/hw/virtio/virtio-balloon.c @@ -19,7 +19,6 @@ #include "qemu-common.h" #include "hw/virtio/virtio.h" #include "hw/i386/pc.h" -#include "cpu.h" #include "sysemu/balloon.h" #include "hw/virtio/virtio-balloon.h" #include "sysemu/kvm.h" @@ -35,12 +34,14 @@ #include "hw/virtio/virtio-bus.h" #include "hw/virtio/virtio-access.h" +#define BALLOON_PAGE_SIZE (1 << VIRTIO_BALLOON_PFN_SHIFT) + static void balloon_page(void *addr, int deflate) { #if defined(__linux__) if (!qemu_balloon_is_inhibited() && (!kvm_enabled() || kvm_has_sync_mmu())) { - qemu_madvise(addr, TARGET_PAGE_SIZE, + qemu_madvise(addr, BALLOON_PAGE_SIZE, deflate ? QEMU_MADV_WILLNEED : QEMU_MADV_DONTNEED); } #endif
The balloon code currently calls madvise() with TARGET_PAGE_SIZE as length parameter. Since the virtio-balloon protocol is always based on 4k pages, no matter what the host and guest are using as page size, this could cause problems: If TARGET_PAGE_SIZE is bigger than 4k, the madvise call also destroys the 4k areas after the current one - which might be wrong since the guest did not want free that area yet (in case the guest used as smaller MMU page size than the hard-coded TARGET_PAGE_SIZE). So to fix this issue, introduce a proper define called BALLOON_PAGE_SIZE (which is 4096) to use this as the size parameter for the madvise() call instead. Signed-off-by: Thomas Huth <thuth@redhat.com> --- hw/virtio/virtio-balloon.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)