hugetlb_vmemmap.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * HugeTLB Vmemmap Optimization (HVO)
  4. *
  5. * Copyright (c) 2020, ByteDance. All rights reserved.
  6. *
  7. * Author: Muchun Song <songmuchun@bytedance.com>
  8. */
  9. #ifndef _LINUX_HUGETLB_VMEMMAP_H
  10. #define _LINUX_HUGETLB_VMEMMAP_H
  11. #include <linux/hugetlb.h>
  12. /*
  13. * Reserve one vmemmap page, all vmemmap addresses are mapped to it. See
  14. * Documentation/mm/vmemmap_dedup.rst.
  15. */
  16. #define HUGETLB_VMEMMAP_RESERVE_SIZE PAGE_SIZE
  17. #define HUGETLB_VMEMMAP_RESERVE_PAGES (HUGETLB_VMEMMAP_RESERVE_SIZE / sizeof(struct page))
  18. #ifdef CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP
  19. int hugetlb_vmemmap_restore_folio(const struct hstate *h, struct folio *folio);
  20. long hugetlb_vmemmap_restore_folios(const struct hstate *h,
  21. struct list_head *folio_list,
  22. struct list_head *non_hvo_folios);
  23. void hugetlb_vmemmap_optimize_folio(const struct hstate *h, struct folio *folio);
  24. void hugetlb_vmemmap_optimize_folios(struct hstate *h, struct list_head *folio_list);
  25. static inline unsigned int hugetlb_vmemmap_size(const struct hstate *h)
  26. {
  27. return pages_per_huge_page(h) * sizeof(struct page);
  28. }
  29. /*
  30. * Return how many vmemmap size associated with a HugeTLB page that can be
  31. * optimized and can be freed to the buddy allocator.
  32. */
  33. static inline unsigned int hugetlb_vmemmap_optimizable_size(const struct hstate *h)
  34. {
  35. int size = hugetlb_vmemmap_size(h) - HUGETLB_VMEMMAP_RESERVE_SIZE;
  36. if (!is_power_of_2(sizeof(struct page)))
  37. return 0;
  38. return size > 0 ? size : 0;
  39. }
  40. #else
  41. static inline int hugetlb_vmemmap_restore_folio(const struct hstate *h, struct folio *folio)
  42. {
  43. return 0;
  44. }
  45. static long hugetlb_vmemmap_restore_folios(const struct hstate *h,
  46. struct list_head *folio_list,
  47. struct list_head *non_hvo_folios)
  48. {
  49. list_splice_init(folio_list, non_hvo_folios);
  50. return 0;
  51. }
  52. static inline void hugetlb_vmemmap_optimize_folio(const struct hstate *h, struct folio *folio)
  53. {
  54. }
  55. static inline void hugetlb_vmemmap_optimize_folios(struct hstate *h, struct list_head *folio_list)
  56. {
  57. }
  58. static inline unsigned int hugetlb_vmemmap_optimizable_size(const struct hstate *h)
  59. {
  60. return 0;
  61. }
  62. #endif /* CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP */
  63. static inline bool hugetlb_vmemmap_optimizable(const struct hstate *h)
  64. {
  65. return hugetlb_vmemmap_optimizable_size(h) != 0;
  66. }
  67. #endif /* _LINUX_HUGETLB_VMEMMAP_H */