On Thu, 14 Apr 2016 10:50:07 +0200 Thomas Huth <th...@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 <th...@redhat.com> Reviewed-by: David Gibson <dgib...@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 > -- David Gibson <dgib...@redhat.com> Senior Software Engineer, Virtualization, Red Hat
pgpEOEe6hA5iO.pgp
Description: OpenPGP digital signature