From 0bb77c67a20369c0d109e35622430e93746bc565 Mon Sep 17 00:00:00 2001 From: Andrea Arcangeli Date: Thu, 13 Jan 2011 15:47:00 -0800 Subject: [PATCH] --- yaml --- r: 230783 b: refs/heads/master c: 21ae5b01750f14140809508a478a4413792e0261 h: refs/heads/master i: 230781: cde8c3d95017af0581739f59d7bd55b9d3fee812 230779: c5ed7039c89983f0d4b2dfca4d8291a82f5da44b 230775: 381dbeb73b78a6bacaddb91f8fea8fcc2390b475 230767: 7c049a75b73280aa1e23ebf8f621ac1a0ee3339c 230751: cec277a305359d01e6aa0538ef9024e6b2dae895 230719: fdd8e459da20d4511925317e086a53e4e5537ab8 230655: 09898ce4430afb202c9e3d93dd573857dcf83fdd v: v3 --- [refs] | 2 +- trunk/mm/ksm.c | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 9fc1e5482ccb..d227ed296e32 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b15d00b6af617251cc70a908df983e9aff57e169 +refs/heads/master: 21ae5b01750f14140809508a478a4413792e0261 diff --git a/trunk/mm/ksm.c b/trunk/mm/ksm.c index b5b907cb0f90..5e7d5d35ea82 100644 --- a/trunk/mm/ksm.c +++ b/trunk/mm/ksm.c @@ -430,7 +430,7 @@ static struct page *get_mergeable_page(struct rmap_item *rmap_item) page = follow_page(vma, addr, FOLL_GET); if (IS_ERR_OR_NULL(page)) goto out; - if (PageAnon(page)) { + if (PageAnon(page) && !PageTransCompound(page)) { flush_anon_page(vma, page, addr); flush_dcache_page(page); } else { @@ -1279,7 +1279,19 @@ static struct rmap_item *scan_get_next_rmap_item(struct page **page) if (ksm_test_exit(mm)) break; *page = follow_page(vma, ksm_scan.address, FOLL_GET); - if (!IS_ERR_OR_NULL(*page) && PageAnon(*page)) { + if (IS_ERR_OR_NULL(*page)) { + ksm_scan.address += PAGE_SIZE; + cond_resched(); + continue; + } + if (PageTransCompound(*page)) { + put_page(*page); + ksm_scan.address &= HPAGE_PMD_MASK; + ksm_scan.address += HPAGE_PMD_SIZE; + cond_resched(); + continue; + } + if (PageAnon(*page)) { flush_anon_page(vma, *page, ksm_scan.address); flush_dcache_page(*page); rmap_item = get_next_rmap_item(slot, @@ -1293,8 +1305,7 @@ static struct rmap_item *scan_get_next_rmap_item(struct page **page) up_read(&mm->mmap_sem); return rmap_item; } - if (!IS_ERR_OR_NULL(*page)) - put_page(*page); + put_page(*page); ksm_scan.address += PAGE_SIZE; cond_resched(); }