For performance issue. And add a sysctl interface to close this feature. Signed-off-by: Wang Wensheng <wangwensheng4@huawei.com> Signed-off-by: Yin Tirui <yintirui@huawei.com> --- include/linux/share_pool.h | 11 +++++++++++ mm/hugetlb.c | 3 ++- mm/share_pool.c | 13 ++++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/include/linux/share_pool.h b/include/linux/share_pool.h index 4102d0dcf25b..f4554f6934ae 100644 --- a/include/linux/share_pool.h +++ b/include/linux/share_pool.h @@ -199,6 +199,12 @@ static inline bool sp_check_vm_share_pool(unsigned long vm_flags) return sp_is_enabled() && (vm_flags & VM_SHARE_POOL); } +extern int sysctl_sp_skip_clear_huge_page; +static inline bool sp_skip_clear_huge_page(unsigned long vm_flags) +{ + return sp_check_vm_share_pool(vm_flags) && sysctl_sp_skip_clear_huge_page; +} + static inline void sp_init_mm(struct mm_struct *mm) { mm->sp_group_master = NULL; @@ -267,6 +273,11 @@ static inline void sp_area_drop(struct vm_area_struct *vma) { } +static inline bool sp_skip_clear_huge_page(unsigned long vm_flags) +{ + return false; +} + static inline void sp_init_mm(struct mm_struct *mm) { } diff --git a/mm/hugetlb.c b/mm/hugetlb.c index f28edc6ff6a5..0070a86d52f5 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -6919,7 +6919,8 @@ static vm_fault_t hugetlb_no_page(struct mm_struct *mm, goto out; } - clear_huge_page(&folio->page, address, pages_per_huge_page(h)); + if (!sp_skip_clear_huge_page(vma->vm_flags)) + clear_huge_page(&folio->page, address, pages_per_huge_page(h)); __folio_mark_uptodate(folio); new_folio = true; diff --git a/mm/share_pool.c b/mm/share_pool.c index ed41f0616a6e..7e7127e38962 100644 --- a/mm/share_pool.c +++ b/mm/share_pool.c @@ -71,6 +71,7 @@ #define NS2US(ns) ((ns) / 1000) static int sysctl_sp_dump_enable = 1; +int sysctl_sp_skip_clear_huge_page = 1; static int system_group_count; @@ -1688,7 +1689,8 @@ static bool sp_area_prepare_pages(struct sp_area *spa, int nid, nodemask_t *node kvfree(pages); return false; } - memset(page_to_virt(pages[i]), 0, spa_page_size(spa)); + if (!sysctl_sp_skip_clear_huge_page) + memset(page_to_virt(pages[i]), 0, spa_page_size(spa)); } spa->pages = pages; @@ -4290,6 +4292,15 @@ static struct ctl_table sp_ctl_table[] = { .extra1 = SYSCTL_ZERO, .extra2 = SYSCTL_ONE, }, + { + .procname = "sharepool_skip_clear_huge_page", + .data = &sysctl_sp_skip_clear_huge_page, + .maxlen = sizeof(sysctl_sp_skip_clear_huge_page), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = SYSCTL_ZERO, + .extra2 = SYSCTL_ONE, + }, }; static int __init share_pool_init(void) -- 2.43.0