|
@@ -825,6 +825,7 @@ 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) {
|
|
@@ -892,6 +893,11 @@ static int virtballoon_probe(struct virtio_device *vdev)
|
|
|
vb->num_free_page_blocks = 0;
|
|
|
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);
|
|
|
+ }
|
|
|
}
|
|
|
/*
|
|
|
* We continue to use VIRTIO_BALLOON_F_DEFLATE_ON_OOM to decide if a
|
|
@@ -992,6 +998,9 @@ static int virtballoon_restore(struct virtio_device *vdev)
|
|
|
|
|
|
static int virtballoon_validate(struct virtio_device *vdev)
|
|
|
{
|
|
|
+ if (!page_poisoning_enabled())
|
|
|
+ __virtio_clear_bit(vdev, VIRTIO_BALLOON_F_PAGE_POISON);
|
|
|
+
|
|
|
__virtio_clear_bit(vdev, VIRTIO_F_IOMMU_PLATFORM);
|
|
|
return 0;
|
|
|
}
|
|
@@ -1001,6 +1010,7 @@ static unsigned int features[] = {
|
|
|
VIRTIO_BALLOON_F_STATS_VQ,
|
|
|
VIRTIO_BALLOON_F_DEFLATE_ON_OOM,
|
|
|
VIRTIO_BALLOON_F_FREE_PAGE_HINT,
|
|
|
+ VIRTIO_BALLOON_F_PAGE_POISON,
|
|
|
};
|
|
|
|
|
|
static struct virtio_driver virtio_balloon_driver = {
|