Messages in this thread Patch in this message | | | From | Andi Kleen <> | Subject | [PATCH] [22/31] CPA: Only queue actually unused page table pages for freeing | Date | Mon, 14 Jan 2008 23:16:55 +0100 (CET) |
| |
With the separate data structure added for flush earlier it is only needed to call save_page() now on pte pages that have been already reverted.
Also move all freeing checks into the caller.
Signed-off-by: Andi Kleen <ak@suse.de>
--- arch/x86/mm/pageattr_32.c | 4 +--- arch/x86/mm/pageattr_64.c | 7 +++---- 2 files changed, 4 insertions(+), 7 deletions(-)
Index: linux/arch/x86/mm/pageattr_32.c =================================================================== --- linux.orig/arch/x86/mm/pageattr_32.c +++ linux/arch/x86/mm/pageattr_32.c @@ -270,9 +270,9 @@ __change_page_attr(struct page *page, pg * replace it with a largepage. */ - save_page(kpte_page); if (!PageReserved(kpte_page)) { if (cpu_has_pse && (page_private(kpte_page) == 0)) { + save_page(kpte_page); paravirt_release_pt(page_to_pfn(kpte_page)); revert_page(kpte_page, address); } @@ -333,8 +333,6 @@ void global_flush_tlb(void) list_for_each_entry_safe(pg, next, &free_pages, lru) { list_del(&pg->lru); ClearPageDeferred(pg); - if (PageReserved(pg) || !cpu_has_pse || page_private(pg) != 0) - continue; ClearPagePrivate(pg); __free_page(pg); } Index: linux/arch/x86/mm/pageattr_64.c =================================================================== --- linux.orig/arch/x86/mm/pageattr_64.c +++ linux/arch/x86/mm/pageattr_64.c @@ -246,9 +246,10 @@ __change_page_attr(unsigned long address /* on x86-64 the direct mapping set at boot is not using 4k pages */ BUG_ON(PageReserved(kpte_page)); - save_page(kpte_page); - if (page_private(kpte_page) == 0) + if (page_private(kpte_page) == 0) { + save_page(kpte_page); revert_page(address, ref_prot); + } return 0; } @@ -336,8 +337,6 @@ void global_flush_tlb(void) list_for_each_entry_safe(pg, next, &free_pages, lru) { list_del(&pg->lru); ClearPageDeferred(pg); - if (page_private(pg) != 0) - continue; ClearPagePrivate(pg); __free_page(pg); }
| |