11965aae3c98397aad957412413c07e97b1bd4e64H. Peter Anvin#ifndef _ASM_X86_HUGETLB_H 21965aae3c98397aad957412413c07e97b1bd4e64H. Peter Anvin#define _ASM_X86_HUGETLB_H 36d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer 46d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer#include <asm/page.h> 56d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer 66d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer 76d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaeferstatic inline int is_hugepage_only_range(struct mm_struct *mm, 86d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer unsigned long addr, 96d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer unsigned long len) { 106d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer return 0; 116d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer} 126d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer 136d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer/* 146d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer * If the arch doesn't supply something else, assume that hugepage 156d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer * size aligned regions are ok without further preparation. 166d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer */ 17a5516438959d90b071ff0a484ce4f3f523dc3152Andi Kleenstatic inline int prepare_hugepage_range(struct file *file, 18a5516438959d90b071ff0a484ce4f3f523dc3152Andi Kleen unsigned long addr, unsigned long len) 196d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer{ 20a5516438959d90b071ff0a484ce4f3f523dc3152Andi Kleen struct hstate *h = hstate_file(file); 21a5516438959d90b071ff0a484ce4f3f523dc3152Andi Kleen if (len & ~huge_page_mask(h)) 226d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer return -EINVAL; 23a5516438959d90b071ff0a484ce4f3f523dc3152Andi Kleen if (addr & ~huge_page_mask(h)) 246d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer return -EINVAL; 256d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer return 0; 266d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer} 276d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer 286d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaeferstatic inline void hugetlb_prefault_arch_hook(struct mm_struct *mm) { 296d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer} 306d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer 3142b7772812d15b86543a23b82bd6070eef9a08b1Jan Beulichstatic inline void hugetlb_free_pgd_range(struct mmu_gather *tlb, 326d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer unsigned long addr, unsigned long end, 336d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer unsigned long floor, 346d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer unsigned long ceiling) 356d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer{ 366d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer free_pgd_range(tlb, addr, end, floor, ceiling); 376d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer} 386d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer 396d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaeferstatic inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr, 406d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer pte_t *ptep, pte_t pte) 416d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer{ 426d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer set_pte_at(mm, addr, ptep, pte); 436d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer} 446d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer 456d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaeferstatic inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, 466d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer unsigned long addr, pte_t *ptep) 476d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer{ 486d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer return ptep_get_and_clear(mm, addr, ptep); 496d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer} 506d779079bfd1196e077bb1d0a906c37ae770b102Gerald Schaefer 518fe627ec5b7c47b1654dff50536d9709863295a3Gerald Schaeferstatic inline void huge_ptep_clear_flush(struct vm_area_struct *vma, 528fe627ec5b7c47b1654dff50536d9709863295a3Gerald Schaefer unsigned long addr, pte_t *ptep) 538fe627ec5b7c47b1654dff50536d9709863295a3Gerald Schaefer{ 548fe627ec5b7c47b1654dff50536d9709863295a3Gerald Schaefer} 558fe627ec5b7c47b1654dff50536d9709863295a3Gerald Schaefer 567f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaeferstatic inline int huge_pte_none(pte_t pte) 577f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer{ 587f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer return pte_none(pte); 597f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer} 607f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer 617f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaeferstatic inline pte_t huge_pte_wrprotect(pte_t pte) 627f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer{ 637f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer return pte_wrprotect(pte); 647f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer} 657f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer 667f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaeferstatic inline void huge_ptep_set_wrprotect(struct mm_struct *mm, 677f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer unsigned long addr, pte_t *ptep) 687f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer{ 697f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer ptep_set_wrprotect(mm, addr, ptep); 707f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer} 717f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer 727f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaeferstatic inline int huge_ptep_set_access_flags(struct vm_area_struct *vma, 737f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer unsigned long addr, pte_t *ptep, 747f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer pte_t pte, int dirty) 757f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer{ 767f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer return ptep_set_access_flags(vma, addr, ptep, pte, dirty); 777f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer} 787f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer 797f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaeferstatic inline pte_t huge_ptep_get(pte_t *ptep) 807f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer{ 817f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer return *ptep; 827f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer} 837f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer 847f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaeferstatic inline int arch_prepare_hugepage(struct page *page) 857f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer{ 867f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer return 0; 877f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer} 887f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer 897f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaeferstatic inline void arch_release_hugepage(struct page *page) 907f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer{ 917f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer} 927f2e9525ba55b1c42ad6c4a5a59d7eb7bdd9be72Gerald Schaefer 931965aae3c98397aad957412413c07e97b1bd4e64H. Peter Anvin#endif /* _ASM_X86_HUGETLB_H */ 94