forked from Minki/linux
virtio balloon: kill tell-host-first logic
The virtio balloon driver has a VIRTIO_BALLOON_F_MUST_TELL_HOST feature bit. Whenever the bit is set, the guest kernel must always tell the host before we free pages back to the allocator. Without this feature, we might free a page (and have another user touch it) while the hypervisor is unprepared for it. But, if the bit is _not_ set, we are under no obligation to reverse the order; we're under no obligation to do _anything_. As of now, qemu-kvm defines the bit, but doesn't set it. This patch makes the "tell host first" logic the only case. This should make everybody happy, and reduce the amount of untested or untestable code in the kernel. This _also_ means that we don't have to preserve a pfn list after the pages are freed, which should let us get rid of some temporary storage (vb->pfns) eventually. Signed-off-by: Dave Hansen <dave@linux.vnet.ibm.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
177dbd9563
commit
bf50e69f63
@ -40,9 +40,6 @@ struct virtio_balloon
|
|||||||
/* Waiting for host to ack the pages we released. */
|
/* Waiting for host to ack the pages we released. */
|
||||||
struct completion acked;
|
struct completion acked;
|
||||||
|
|
||||||
/* Do we have to tell Host *before* we reuse pages? */
|
|
||||||
bool tell_host_first;
|
|
||||||
|
|
||||||
/* The pages we've told the Host we're not using. */
|
/* The pages we've told the Host we're not using. */
|
||||||
unsigned int num_pages;
|
unsigned int num_pages;
|
||||||
struct list_head pages;
|
struct list_head pages;
|
||||||
@ -151,13 +148,14 @@ static void leak_balloon(struct virtio_balloon *vb, size_t num)
|
|||||||
vb->num_pages--;
|
vb->num_pages--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vb->tell_host_first) {
|
|
||||||
|
/*
|
||||||
|
* Note that if
|
||||||
|
* virtio_has_feature(vdev, VIRTIO_BALLOON_F_MUST_TELL_HOST);
|
||||||
|
* is true, we *have* to do it in this order
|
||||||
|
*/
|
||||||
tell_host(vb, vb->deflate_vq);
|
tell_host(vb, vb->deflate_vq);
|
||||||
release_pages_by_pfn(vb->pfns, vb->num_pfns);
|
release_pages_by_pfn(vb->pfns, vb->num_pfns);
|
||||||
} else {
|
|
||||||
release_pages_by_pfn(vb->pfns, vb->num_pfns);
|
|
||||||
tell_host(vb, vb->deflate_vq);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void update_stat(struct virtio_balloon *vb, int idx,
|
static inline void update_stat(struct virtio_balloon *vb, int idx,
|
||||||
@ -325,9 +323,6 @@ static int virtballoon_probe(struct virtio_device *vdev)
|
|||||||
goto out_del_vqs;
|
goto out_del_vqs;
|
||||||
}
|
}
|
||||||
|
|
||||||
vb->tell_host_first
|
|
||||||
= virtio_has_feature(vdev, VIRTIO_BALLOON_F_MUST_TELL_HOST);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_del_vqs:
|
out_del_vqs:
|
||||||
|
Loading…
Reference in New Issue
Block a user