hugetlbpage.c (16ba7e312045cd5d32fba0156312b4303f200787) hugetlbpage.c (ae94da898133947c2d1f005da10838478e4548db)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * IBM System z Huge TLB Page Support for Kernel.
4 *
5 * Copyright IBM Corp. 2007,2020
6 * Author(s): Gerald Schaefer <gerald.schaefer@de.ibm.com>
7 */
8

--- 145 unchanged lines hidden (view full) ---

154{
155 unsigned long rste;
156
157 rste = __pte_to_rste(pte);
158 if (!MACHINE_HAS_NX)
159 rste &= ~_SEGMENT_ENTRY_NOEXEC;
160
161 /* Set correct table type for 2G hugepages */
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * IBM System z Huge TLB Page Support for Kernel.
4 *
5 * Copyright IBM Corp. 2007,2020
6 * Author(s): Gerald Schaefer <gerald.schaefer@de.ibm.com>
7 */
8

--- 145 unchanged lines hidden (view full) ---

154{
155 unsigned long rste;
156
157 rste = __pte_to_rste(pte);
158 if (!MACHINE_HAS_NX)
159 rste &= ~_SEGMENT_ENTRY_NOEXEC;
160
161 /* Set correct table type for 2G hugepages */
162 if ((pte_val(*ptep) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3)
163 rste |= _REGION_ENTRY_TYPE_R3 | _REGION3_ENTRY_LARGE;
164 else
162 if ((pte_val(*ptep) & _REGION_ENTRY_TYPE_MASK) == _REGION_ENTRY_TYPE_R3) {
163 if (likely(pte_present(pte)))
164 rste |= _REGION3_ENTRY_LARGE;
165 rste |= _REGION_ENTRY_TYPE_R3;
166 } else if (likely(pte_present(pte)))
165 rste |= _SEGMENT_ENTRY_LARGE;
167 rste |= _SEGMENT_ENTRY_LARGE;
168
166 clear_huge_pte_skeys(mm, rste);
167 pte_val(*ptep) = rste;
168}
169
170pte_t huge_ptep_get(pte_t *ptep)
171{
172 return __rste_to_pte(pte_val(*ptep));
173}

--- 72 unchanged lines hidden (view full) ---

246 pud_t *pud, int flags)
247{
248 if (flags & FOLL_GET)
249 return NULL;
250
251 return pud_page(*pud) + ((address & ~PUD_MASK) >> PAGE_SHIFT);
252}
253
169 clear_huge_pte_skeys(mm, rste);
170 pte_val(*ptep) = rste;
171}
172
173pte_t huge_ptep_get(pte_t *ptep)
174{
175 return __rste_to_pte(pte_val(*ptep));
176}

--- 72 unchanged lines hidden (view full) ---

249 pud_t *pud, int flags)
250{
251 if (flags & FOLL_GET)
252 return NULL;
253
254 return pud_page(*pud) + ((address & ~PUD_MASK) >> PAGE_SHIFT);
255}
256
257bool __init arch_hugetlb_valid_size(unsigned long size)
258{
259 if (MACHINE_HAS_EDAT1 && size == PMD_SIZE)
260 return true;
261 else if (MACHINE_HAS_EDAT2 && size == PUD_SIZE)
262 return true;
263 else
264 return false;
265}
266
254static __init int setup_hugepagesz(char *opt)
255{
256 unsigned long size;
257 char *string = opt;
258
259 size = memparse(opt, &opt);
267static __init int setup_hugepagesz(char *opt)
268{
269 unsigned long size;
270 char *string = opt;
271
272 size = memparse(opt, &opt);
260 if (MACHINE_HAS_EDAT1 && size == PMD_SIZE) {
261 hugetlb_add_hstate(PMD_SHIFT - PAGE_SHIFT);
262 } else if (MACHINE_HAS_EDAT2 && size == PUD_SIZE) {
263 hugetlb_add_hstate(PUD_SHIFT - PAGE_SHIFT);
273 if (arch_hugetlb_valid_size(size)) {
274 hugetlb_add_hstate(ilog2(size) - PAGE_SHIFT);
264 } else {
265 hugetlb_bad_size();
266 pr_err("hugepagesz= specifies an unsupported page size %s\n",
267 string);
268 return 0;
269 }
270 return 1;
271}

--- 89 unchanged lines hidden ---
275 } else {
276 hugetlb_bad_size();
277 pr_err("hugepagesz= specifies an unsupported page size %s\n",
278 string);
279 return 0;
280 }
281 return 1;
282}

--- 89 unchanged lines hidden ---