Skip to content

Commit

Permalink
virtio: avoid implicit use of Linux page size in balloon interface
Browse files Browse the repository at this point in the history
Make the balloon interface always use 4K pages, and convert Linux pfns if
necessary. This patch assumes that Linux's PAGE_SHIFT will never be less than
12.

Signed-off-by: Hollis Blanchard <hollisb@us.ibm.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (modified)
  • Loading branch information
Hollis Blanchard authored and Rusty Russell committed Dec 29, 2008
1 parent 87c7d57 commit 1b4aa2f
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 2 deletions.
13 changes: 11 additions & 2 deletions drivers/virtio/virtio_balloon.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,15 @@ static struct virtio_device_id id_table[] = {
{ 0 },
};

static u32 page_to_balloon_pfn(struct page *page)
{
unsigned long pfn = page_to_pfn(page);

BUILD_BUG_ON(PAGE_SHIFT < VIRTIO_BALLOON_PFN_SHIFT);
/* Convert pfn from Linux page size to balloon page size. */
return pfn >> (PAGE_SHIFT - VIRTIO_BALLOON_PFN_SHIFT);
}

static void balloon_ack(struct virtqueue *vq)
{
struct virtio_balloon *vb;
Expand Down Expand Up @@ -99,7 +108,7 @@ static void fill_balloon(struct virtio_balloon *vb, size_t num)
msleep(200);
break;
}
vb->pfns[vb->num_pfns] = page_to_pfn(page);
vb->pfns[vb->num_pfns] = page_to_balloon_pfn(page);
totalram_pages--;
vb->num_pages++;
list_add(&page->lru, &vb->pages);
Expand Down Expand Up @@ -132,7 +141,7 @@ static void leak_balloon(struct virtio_balloon *vb, size_t num)
for (vb->num_pfns = 0; vb->num_pfns < num; vb->num_pfns++) {
page = list_first_entry(&vb->pages, struct page, lru);
list_del(&page->lru);
vb->pfns[vb->num_pfns] = page_to_pfn(page);
vb->pfns[vb->num_pfns] = page_to_balloon_pfn(page);
vb->num_pages--;
}

Expand Down
3 changes: 3 additions & 0 deletions include/linux/virtio_balloon.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
/* The feature bitmap for virtio balloon */
#define VIRTIO_BALLOON_F_MUST_TELL_HOST 0 /* Tell before reclaiming pages */

/* Size of a PFN in the balloon interface. */
#define VIRTIO_BALLOON_PFN_SHIFT 12

struct virtio_balloon_config
{
/* Number of pages host wants Guest to give up. */
Expand Down

0 comments on commit 1b4aa2f

Please sign in to comment.