|
@@ -157,7 +157,9 @@ static void fill_balloon(struct virtio_balloon *vb, size_t num)
|
|
|
}
|
|
|
set_page_pfns(vb->pfns + vb->num_pfns, page);
|
|
|
vb->num_pages += VIRTIO_BALLOON_PAGES_PER_PAGE;
|
|
|
- adjust_managed_page_count(page, -1);
|
|
|
+ if (!virtio_has_feature(vb->vdev,
|
|
|
+ VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
|
|
|
+ adjust_managed_page_count(page, -1);
|
|
|
}
|
|
|
|
|
|
/* Did we get any? */
|
|
@@ -166,14 +168,16 @@ static void fill_balloon(struct virtio_balloon *vb, size_t num)
|
|
|
mutex_unlock(&vb->balloon_lock);
|
|
|
}
|
|
|
|
|
|
-static void release_pages_by_pfn(const u32 pfns[], unsigned int num)
|
|
|
+static void release_pages_balloon(struct virtio_balloon *vb)
|
|
|
{
|
|
|
unsigned int i;
|
|
|
|
|
|
/* Find pfns pointing at start of each page, get pages and free them. */
|
|
|
- for (i = 0; i < num; i += VIRTIO_BALLOON_PAGES_PER_PAGE) {
|
|
|
- struct page *page = balloon_pfn_to_page(pfns[i]);
|
|
|
- adjust_managed_page_count(page, 1);
|
|
|
+ for (i = 0; i < vb->num_pfns; i += VIRTIO_BALLOON_PAGES_PER_PAGE) {
|
|
|
+ struct page *page = balloon_pfn_to_page(vb->pfns[i]);
|
|
|
+ if (!virtio_has_feature(vb->vdev,
|
|
|
+ VIRTIO_BALLOON_F_DEFLATE_ON_OOM))
|
|
|
+ adjust_managed_page_count(page, 1);
|
|
|
put_page(page); /* balloon reference */
|
|
|
}
|
|
|
}
|
|
@@ -206,7 +210,7 @@ static unsigned leak_balloon(struct virtio_balloon *vb, size_t num)
|
|
|
if (vb->num_pfns != 0)
|
|
|
tell_host(vb, vb->deflate_vq);
|
|
|
mutex_unlock(&vb->balloon_lock);
|
|
|
- release_pages_by_pfn(vb->pfns, vb->num_pfns);
|
|
|
+ release_pages_balloon(vb);
|
|
|
return num_freed_pages;
|
|
|
}
|
|
|
|