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