diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2006-03-22 03:08:58 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-03-22 10:54:04 -0500 |
commit | 4866920b93fd7d5b520278c3c76e6f4d5a352d81 (patch) | |
tree | c4b8642c83e11af6d8e57ab35dc479f2c1a651d0 | |
parent | 9da61aef0fd5b17dd4bf4baf33db12c470def774 (diff) |
[PATCH] hugepage: Fix hugepage logic in free_pgtables() harder
Turns out the hugepage logic in free_pgtables() was doubly broken. The
loop coalescing multiple normal page VMAs into one call to free_pgd_range()
had an off by one error, which could mean it would coalesce one hugepage
VMA into the same bundle (checking 'vma' not 'next' in the loop). I
transferred this bug into the new is_vm_hugetlb_page() based version.
Here's the fix.
This one didn't bite on powerpc previously for the same reason the
is_hugepage_only_range() problem didn't: powerpc's hugetlb_free_pgd_range()
is identical to free_pgd_range(). It didn't bite on ia64 because the
hugepage region is distant enough from any other region that the separated
PMD_SIZE distance test would always prevent coalescing the two together.
No libhugetlbfs testsuite regressions (ppc64, POWER5).
Signed-off-by: David Gibson <dwg@au1.ibm.com>
Cc: William Lee Irwin III <wli@holomorphy.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r-- | mm/memory.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/mm/memory.c b/mm/memory.c index f6e3be9cbf5a..80c3fb370f91 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -285,7 +285,7 @@ void free_pgtables(struct mmu_gather **tlb, struct vm_area_struct *vma, | |||
285 | * Optimization: gather nearby vmas into one call down | 285 | * Optimization: gather nearby vmas into one call down |
286 | */ | 286 | */ |
287 | while (next && next->vm_start <= vma->vm_end + PMD_SIZE | 287 | while (next && next->vm_start <= vma->vm_end + PMD_SIZE |
288 | && !is_vm_hugetlb_page(vma)) { | 288 | && !is_vm_hugetlb_page(next)) { |
289 | vma = next; | 289 | vma = next; |
290 | next = vma->vm_next; | 290 | next = vma->vm_next; |
291 | anon_vma_unlink(vma); | 291 | anon_vma_unlink(vma); |