Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 3160499aacb81f6735941eb4c372d87a > files > 148

kvm-83-164.el5_5.30.src.rpm

From e1e075c1ef8f659b4d4612e7838190fa0472e08f Mon Sep 17 00:00:00 2001
From: Izik Eidus <ieidus@redhat.com>
Date: Sun, 19 Apr 2009 05:08:21 +0300
Subject: [PATCH 04/15] KSM: fix 495350 (effective bug)

we mark the rmap_item as rmap_item that pointing into stable tree
in the unstable_tree_search_insert() case.

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

diff --git a/kernel/ksm/ksm_main.c b/kernel/ksm/ksm_main.c
index 818711e..c7e24a2 100644
--- a/kernel/ksm/ksm_main.c
+++ b/kernel/ksm/ksm_main.c
@@ -986,16 +986,22 @@ static int cmp_and_merge_page(struct ksm_scan *ksm_scan, struct page *page)
 	tree_item = unstable_tree_search_insert(page, page2, rmap_item);
 	if (tree_item) {
 		int ret;
+		struct rmap_item *tmp_rmap_item;
 
-		rmap_item = tree_item->rmap_item;
-		BUG_ON(!rmap_item);
+		tmp_rmap_item = tree_item->rmap_item;
+		BUG_ON(!tmp_rmap_item);
 		ret = try_to_merge_two_pages_alloc(slot->mm, page,
-						   rmap_item->mm,
+						   tmp_rmap_item->mm,
 						   page2[0], addr,
-						   rmap_item->address);
+						   tmp_rmap_item->address);
 		if (!ret) {
 			rb_erase(&tree_item->node, &root_unstable_tree);
-			stable_tree_insert(page2[0], tree_item, rmap_item);
+			if (!stable_tree_insert(page2[0],
+						tree_item, tmp_rmap_item)) {
+				if (rmap_item) {
+					rmap_item->stable_tree = 1;
+				}
+			}
 		}
 		put_page(page2[0]);
 		return !ret;
-- 
1.6.3.rc4.29.g8146