static int virtballoon_probe(struct virtio_device *vdev)
 {
        struct virtio_balloon *vb;
-       __u32 poison_val;
        int err;
 
        if (!vdev->config->get) {
                                                  VIRTIO_BALLOON_CMD_ID_STOP);
                spin_lock_init(&vb->free_page_list_lock);
                INIT_LIST_HEAD(&vb->free_page_list);
-               if (virtio_has_feature(vdev, VIRTIO_BALLOON_F_PAGE_POISON)) {
+       }
+       if (virtio_has_feature(vdev, VIRTIO_BALLOON_F_PAGE_POISON)) {
+               /* Start with poison val of 0 representing general init */
+               __u32 poison_val = 0;
+
+               /*
+                * Let the hypervisor know that we are expecting a
+                * specific value to be written back in balloon pages.
+                */
+               if (!want_init_on_free())
                        memset(&poison_val, PAGE_POISON, sizeof(poison_val));
-                       virtio_cwrite(vb->vdev, struct virtio_balloon_config,
-                                     poison_val, &poison_val);
-               }
+
+               virtio_cwrite(vb->vdev, struct virtio_balloon_config,
+                             poison_val, &poison_val);
        }
        /*
         * We continue to use VIRTIO_BALLOON_F_DEFLATE_ON_OOM to decide if a
 
 static int virtballoon_validate(struct virtio_device *vdev)
 {
-       if (!page_poisoning_enabled())
+       /* Tell the host whether we care about poisoned pages. */
+       if (!want_init_on_free() &&
+           (IS_ENABLED(CONFIG_PAGE_POISONING_NO_SANITY) ||
+            !page_poisoning_enabled()))
                __virtio_clear_bit(vdev, VIRTIO_BALLOON_F_PAGE_POISON);
 
        __virtio_clear_bit(vdev, VIRTIO_F_IOMMU_PLATFORM);