hugetlb.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * arch/arm64/include/asm/hugetlb.h
  4. *
  5. * Copyright (C) 2013 Linaro Ltd.
  6. *
  7. * Based on arch/x86/include/asm/hugetlb.h
  8. */
  9. #ifndef __ASM_HUGETLB_H
  10. #define __ASM_HUGETLB_H
  11. #include <asm/cacheflush.h>
  12. #include <asm/mte.h>
  13. #include <asm/page.h>
  14. #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
  15. #define arch_hugetlb_migration_supported arch_hugetlb_migration_supported
  16. extern bool arch_hugetlb_migration_supported(struct hstate *h);
  17. #endif
  18. static inline void arch_clear_hugetlb_flags(struct folio *folio)
  19. {
  20. clear_bit(PG_dcache_clean, &folio->flags.f);
  21. #ifdef CONFIG_ARM64_MTE
  22. if (system_supports_mte()) {
  23. clear_bit(PG_mte_tagged, &folio->flags.f);
  24. clear_bit(PG_mte_lock, &folio->flags.f);
  25. }
  26. #endif
  27. }
  28. #define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
  29. pte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags);
  30. #define arch_make_huge_pte arch_make_huge_pte
  31. #define __HAVE_ARCH_HUGE_SET_HUGE_PTE_AT
  32. extern void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
  33. pte_t *ptep, pte_t pte, unsigned long sz);
  34. #define __HAVE_ARCH_HUGE_PTEP_SET_ACCESS_FLAGS
  35. extern int huge_ptep_set_access_flags(struct vm_area_struct *vma,
  36. unsigned long addr, pte_t *ptep,
  37. pte_t pte, int dirty);
  38. #define __HAVE_ARCH_HUGE_PTEP_GET_AND_CLEAR
  39. extern pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
  40. pte_t *ptep, unsigned long sz);
  41. #define __HAVE_ARCH_HUGE_PTEP_SET_WRPROTECT
  42. extern void huge_ptep_set_wrprotect(struct mm_struct *mm,
  43. unsigned long addr, pte_t *ptep);
  44. #define __HAVE_ARCH_HUGE_PTEP_CLEAR_FLUSH
  45. extern pte_t huge_ptep_clear_flush(struct vm_area_struct *vma,
  46. unsigned long addr, pte_t *ptep);
  47. #define __HAVE_ARCH_HUGE_PTE_CLEAR
  48. extern void huge_pte_clear(struct mm_struct *mm, unsigned long addr,
  49. pte_t *ptep, unsigned long sz);
  50. #define __HAVE_ARCH_HUGE_PTEP_GET
  51. extern pte_t huge_ptep_get(struct mm_struct *mm, unsigned long addr, pte_t *ptep);
  52. #define huge_ptep_modify_prot_start huge_ptep_modify_prot_start
  53. extern pte_t huge_ptep_modify_prot_start(struct vm_area_struct *vma,
  54. unsigned long addr, pte_t *ptep);
  55. #define huge_ptep_modify_prot_commit huge_ptep_modify_prot_commit
  56. extern void huge_ptep_modify_prot_commit(struct vm_area_struct *vma,
  57. unsigned long addr, pte_t *ptep,
  58. pte_t old_pte, pte_t new_pte);
  59. #include <asm-generic/hugetlb.h>
  60. static inline void __flush_hugetlb_tlb_range(struct vm_area_struct *vma,
  61. unsigned long start,
  62. unsigned long end,
  63. unsigned long stride,
  64. bool last_level)
  65. {
  66. switch (stride) {
  67. #ifndef __PAGETABLE_PMD_FOLDED
  68. case PUD_SIZE:
  69. __flush_tlb_range(vma, start, end, PUD_SIZE, last_level, 1);
  70. break;
  71. #endif
  72. case CONT_PMD_SIZE:
  73. case PMD_SIZE:
  74. __flush_tlb_range(vma, start, end, PMD_SIZE, last_level, 2);
  75. break;
  76. case CONT_PTE_SIZE:
  77. __flush_tlb_range(vma, start, end, PAGE_SIZE, last_level, 3);
  78. break;
  79. default:
  80. __flush_tlb_range(vma, start, end, PAGE_SIZE, last_level, TLBI_TTL_UNKNOWN);
  81. }
  82. }
  83. #define __HAVE_ARCH_FLUSH_HUGETLB_TLB_RANGE
  84. static inline void flush_hugetlb_tlb_range(struct vm_area_struct *vma,
  85. unsigned long start,
  86. unsigned long end)
  87. {
  88. unsigned long stride = huge_page_size(hstate_vma(vma));
  89. __flush_hugetlb_tlb_range(vma, start, end, stride, false);
  90. }
  91. #endif /* __ASM_HUGETLB_H */