pgalloc.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _ALPHA_PGALLOC_H
  3. #define _ALPHA_PGALLOC_H
  4. #include <linux/mm.h>
  5. #include <linux/mmzone.h>
  6. /*
  7. * Allocate and free page tables. The xxx_kernel() versions are
  8. * used to allocate a kernel page table - this turns on ASN bits
  9. * if any.
  10. */
  11. static inline void
  12. pmd_populate(struct mm_struct *mm, pmd_t *pmd, pgtable_t pte)
  13. {
  14. pmd_set(pmd, (pte_t *)(page_to_pa(pte) + PAGE_OFFSET));
  15. }
  16. #define pmd_pgtable(pmd) pmd_page(pmd)
  17. static inline void
  18. pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
  19. {
  20. pmd_set(pmd, pte);
  21. }
  22. static inline void
  23. pgd_populate(struct mm_struct *mm, pgd_t *pgd, pmd_t *pmd)
  24. {
  25. pgd_set(pgd, pmd);
  26. }
  27. extern pgd_t *pgd_alloc(struct mm_struct *mm);
  28. static inline void
  29. pgd_free(struct mm_struct *mm, pgd_t *pgd)
  30. {
  31. free_page((unsigned long)pgd);
  32. }
  33. static inline pmd_t *
  34. pmd_alloc_one(struct mm_struct *mm, unsigned long address)
  35. {
  36. pmd_t *ret = (pmd_t *)__get_free_page(GFP_KERNEL|__GFP_ZERO);
  37. return ret;
  38. }
  39. static inline void
  40. pmd_free(struct mm_struct *mm, pmd_t *pmd)
  41. {
  42. free_page((unsigned long)pmd);
  43. }
  44. static inline pte_t *
  45. pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
  46. {
  47. pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_ZERO);
  48. return pte;
  49. }
  50. static inline void
  51. pte_free_kernel(struct mm_struct *mm, pte_t *pte)
  52. {
  53. free_page((unsigned long)pte);
  54. }
  55. static inline pgtable_t
  56. pte_alloc_one(struct mm_struct *mm, unsigned long address)
  57. {
  58. pte_t *pte = pte_alloc_one_kernel(mm, address);
  59. struct page *page;
  60. if (!pte)
  61. return NULL;
  62. page = virt_to_page(pte);
  63. if (!pgtable_page_ctor(page)) {
  64. __free_page(page);
  65. return NULL;
  66. }
  67. return page;
  68. }
  69. static inline void
  70. pte_free(struct mm_struct *mm, pgtable_t page)
  71. {
  72. pgtable_page_dtor(page);
  73. __free_page(page);
  74. }
  75. #define check_pgt_cache() do { } while (0)
  76. #endif /* _ALPHA_PGALLOC_H */