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