hc
2024-10-12 a5969cabbb4660eab42b6ef0412cbbd1200cf14d
kernel/arch/powerpc/include/asm/hugetlb.h
....@@ -4,85 +4,18 @@
44
55 #ifdef CONFIG_HUGETLB_PAGE
66 #include <asm/page.h>
7
-#include <asm-generic/hugetlb.h>
8
-
9
-extern struct kmem_cache *hugepte_cache;
107
118 #ifdef CONFIG_PPC_BOOK3S_64
12
-
139 #include <asm/book3s/64/hugetlb.h>
14
-/*
15
- * This should work for other subarchs too. But right now we use the
16
- * new format only for 64bit book3s
17
- */
18
-static inline pte_t *hugepd_page(hugepd_t hpd)
19
-{
20
- BUG_ON(!hugepd_ok(hpd));
21
- /*
22
- * We have only four bits to encode, MMU page size
23
- */
24
- BUILD_BUG_ON((MMU_PAGE_COUNT - 1) > 0xf);
25
- return __va(hpd_val(hpd) & HUGEPD_ADDR_MASK);
26
-}
27
-
28
-static inline unsigned int hugepd_mmu_psize(hugepd_t hpd)
29
-{
30
- return (hpd_val(hpd) & HUGEPD_SHIFT_MASK) >> 2;
31
-}
32
-
33
-static inline unsigned int hugepd_shift(hugepd_t hpd)
34
-{
35
- return mmu_psize_to_shift(hugepd_mmu_psize(hpd));
36
-}
37
-static inline void flush_hugetlb_page(struct vm_area_struct *vma,
38
- unsigned long vmaddr)
39
-{
40
- if (radix_enabled())
41
- return radix__flush_hugetlb_page(vma, vmaddr);
42
-}
43
-
44
-#else
45
-
46
-static inline pte_t *hugepd_page(hugepd_t hpd)
47
-{
48
- BUG_ON(!hugepd_ok(hpd));
49
-#ifdef CONFIG_PPC_8xx
50
- return (pte_t *)__va(hpd_val(hpd) & ~HUGEPD_SHIFT_MASK);
51
-#else
52
- return (pte_t *)((hpd_val(hpd) &
53
- ~HUGEPD_SHIFT_MASK) | PD_HUGE);
54
-#endif
55
-}
56
-
57
-static inline unsigned int hugepd_shift(hugepd_t hpd)
58
-{
59
-#ifdef CONFIG_PPC_8xx
60
- return ((hpd_val(hpd) & _PMD_PAGE_MASK) >> 1) + 17;
61
-#else
62
- return hpd_val(hpd) & HUGEPD_SHIFT_MASK;
63
-#endif
64
-}
65
-
10
+#elif defined(CONFIG_PPC_FSL_BOOK3E)
11
+#include <asm/nohash/hugetlb-book3e.h>
12
+#elif defined(CONFIG_PPC_8xx)
13
+#include <asm/nohash/32/hugetlb-8xx.h>
6614 #endif /* CONFIG_PPC_BOOK3S_64 */
6715
16
+extern bool hugetlb_disabled;
6817
69
-static inline pte_t *hugepte_offset(hugepd_t hpd, unsigned long addr,
70
- unsigned pdshift)
71
-{
72
- /*
73
- * On FSL BookE, we have multiple higher-level table entries that
74
- * point to the same hugepte. Just use the first one since they're all
75
- * identical. So for that case, idx=0.
76
- */
77
- unsigned long idx = 0;
78
-
79
- pte_t *dir = hugepd_page(hpd);
80
-#ifndef CONFIG_PPC_FSL_BOOK3E
81
- idx = (addr & ((1UL << pdshift) - 1)) >> hugepd_shift(hpd);
82
-#endif
83
-
84
- return dir + idx;
85
-}
18
+void hugetlbpage_init_default(void);
8619
8720 void flush_dcache_icache_hugepage(struct page *page);
8821
....@@ -97,84 +30,35 @@
9730 return slice_is_hugepage_only_range(mm, addr, len);
9831 return 0;
9932 }
33
+#define is_hugepage_only_range is_hugepage_only_range
10034
101
-void book3e_hugetlb_preload(struct vm_area_struct *vma, unsigned long ea,
102
- pte_t pte);
103
-#ifdef CONFIG_PPC_8xx
104
-static inline void flush_hugetlb_page(struct vm_area_struct *vma,
105
- unsigned long vmaddr)
106
-{
107
- flush_tlb_page(vma, vmaddr);
108
-}
109
-#else
110
-void flush_hugetlb_page(struct vm_area_struct *vma, unsigned long vmaddr);
111
-#endif
112
-
35
+#define __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE
11336 void hugetlb_free_pgd_range(struct mmu_gather *tlb, unsigned long addr,
11437 unsigned long end, unsigned long floor,
11538 unsigned long ceiling);
11639
117
-/*
118
- * If the arch doesn't supply something else, assume that hugepage
119
- * size aligned regions are ok without further preparation.
120
- */
121
-static inline int prepare_hugepage_range(struct file *file,
122
- unsigned long addr, unsigned long len)
123
-{
124
- struct hstate *h = hstate_file(file);
125
- if (len & ~huge_page_mask(h))
126
- return -EINVAL;
127
- if (addr & ~huge_page_mask(h))
128
- return -EINVAL;
129
- return 0;
130
-}
131
-
132
-static inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
133
- pte_t *ptep, pte_t pte)
134
-{
135
- set_pte_at(mm, addr, ptep, pte);
136
-}
137
-
40
+#define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR
13841 static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
13942 unsigned long addr, pte_t *ptep)
14043 {
141
-#ifdef CONFIG_PPC64
14244 return __pte(pte_update(mm, addr, ptep, ~0UL, 0, 1));
143
-#else
144
- return __pte(pte_update(ptep, ~0UL, 0));
145
-#endif
14645 }
14746
47
+#define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
14848 static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
14949 unsigned long addr, pte_t *ptep)
15050 {
151
- pte_t pte;
152
- pte = huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
51
+ huge_ptep_get_and_clear(vma->vm_mm, addr, ptep);
15352 flush_hugetlb_page(vma, addr);
15453 }
15554
156
-static inline int huge_pte_none(pte_t pte)
157
-{
158
- return pte_none(pte);
159
-}
55
+#define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
56
+int huge_ptep_set_access_flags(struct vm_area_struct *vma,
57
+ unsigned long addr, pte_t *ptep,
58
+ pte_t pte, int dirty);
16059
161
-static inline pte_t huge_pte_wrprotect(pte_t pte)
162
-{
163
- return pte_wrprotect(pte);
164
-}
165
-
166
-extern int huge_ptep_set_access_flags(struct vm_area_struct *vma,
167
- unsigned long addr, pte_t *ptep,
168
- pte_t pte, int dirty);
169
-
170
-static inline pte_t huge_ptep_get(pte_t *ptep)
171
-{
172
- return *ptep;
173
-}
174
-
175
-static inline void arch_clear_hugepage_flags(struct page *page)
176
-{
177
-}
60
+void gigantic_hugetlb_cma_reserve(void) __init;
61
+#include <asm-generic/hugetlb.h>
17862
17963 #else /* ! CONFIG_HUGETLB_PAGE */
18064 static inline void flush_hugetlb_page(struct vm_area_struct *vma,
....@@ -188,6 +72,12 @@
18872 {
18973 return NULL;
19074 }
75
+
76
+
77
+static inline void __init gigantic_hugetlb_cma_reserve(void)
78
+{
79
+}
80
+
19181 #endif /* CONFIG_HUGETLB_PAGE */
19282
19383 #endif /* _ASM_POWERPC_HUGETLB_H */