Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 340e01248478ba8b78a6d4d1809b1eff > files > 172

kvm-83-270.el5_11.src.rpm

From 098f8e88ac188c3d4ee67182373b56a16a6b972d Mon Sep 17 00:00:00 2001
From: Izik Eidus <ieidus@redhat.com>
Date: Tue, 14 Apr 2009 19:29:17 +0300
Subject: [PATCH 11/11] KSM: fix bug 495351 - effective issue.

we dont need to check for is_zapped_item in update_tree in case we have
rmap_item that point into stable_tree.

Signed-off-by: Izik Eidus <ieidus@redhat.com>
Message-Id: <1239726558-14362-5-git-send-email-ieidus@redhat.com>
Message-Id: <1239808529-22398-5-git-send-email-ieidus@redhat.com>
Message-Id: <1240106904-21687-5-git-send-email-ieidus@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com
RH-Upstream-status: pending
Acked-by: "Michael S. Tsirkin" <mst@redhat.com>
Acked-by: Andrea Arcangeli <aarcange@redhat.com>
Acked-by: john cooper <john.cooper@redhat.com>
Bugzilla: 497886
---
 kernel/ksm/ksm_main.c |   30 +++++++++++++++++++-----------
 1 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/kernel/ksm/ksm_main.c b/kernel/ksm/ksm_main.c
index bb9de71..6e446c1 100644
--- a/kernel/ksm/ksm_main.c
+++ b/kernel/ksm/ksm_main.c
@@ -879,22 +879,30 @@ static struct tree_item *unstable_tree_search_insert(struct page *page,
  */
 int update_tree(struct rmap_item *rmap_item, int *wait)
 {
-	struct page *page[1];
-
 	if (!rmap_item->stable_tree) {
+		/*
+		 * If the rmap_item is !stable_tree and in addition
+		 * it have tree_item != NULL, it mean this rmap_item
+		 * was inside the unstable tree, therefore we have to free
+		 * the tree_item from it (beacuse the unstable tree was already
+		 * flushed by the time we are here).
+		 */
 		if (rmap_item->tree_item) {
-			remove_rmap_item_from_tree(rmap_item);
-			return 1;
+			free_tree_item(rmap_item->tree_item);
+			rmap_item->tree_item = NULL;
+			return 0;
 		}
 		return 0;
 	}
-	if (is_zapped_item(rmap_item, page)) {
-		remove_rmap_item_from_tree(rmap_item);
-		*wait = 1;
-		return 1;
-	}
-	put_page(page[0]);
-	return 0;
+
+	/* If we are here it mean the rmap_item was zapped, beacuse the
+	 * rmap_item was pointing into the stable_tree and there all the pages
+	 * should be KsmPages, so it shouldnt have came to here in the first
+	 * place. (cmp_and_merge_page() shouldnt have been called)
+	 */
+	remove_rmap_item_from_tree(rmap_item);
+	*wait = 1;
+	return 1;
 }
 
 static struct rmap_item *create_new_rmap_item(struct mm_struct *mm,
-- 
1.6.1