brintos

brintos / linux-shallow public Read only

0
0
Text · 2.3 KiB · 2fcae92 Raw
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