78 lines · c
1// SPDX-License-Identifier: GPL-2.02/*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_H10#define _LINUX_HUGETLB_VMEMMAP_H11#include <linux/hugetlb.h>12 13/*14 * Reserve one vmemmap page, all vmemmap addresses are mapped to it. See15 * Documentation/mm/vmemmap_dedup.rst.16 */17#define HUGETLB_VMEMMAP_RESERVE_SIZE PAGE_SIZE18#define HUGETLB_VMEMMAP_RESERVE_PAGES (HUGETLB_VMEMMAP_RESERVE_SIZE / sizeof(struct page))19 20#ifdef CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP21int hugetlb_vmemmap_restore_folio(const struct hstate *h, struct folio *folio);22long hugetlb_vmemmap_restore_folios(const struct hstate *h,23 struct list_head *folio_list,24 struct list_head *non_hvo_folios);25void hugetlb_vmemmap_optimize_folio(const struct hstate *h, struct folio *folio);26void hugetlb_vmemmap_optimize_folios(struct hstate *h, struct list_head *folio_list);27 28static inline unsigned int hugetlb_vmemmap_size(const struct hstate *h)29{30 return pages_per_huge_page(h) * sizeof(struct page);31}32 33/*34 * Return how many vmemmap size associated with a HugeTLB page that can be35 * optimized and can be freed to the buddy allocator.36 */37static inline unsigned int hugetlb_vmemmap_optimizable_size(const struct hstate *h)38{39 int size = hugetlb_vmemmap_size(h) - HUGETLB_VMEMMAP_RESERVE_SIZE;40 41 if (!is_power_of_2(sizeof(struct page)))42 return 0;43 return size > 0 ? size : 0;44}45#else46static inline int hugetlb_vmemmap_restore_folio(const struct hstate *h, struct folio *folio)47{48 return 0;49}50 51static long hugetlb_vmemmap_restore_folios(const struct hstate *h,52 struct list_head *folio_list,53 struct list_head *non_hvo_folios)54{55 list_splice_init(folio_list, non_hvo_folios);56 return 0;57}58 59static inline void hugetlb_vmemmap_optimize_folio(const struct hstate *h, struct folio *folio)60{61}62 63static inline void hugetlb_vmemmap_optimize_folios(struct hstate *h, struct list_head *folio_list)64{65}66 67static inline unsigned int hugetlb_vmemmap_optimizable_size(const struct hstate *h)68{69 return 0;70}71#endif /* CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP */72 73static inline bool hugetlb_vmemmap_optimizable(const struct hstate *h)74{75 return hugetlb_vmemmap_optimizable_size(h) != 0;76}77#endif /* _LINUX_HUGETLB_VMEMMAP_H */78