From: Nick Piggin Remove page_count and __put_page from x86-64 pageattr Signed-off-by: Nick Piggin Acked-by: Andi Kleen Signed-off-by: Andrew Morton --- arch/x86_64/mm/pageattr.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) diff -puN arch/x86_64/mm/pageattr.c~x86_64-pageattr-remove-__put_page arch/x86_64/mm/pageattr.c --- devel/arch/x86_64/mm/pageattr.c~x86_64-pageattr-remove-__put_page 2006-02-18 01:50:40.000000000 -0800 +++ devel-akpm/arch/x86_64/mm/pageattr.c 2006-02-18 01:50:40.000000000 -0800 @@ -45,6 +45,9 @@ static struct page *split_large_page(uns pte_t *pbase; if (!base) return NULL; + SetPagePrivate(base); + page_private(base) = 0; + address = __pa(address); addr = address & LARGE_PAGE_MASK; pbase = (pte_t *)page_address(base); @@ -137,23 +140,20 @@ __change_page_attr(unsigned long address set_pte(kpte,mk_pte(split, ref_prot2)); kpte_page = split; } - get_page(kpte_page); + page_private(kpte_page)++; } else if ((kpte_flags & _PAGE_PSE) == 0) { set_pte(kpte, pfn_pte(pfn, ref_prot)); - __put_page(kpte_page); + BUG_ON(page_private(kpte_page) == 0); + page_private(kpte_page)--; } else BUG(); /* on x86-64 the direct mapping set at boot is not using 4k pages */ BUG_ON(PageReserved(kpte_page)); - switch (page_count(kpte_page)) { - case 1: + if (page_private(kpte_page) == 0) { save_page(kpte_page); revert_page(address, ref_prot); - break; - case 0: - BUG(); /* memleak and failed 2M page regeneration */ } return 0; } @@ -216,6 +216,7 @@ void global_flush_tlb(void) while (dpage) { struct page *tmp = dpage; dpage = (struct page *)dpage->lru.next; + ClearPagePrivate(tmp); __free_page(tmp); } } _