浏览代码

Merge tag 'for-linus' of git://github.com/rustyrussell/linux

Merge virtio pull request from Rusty Russell.

* tag 'for-linus' of git://github.com/rustyrussell/linux:
  virtio: balloon: leak / fill balloon across S4
Linus Torvalds 13 年之前
父节点
当前提交
d7e53922aa
共有 1 个文件被更改,包括 22 次插入11 次删除
  1. 22 11
      drivers/virtio/virtio_balloon.c

+ 22 - 11
drivers/virtio/virtio_balloon.c

@@ -367,29 +367,45 @@ static void __devexit virtballoon_remove(struct virtio_device *vdev)
 #ifdef CONFIG_PM
 #ifdef CONFIG_PM
 static int virtballoon_freeze(struct virtio_device *vdev)
 static int virtballoon_freeze(struct virtio_device *vdev)
 {
 {
+	struct virtio_balloon *vb = vdev->priv;
+
 	/*
 	/*
 	 * The kthread is already frozen by the PM core before this
 	 * The kthread is already frozen by the PM core before this
 	 * function is called.
 	 * function is called.
 	 */
 	 */
 
 
+	while (vb->num_pages)
+		leak_balloon(vb, vb->num_pages);
+	update_balloon_size(vb);
+
 	/* Ensure we don't get any more requests from the host */
 	/* Ensure we don't get any more requests from the host */
 	vdev->config->reset(vdev);
 	vdev->config->reset(vdev);
 	vdev->config->del_vqs(vdev);
 	vdev->config->del_vqs(vdev);
 	return 0;
 	return 0;
 }
 }
 
 
+static int restore_common(struct virtio_device *vdev)
+{
+	struct virtio_balloon *vb = vdev->priv;
+	int ret;
+
+	ret = init_vqs(vdev->priv);
+	if (ret)
+		return ret;
+
+	fill_balloon(vb, towards_target(vb));
+	update_balloon_size(vb);
+	return 0;
+}
+
 static int virtballoon_thaw(struct virtio_device *vdev)
 static int virtballoon_thaw(struct virtio_device *vdev)
 {
 {
-	return init_vqs(vdev->priv);
+	return restore_common(vdev);
 }
 }
 
 
 static int virtballoon_restore(struct virtio_device *vdev)
 static int virtballoon_restore(struct virtio_device *vdev)
 {
 {
 	struct virtio_balloon *vb = vdev->priv;
 	struct virtio_balloon *vb = vdev->priv;
-	struct page *page, *page2;
-
-	/* We're starting from a clean slate */
-	vb->num_pages = 0;
 
 
 	/*
 	/*
 	 * If a request wasn't complete at the time of freezing, this
 	 * If a request wasn't complete at the time of freezing, this
@@ -397,12 +413,7 @@ static int virtballoon_restore(struct virtio_device *vdev)
 	 */
 	 */
 	vb->need_stats_update = 0;
 	vb->need_stats_update = 0;
 
 
-	/* We don't have these pages in the balloon anymore! */
-	list_for_each_entry_safe(page, page2, &vb->pages, lru) {
-		list_del(&page->lru);
-		totalram_pages++;
-	}
-	return init_vqs(vdev->priv);
+	return restore_common(vdev);
 }
 }
 #endif
 #endif