Re: [PATCH v10 5/6] virtio-balloon: Pull page poisoning config out of free page hinting
From: Michael S. Tsirkin
Date: Wed Sep 18 2019 - 13:59:08 EST
On Wed, Sep 18, 2019 at 10:53:05AM -0700, Alexander Duyck wrote:
> From: Alexander Duyck <alexander.h.duyck@xxxxxxxxxxxxxxx>
>
> Currently the page poisoning setting wasn't being enabled unless free page
> hinting was enabled. However we will need the page poisoning tracking logic
> as well for unused page reporting. As such pull it out and make it a
> separate bit of config in the probe function.
>
> In addition we can actually wrap the code in a check for NO_SANITY. If we
> don't care what is actually in the page we can just default to 0 and leave
> it there.
>
> Reviewed-by: David Hildenbrand <david@xxxxxxxxxx>
> Signed-off-by: Alexander Duyck <alexander.h.duyck@xxxxxxxxxxxxxxx>
I think this one can go in directly. Do you want me to merge it now?
> ---
> drivers/virtio/virtio_balloon.c | 22 +++++++++++++++-------
> 1 file changed, 15 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
> index 226fbb995fb0..501a8d0ebf86 100644
> --- a/drivers/virtio/virtio_balloon.c
> +++ b/drivers/virtio/virtio_balloon.c
> @@ -842,7 +842,6 @@ static int virtio_balloon_register_shrinker(struct virtio_balloon *vb)
> static int virtballoon_probe(struct virtio_device *vdev)
> {
> struct virtio_balloon *vb;
> - __u32 poison_val;
> int err;
>
> if (!vdev->config->get) {
> @@ -909,11 +908,18 @@ static int virtballoon_probe(struct virtio_device *vdev)
> 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)) {
> - memset(&poison_val, PAGE_POISON, sizeof(poison_val));
> - virtio_cwrite(vb->vdev, struct virtio_balloon_config,
> - poison_val, &poison_val);
> - }
> + }
> + if (virtio_has_feature(vdev, VIRTIO_BALLOON_F_PAGE_POISON)) {
> + __u32 poison_val;
> +
> + /*
> + * Let the hypervisor know that we are expecting a
> + * specific value to be written back in unused pages.
> + */
> + memset(&poison_val, PAGE_POISON, sizeof(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
> @@ -1014,7 +1020,9 @@ static int virtballoon_restore(struct virtio_device *vdev)
>
> static int virtballoon_validate(struct virtio_device *vdev)
> {
> - if (!page_poisoning_enabled())
> + /* Tell the host whether we care about poisoned pages. */
> + if (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);