Add a module parameter host_zeroes_pages to opt in to the zeroed
page optimization.  A proper virtio feature flag is needed before
this can be merged.

  insmod virtio_balloon.ko host_zeroes_pages=1

Signed-off-by: Michael S. Tsirkin <[email protected]>
Assisted-by: Claude:claude-opus-4-6
---
 drivers/virtio/virtio_balloon.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index d1fbc8fe8470..8c15530b51b3 100644
--- a/drivers/virtio/virtio_balloon.c
+++ b/drivers/virtio/virtio_balloon.c
@@ -19,6 +19,11 @@
 #include <linux/mm.h>
 #include <linux/page_reporting.h>
 
+static bool host_zeroes_pages;
+module_param(host_zeroes_pages, bool, 0444);
+MODULE_PARM_DESC(host_zeroes_pages,
+                "Host zeroes reported pages, skip guest re-zeroing");
+
 /*
  * Balloon device works in 4K page units.  So each page is pointed to by
  * multiple balloon pages.  All memory counters in this driver are in balloon
@@ -204,6 +209,8 @@ static int virtballoon_free_page_report(struct 
page_reporting_dev_info *pr_dev_i
        struct virtqueue *vq = vb->reporting_vq;
        unsigned int unused, err;
 
+       bitmap_zero(pr_dev_info->zeroed_bitmap, nents);
+
        /* We should always be able to add these buffers to an empty queue. */
        err = virtqueue_add_inbuf(vq, sg, nents, vb, GFP_NOWAIT);
 
@@ -220,6 +227,9 @@ static int virtballoon_free_page_report(struct 
page_reporting_dev_info *pr_dev_i
        /* When host has read buffer, this completes via balloon_ack */
        wait_event(vb->acked, virtqueue_get_buf(vq, &unused));
 
+       if (host_zeroes_pages)
+               bitmap_fill(pr_dev_info->zeroed_bitmap, nents);
+
        return 0;
 }
 
@@ -1039,6 +1049,8 @@ static int virtballoon_probe(struct virtio_device *vdev)
                vb->pr_dev_info.order = 5;
 #endif
 
+               /* TODO: needs a virtio feature flag */
+               vb->pr_dev_info.host_zeroes_pages = host_zeroes_pages;
                err = page_reporting_register(&vb->pr_dev_info);
                if (err)
                        goto out_unregister_oom;
-- 
MST


Reply via email to