| From 87c9403b0d1de4676b0bd273eea68fcf6de68e68 Mon Sep 17 00:00:00 2001 |
| From: "Michael S. Tsirkin" <mst@redhat.com> |
| Date: Tue, 17 May 2016 13:31:18 +0300 |
| Subject: virtio_balloon: fix PFN format for virtio-1 |
| |
| From: Michael S. Tsirkin <mst@redhat.com> |
| |
| commit 87c9403b0d1de4676b0bd273eea68fcf6de68e68 upstream. |
| |
| Everything should be LE when using virtio-1, but |
| the linux balloon driver does not seem to care about that. |
| |
| Reported-by: Cornelia Huck <cornelia.huck@de.ibm.com> |
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> |
| Tested-by: Cornelia Huck <cornelia.huck@de.ibm.com> |
| Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/virtio/virtio_balloon.c | 20 ++++++++++++-------- |
| 1 file changed, 12 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/virtio/virtio_balloon.c |
| +++ b/drivers/virtio/virtio_balloon.c |
| @@ -73,7 +73,7 @@ struct virtio_balloon { |
| |
| /* The array of pfns we tell the Host about. */ |
| unsigned int num_pfns; |
| - u32 pfns[VIRTIO_BALLOON_ARRAY_PFNS_MAX]; |
| + __virtio32 pfns[VIRTIO_BALLOON_ARRAY_PFNS_MAX]; |
| |
| /* Memory statistics */ |
| int need_stats_update; |
| @@ -125,14 +125,16 @@ static void tell_host(struct virtio_ball |
| wait_event(vb->acked, virtqueue_get_buf(vq, &len)); |
| } |
| |
| -static void set_page_pfns(u32 pfns[], struct page *page) |
| +static void set_page_pfns(struct virtio_balloon *vb, |
| + __virtio32 pfns[], struct page *page) |
| { |
| unsigned int i; |
| |
| /* Set balloon pfns pointing at this page. |
| * Note that the first pfn points at start of the page. */ |
| for (i = 0; i < VIRTIO_BALLOON_PAGES_PER_PAGE; i++) |
| - pfns[i] = page_to_balloon_pfn(page) + i; |
| + pfns[i] = cpu_to_virtio32(vb->vdev, |
| + page_to_balloon_pfn(page) + i); |
| } |
| |
| static void fill_balloon(struct virtio_balloon *vb, size_t num) |
| @@ -155,7 +157,7 @@ static void fill_balloon(struct virtio_b |
| msleep(200); |
| break; |
| } |
| - set_page_pfns(vb->pfns + vb->num_pfns, page); |
| + set_page_pfns(vb, vb->pfns + vb->num_pfns, page); |
| vb->num_pages += VIRTIO_BALLOON_PAGES_PER_PAGE; |
| if (!virtio_has_feature(vb->vdev, |
| VIRTIO_BALLOON_F_DEFLATE_ON_OOM)) |
| @@ -171,10 +173,12 @@ static void fill_balloon(struct virtio_b |
| static void release_pages_balloon(struct virtio_balloon *vb) |
| { |
| unsigned int i; |
| + struct page *page; |
| |
| /* Find pfns pointing at start of each page, get pages and free them. */ |
| for (i = 0; i < vb->num_pfns; i += VIRTIO_BALLOON_PAGES_PER_PAGE) { |
| - struct page *page = balloon_pfn_to_page(vb->pfns[i]); |
| + page = balloon_pfn_to_page(virtio32_to_cpu(vb->vdev, |
| + vb->pfns[i])); |
| if (!virtio_has_feature(vb->vdev, |
| VIRTIO_BALLOON_F_DEFLATE_ON_OOM)) |
| adjust_managed_page_count(page, 1); |
| @@ -197,7 +201,7 @@ static unsigned leak_balloon(struct virt |
| page = balloon_page_dequeue(vb_dev_info); |
| if (!page) |
| break; |
| - set_page_pfns(vb->pfns + vb->num_pfns, page); |
| + set_page_pfns(vb, vb->pfns + vb->num_pfns, page); |
| vb->num_pages -= VIRTIO_BALLOON_PAGES_PER_PAGE; |
| } |
| |
| @@ -465,13 +469,13 @@ static int virtballoon_migratepage(struc |
| __count_vm_event(BALLOON_MIGRATE); |
| spin_unlock_irqrestore(&vb_dev_info->pages_lock, flags); |
| vb->num_pfns = VIRTIO_BALLOON_PAGES_PER_PAGE; |
| - set_page_pfns(vb->pfns, newpage); |
| + set_page_pfns(vb, vb->pfns, newpage); |
| tell_host(vb, vb->inflate_vq); |
| |
| /* balloon's page migration 2nd step -- deflate "page" */ |
| balloon_page_delete(page); |
| vb->num_pfns = VIRTIO_BALLOON_PAGES_PER_PAGE; |
| - set_page_pfns(vb->pfns, page); |
| + set_page_pfns(vb, vb->pfns, page); |
| tell_host(vb, vb->deflate_vq); |
| |
| mutex_unlock(&vb->balloon_lock); |