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

