From b4b9df5ce44398fa4e663e0b9fa2d4099e0d7b51 Mon Sep 17 00:00:00 2001 From: "Chen, Kenneth W" Date: Wed, 22 Mar 2006 00:09:03 -0800 Subject: [PATCH] --- yaml --- r: 22495 b: refs/heads/master c: d5d4b0aa4e1430d73050babba999365593bdb9d2 h: refs/heads/master i: 22493: efeed542cbcc1b8e2ae62f1e604a701bf9d45358 22491: e543fe7d072ada5b6faa20c118bebc07d573bfc7 22487: 499fe090d42ff6099ab00bb5086ec3f6fc38f8bc 22479: 52afa3e65ed5b47e116dd844c189aa106b3f65a3 22463: e2472809f05790c6246473742d3cb38c12996b3f v: v3 --- [refs] | 2 +- trunk/mm/hugetlb.c | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index 6808440409f2..534d96450575 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bba1e9b2111b14625f670bd07e57fd7ed57ce804 +refs/heads/master: d5d4b0aa4e1430d73050babba999365593bdb9d2 diff --git a/trunk/mm/hugetlb.c b/trunk/mm/hugetlb.c index 075877b1cbc0..06699d871a8e 100644 --- a/trunk/mm/hugetlb.c +++ b/trunk/mm/hugetlb.c @@ -661,10 +661,10 @@ int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, struct page **pages, struct vm_area_struct **vmas, unsigned long *position, int *length, int i) { - unsigned long vpfn, vaddr = *position; + unsigned long pfn_offset; + unsigned long vaddr = *position; int remainder = *length; - vpfn = vaddr/PAGE_SIZE; spin_lock(&mm->page_table_lock); while (vaddr < vma->vm_end && remainder) { pte_t *pte; @@ -692,19 +692,28 @@ int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, break; } - if (pages) { - page = &pte_page(*pte)[vpfn % (HPAGE_SIZE/PAGE_SIZE)]; - get_page(page); - pages[i] = page; - } + pfn_offset = (vaddr & ~HPAGE_MASK) >> PAGE_SHIFT; + page = pte_page(*pte); +same_page: + get_page(page); + if (pages) + pages[i] = page + pfn_offset; if (vmas) vmas[i] = vma; vaddr += PAGE_SIZE; - ++vpfn; + ++pfn_offset; --remainder; ++i; + if (vaddr < vma->vm_end && remainder && + pfn_offset < HPAGE_SIZE/PAGE_SIZE) { + /* + * We use pfn_offset to avoid touching the pageframes + * of this compound page. + */ + goto same_page; + } } spin_unlock(&mm->page_table_lock); *length = remainder;