summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Litke <agl@us.ibm.com>2005-09-04 00:55:01 +0200
committerLinus Torvalds <torvalds@evo.osdl.org>2005-09-05 09:05:46 +0200
commit02b0ccef903e85673ead74ddb7c431f2f7ce183d (patch)
treed359d49ef24f94a413e7dec69821645b42813921
parent[PATCH] hugetlb: move stale pte check into huge_pte_alloc() (diff)
downloadlinux-02b0ccef903e85673ead74ddb7c431f2f7ce183d.tar.xz
linux-02b0ccef903e85673ead74ddb7c431f2f7ce183d.zip
[PATCH] hugetlb: check p?d_present in huge_pte_offset()
For demand faulting, we cannot assume that the page tables will be populated. Do what the rest of the architectures do and test p?d_present() while walking down the page table. Signed-off-by: Adam Litke <agl@us.ibm.com> Cc: <linux-mm@kvack.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--arch/i386/mm/hugetlbpage.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/arch/i386/mm/hugetlbpage.c b/arch/i386/mm/hugetlbpage.c
index 57c486f0e896..24c8a536b588 100644
--- a/arch/i386/mm/hugetlbpage.c
+++ b/arch/i386/mm/hugetlbpage.c
@@ -46,8 +46,11 @@ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
pmd_t *pmd = NULL;
pgd = pgd_offset(mm, addr);
- pud = pud_offset(pgd, addr);
- pmd = pmd_offset(pud, addr);
+ if (pgd_present(*pgd)) {
+ pud = pud_offset(pgd, addr);
+ if (pud_present(*pud))
+ pmd = pmd_offset(pud, addr);
+ }
return (pte_t *) pmd;
}