162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_GENERIC_HUGETLB_H 362306a36Sopenharmony_ci#define _ASM_GENERIC_HUGETLB_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/swap.h> 662306a36Sopenharmony_ci#include <linux/swapops.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistatic inline pte_t mk_huge_pte(struct page *page, pgprot_t pgprot) 962306a36Sopenharmony_ci{ 1062306a36Sopenharmony_ci return mk_pte(page, pgprot); 1162306a36Sopenharmony_ci} 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistatic inline unsigned long huge_pte_write(pte_t pte) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci return pte_write(pte); 1662306a36Sopenharmony_ci} 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic inline unsigned long huge_pte_dirty(pte_t pte) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci return pte_dirty(pte); 2162306a36Sopenharmony_ci} 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistatic inline pte_t huge_pte_mkwrite(pte_t pte) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci return pte_mkwrite_novma(pte); 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTE_WRPROTECT 2962306a36Sopenharmony_cistatic inline pte_t huge_pte_wrprotect(pte_t pte) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci return pte_wrprotect(pte); 3262306a36Sopenharmony_ci} 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic inline pte_t huge_pte_mkdirty(pte_t pte) 3662306a36Sopenharmony_ci{ 3762306a36Sopenharmony_ci return pte_mkdirty(pte); 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic inline pte_t huge_pte_modify(pte_t pte, pgprot_t newprot) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci return pte_modify(pte, newprot); 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic inline pte_t huge_pte_mkuffd_wp(pte_t pte) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci return huge_pte_wrprotect(pte_mkuffd_wp(pte)); 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_cistatic inline pte_t huge_pte_clear_uffd_wp(pte_t pte) 5162306a36Sopenharmony_ci{ 5262306a36Sopenharmony_ci return pte_clear_uffd_wp(pte); 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic inline int huge_pte_uffd_wp(pte_t pte) 5662306a36Sopenharmony_ci{ 5762306a36Sopenharmony_ci return pte_uffd_wp(pte); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTE_CLEAR 6162306a36Sopenharmony_cistatic inline void huge_pte_clear(struct mm_struct *mm, unsigned long addr, 6262306a36Sopenharmony_ci pte_t *ptep, unsigned long sz) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci pte_clear(mm, addr, ptep); 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci#endif 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGETLB_FREE_PGD_RANGE 6962306a36Sopenharmony_cistatic inline void hugetlb_free_pgd_range(struct mmu_gather *tlb, 7062306a36Sopenharmony_ci unsigned long addr, unsigned long end, 7162306a36Sopenharmony_ci unsigned long floor, unsigned long ceiling) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci free_pgd_range(tlb, addr, end, floor, ceiling); 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci#endif 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT 7862306a36Sopenharmony_cistatic inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, 7962306a36Sopenharmony_ci pte_t *ptep, pte_t pte, unsigned long sz) 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci set_pte_at(mm, addr, ptep, pte); 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci#endif 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR 8662306a36Sopenharmony_cistatic inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, 8762306a36Sopenharmony_ci unsigned long addr, pte_t *ptep) 8862306a36Sopenharmony_ci{ 8962306a36Sopenharmony_ci return ptep_get_and_clear(mm, addr, ptep); 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci#endif 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH 9462306a36Sopenharmony_cistatic inline pte_t huge_ptep_clear_flush(struct vm_area_struct *vma, 9562306a36Sopenharmony_ci unsigned long addr, pte_t *ptep) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci return ptep_clear_flush(vma, addr, ptep); 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci#endif 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTE_NONE 10262306a36Sopenharmony_cistatic inline int huge_pte_none(pte_t pte) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci return pte_none(pte); 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci#endif 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci/* Please refer to comments above pte_none_mostly() for the usage */ 10962306a36Sopenharmony_cistatic inline int huge_pte_none_mostly(pte_t pte) 11062306a36Sopenharmony_ci{ 11162306a36Sopenharmony_ci return huge_pte_none(pte) || is_pte_marker(pte); 11262306a36Sopenharmony_ci} 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci#ifndef __HAVE_ARCH_PREPARE_HUGEPAGE_RANGE 11562306a36Sopenharmony_cistatic inline int prepare_hugepage_range(struct file *file, 11662306a36Sopenharmony_ci unsigned long addr, unsigned long len) 11762306a36Sopenharmony_ci{ 11862306a36Sopenharmony_ci struct hstate *h = hstate_file(file); 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci if (len & ~huge_page_mask(h)) 12162306a36Sopenharmony_ci return -EINVAL; 12262306a36Sopenharmony_ci if (addr & ~huge_page_mask(h)) 12362306a36Sopenharmony_ci return -EINVAL; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci return 0; 12662306a36Sopenharmony_ci} 12762306a36Sopenharmony_ci#endif 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT 13062306a36Sopenharmony_cistatic inline void huge_ptep_set_wrprotect(struct mm_struct *mm, 13162306a36Sopenharmony_ci unsigned long addr, pte_t *ptep) 13262306a36Sopenharmony_ci{ 13362306a36Sopenharmony_ci ptep_set_wrprotect(mm, addr, ptep); 13462306a36Sopenharmony_ci} 13562306a36Sopenharmony_ci#endif 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS 13862306a36Sopenharmony_cistatic inline int huge_ptep_set_access_flags(struct vm_area_struct *vma, 13962306a36Sopenharmony_ci unsigned long addr, pte_t *ptep, 14062306a36Sopenharmony_ci pte_t pte, int dirty) 14162306a36Sopenharmony_ci{ 14262306a36Sopenharmony_ci return ptep_set_access_flags(vma, addr, ptep, pte, dirty); 14362306a36Sopenharmony_ci} 14462306a36Sopenharmony_ci#endif 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#ifndef __HAVE_ARCH_HUGE_PTEP_GET 14762306a36Sopenharmony_cistatic inline pte_t huge_ptep_get(pte_t *ptep) 14862306a36Sopenharmony_ci{ 14962306a36Sopenharmony_ci return ptep_get(ptep); 15062306a36Sopenharmony_ci} 15162306a36Sopenharmony_ci#endif 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci#ifndef __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED 15462306a36Sopenharmony_cistatic inline bool gigantic_page_runtime_supported(void) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci return IS_ENABLED(CONFIG_ARCH_HAS_GIGANTIC_PAGE); 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci#endif /* __HAVE_ARCH_GIGANTIC_PAGE_RUNTIME_SUPPORTED */ 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci#endif /* _ASM_GENERIC_HUGETLB_H */ 161