Handle the case where the balloon target is larger than total ram size.

BUG: unable to handle kernel paging request at 0000000000100100
IP: [<ffffffff881970f9>] :virtio_balloon:leak__balloon+0x2e/0xbe

Signed-off-by: Marcelo Tosatti <[EMAIL PROTECTED]>

Index: virtio/virtio_balloon.c
===================================================================
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -122,10 +122,21 @@ static void release_pages_by_pfn(const u
        }
 }
 
+static void update_target_size(struct virtio_balloon *vb)
+{
+       __le32 num_pages = cpu_to_le32(vb->num_pages);
+
+       vb->vdev->config->set(vb->vdev,
+                             offsetof(struct virtio_balloon_config, num_pages),
+                             &num_pages, sizeof(num_pages));
+}
+
+
 static void leak_balloon(struct virtio_balloon *vb, size_t num)
 {
        struct page *page;
 
+       num = min_t(unsigned int, vb->num_pages, num);
        /* We can only do one array worth at a time. */
        num = min(num, ARRAY_SIZE(vb->pfns));
 
@@ -136,6 +147,12 @@ static void leak_balloon(struct virtio_b
                vb->num_pages--;
        }
 
+       /* Have nothing to release? update target accordingly. */
+       if (vb->num_pfns == 0) {
+               update_target_size(vb);
+               return;
+       }
+
        if (vb->tell_host_first) {
                tell_host(vb, vb->deflate_vq);
                release_pages_by_pfn(vb->pfns, vb->num_pfns);

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to