diff options
Diffstat (limited to 'arch/i386/mm')
-rw-r--r-- | arch/i386/mm/hugetlbpage.c | 23 |
1 files changed, 3 insertions, 20 deletions
diff --git a/arch/i386/mm/hugetlbpage.c b/arch/i386/mm/hugetlbpage.c index 24c8a536b588..d524127c9afc 100644 --- a/arch/i386/mm/hugetlbpage.c +++ b/arch/i386/mm/hugetlbpage.c | |||
@@ -22,20 +22,14 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr) | |||
22 | { | 22 | { |
23 | pgd_t *pgd; | 23 | pgd_t *pgd; |
24 | pud_t *pud; | 24 | pud_t *pud; |
25 | pmd_t *pmd; | ||
26 | pte_t *pte = NULL; | 25 | pte_t *pte = NULL; |
27 | 26 | ||
28 | pgd = pgd_offset(mm, addr); | 27 | pgd = pgd_offset(mm, addr); |
29 | pud = pud_alloc(mm, pgd, addr); | 28 | pud = pud_alloc(mm, pgd, addr); |
30 | pmd = pmd_alloc(mm, pud, addr); | 29 | if (pud) |
30 | pte = (pte_t *) pmd_alloc(mm, pud, addr); | ||
31 | BUG_ON(pte && !pte_none(*pte) && !pte_huge(*pte)); | ||
31 | 32 | ||
32 | if (!pmd) | ||
33 | goto out; | ||
34 | |||
35 | pte = (pte_t *) pmd; | ||
36 | if (!pte_none(*pte) && !pte_huge(*pte)) | ||
37 | hugetlb_clean_stale_pgtable(pte); | ||
38 | out: | ||
39 | return pte; | 33 | return pte; |
40 | } | 34 | } |
41 | 35 | ||
@@ -130,17 +124,6 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long address, | |||
130 | } | 124 | } |
131 | #endif | 125 | #endif |
132 | 126 | ||
133 | void hugetlb_clean_stale_pgtable(pte_t *pte) | ||
134 | { | ||
135 | pmd_t *pmd = (pmd_t *) pte; | ||
136 | struct page *page; | ||
137 | |||
138 | page = pmd_page(*pmd); | ||
139 | pmd_clear(pmd); | ||
140 | dec_page_state(nr_page_table_pages); | ||
141 | page_cache_release(page); | ||
142 | } | ||
143 | |||
144 | /* x86_64 also uses this file */ | 127 | /* x86_64 also uses this file */ |
145 | 128 | ||
146 | #ifdef HAVE_ARCH_HUGETLB_UNMAPPED_AREA | 129 | #ifdef HAVE_ARCH_HUGETLB_UNMAPPED_AREA |