From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5B43BC433F5 for ; Wed, 2 Mar 2022 21:25:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A37278D0002; Wed, 2 Mar 2022 16:25:50 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 9BFE28D0001; Wed, 2 Mar 2022 16:25:50 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 839E58D0002; Wed, 2 Mar 2022 16:25:50 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0022.hostedemail.com [216.40.44.22]) by kanga.kvack.org (Postfix) with ESMTP id 6F1A18D0001 for ; Wed, 2 Mar 2022 16:25:50 -0500 (EST) Received: from smtpin28.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 34A00A0FB9 for ; Wed, 2 Mar 2022 21:25:50 +0000 (UTC) X-FDA: 79200728460.28.B1F09C4 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by imf09.hostedemail.com (Postfix) with ESMTP id C74E4140009 for ; Wed, 2 Mar 2022 21:25:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Sender:In-Reply-To:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=lVF6m9QgZUAbOU/dXdGrVqsI+ZX3uNFQUVqEhiINOzw=; b=FZp4wIVLOfMGHVp9iDtJ2OT31l Oab4IOVWSCP+7godZvjIarWYkI3Esxn1Q7pNYAkEWk+tNQmpoHaUXZ9NNdAL0+vXN7JNzCpz0Asu0 FVmJ5PzKyAg2XDlQIOlzvWwZLsfpMwhTqbYcTnx6h0/v9ACVnvBbMorjmMYWzz3xVYfSwQP+vAurD Ncegd6WOpALK14VFITyDKZ49XxDT5THrPkR35tTWT0gqTqZTXQm9YcC4joB6bBtDNt+6H+3O/d35k XXUCxQvxJNqKC/zFEha6pvzFrvJt+SoKBp1OLDuO1EsknCnVzaFwMUOJh3O6JmAcosjo4kok26CVL R7gi7ZrQ==; Received: from mcgrof by bombadil.infradead.org with local (Exim 4.94.2 #2 (Red Hat Linux)) id 1nPWTg-004IP1-He; Wed, 02 Mar 2022 21:25:44 +0000 Date: Wed, 2 Mar 2022 13:25:44 -0800 From: Luis Chamberlain To: Muchun Song Cc: corbet@lwn.net, mike.kravetz@oracle.com, akpm@linux-foundation.org, keescook@chromium.org, yzaikin@google.com, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, duanxiongchun@bytedance.com, smuchun@gmail.com, Adam Manzanares , Davidlohr Bueso Subject: Re: [PATCH v2 3/3] mm: hugetlb: add hugetlb_free_vmemmap sysctl Message-ID: References: <20220302083758.32528-1-songmuchun@bytedance.com> <20220302083758.32528-4-songmuchun@bytedance.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220302083758.32528-4-songmuchun@bytedance.com> X-Rspamd-Queue-Id: C74E4140009 X-Stat-Signature: 5jctqsbibbte5ipfxh5etu6dds4wz3hf X-Rspam-User: Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=infradead.org header.s=bombadil.20210309 header.b=FZp4wIVL; dmarc=fail reason="No valid SPF, DKIM not aligned (relaxed)" header.from=kernel.org (policy=none); spf=none (imf09.hostedemail.com: domain of mcgrof@infradead.org has no SPF policy when checking 198.137.202.133) smtp.mailfrom=mcgrof@infradead.org X-Rspamd-Server: rspam03 X-HE-Tag: 1646256349-317149 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Wed, Mar 02, 2022 at 04:37:58PM +0800, Muchun Song wrote: > We must add "hugetlb_free_vmemmap=on" to boot cmdline and reboot the > server to enable the feature of freeing vmemmap pages of HugeTLB > pages. Rebooting usually taske a long time. Add a sysctl to enable > the feature at runtime and do not need to reboot. > > Signed-off-by: Muchun Song > --- > Documentation/admin-guide/sysctl/vm.rst | 13 ++++++++++ > include/linux/memory_hotplug.h | 9 +++++++ > mm/hugetlb_vmemmap.c | 42 ++++++++++++++++++++++++++++----- > mm/hugetlb_vmemmap.h | 4 +++- > mm/memory_hotplug.c | 5 ++++ > 5 files changed, 66 insertions(+), 7 deletions(-) > > diff --git a/Documentation/admin-guide/sysctl/vm.rst b/Documentation/admin-guide/sysctl/vm.rst > index f4804ce37c58..01f18e6cc227 100644 > --- a/Documentation/admin-guide/sysctl/vm.rst > +++ b/Documentation/admin-guide/sysctl/vm.rst > @@ -561,6 +561,19 @@ Change the minimum size of the hugepage pool. > See Documentation/admin-guide/mm/hugetlbpage.rst > > > +hugetlb_free_vmemmap > +==================== > + > +A toggle value indicating if vmemmap pages are allowed to be optimized. > +If it is off (0), then it can be set true (1). Once true, the vmemmap > +pages associated with each HugeTLB page will be optimized, and the toggle > +cannot be set back to false. It only optimizes the subsequent allocation > +of HugeTLB pages from buddy system, while already allocated HugeTLB pages > +will not be optimized. The commit log or documentation does not descrie why its safe to toggle one way and not the other? Luis > + > +See Documentation/admin-guide/mm/hugetlbpage.rst > + > + > nr_hugepages_mempolicy > ====================== > > diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h > index e0b2209ab71c..20d7edf62a6a 100644 > --- a/include/linux/memory_hotplug.h > +++ b/include/linux/memory_hotplug.h > @@ -351,4 +351,13 @@ void arch_remove_linear_mapping(u64 start, u64 size); > extern bool mhp_supports_memmap_on_memory(unsigned long size); > #endif /* CONFIG_MEMORY_HOTPLUG */ > > +#ifdef CONFIG_MHP_MEMMAP_ON_MEMORY > +bool mhp_memmap_on_memory(void); > +#else > +static inline bool mhp_memmap_on_memory(void) > +{ > + return false; > +} > +#endif > + > #endif /* __LINUX_MEMORY_HOTPLUG_H */ > diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c > index 836d1117f08b..3bcc8f25bd50 100644 > --- a/mm/hugetlb_vmemmap.c > +++ b/mm/hugetlb_vmemmap.c > @@ -10,6 +10,7 @@ > > #define pr_fmt(fmt) "HugeTLB: " fmt > > +#include > #include "hugetlb_vmemmap.h" > > /* > @@ -118,17 +119,14 @@ void __init hugetlb_vmemmap_init(struct hstate *h) > BUILD_BUG_ON(__NR_USED_SUBPAGE >= > RESERVE_VMEMMAP_SIZE / sizeof(struct page)); > > - if (!hugetlb_free_vmemmap_enabled()) > - return; > - > - if (IS_ENABLED(CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON) && > - !is_power_of_2(sizeof(struct page))) { > + if (!is_power_of_2(sizeof(struct page))) { > /* > * The hugetlb_free_vmemmap_enabled_key can be enabled when > * CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON. It should > * be disabled if "struct page" crosses page boundaries. > */ > - static_branch_disable(&hugetlb_free_vmemmap_enabled_key); > + if (IS_ENABLED(CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON)) > + static_branch_disable(&hugetlb_free_vmemmap_enabled_key); > return; > } > > @@ -147,3 +145,35 @@ void __init hugetlb_vmemmap_init(struct hstate *h) > pr_info("can free %d vmemmap pages for %s\n", h->nr_free_vmemmap_pages, > h->name); > } > + > +static struct ctl_table hugetlb_vmemmap_sysctls[] = { > + { > + .procname = "hugetlb_free_vmemmap", > + .data = &hugetlb_free_vmemmap_enabled_key.key, > + .mode = 0644, > + /* only handle a transition from default "0" to "1" */ > + .proc_handler = proc_do_static_key, > + .extra1 = SYSCTL_ONE, > + .extra2 = SYSCTL_ONE, > + }, > + { } > +}; > + > +static __init int hugetlb_vmemmap_sysctls_init(void) > +{ > + /* > + * The vmemmap pages cannot be optimized if > + * "memory_hotplug.memmap_on_memory" is enabled unless > + * "hugetlb_free_vmemmap" is enabled as well since > + * "hugetlb_free_vmemmap" takes precedence over > + * "memory_hotplug.memmap_on_memory". > + */ > + if (mhp_memmap_on_memory() && !hugetlb_free_vmemmap_enabled()) > + return 0; > + > + if (is_power_of_2(sizeof(struct page))) > + register_sysctl_init("vm", hugetlb_vmemmap_sysctls); > + > + return 0; > +} > +late_initcall(hugetlb_vmemmap_sysctls_init); > diff --git a/mm/hugetlb_vmemmap.h b/mm/hugetlb_vmemmap.h > index cb2bef8f9e73..b67a159027f4 100644 > --- a/mm/hugetlb_vmemmap.h > +++ b/mm/hugetlb_vmemmap.h > @@ -21,7 +21,9 @@ void hugetlb_vmemmap_init(struct hstate *h); > */ > static inline unsigned int free_vmemmap_pages_per_hpage(struct hstate *h) > { > - return h->nr_free_vmemmap_pages; > + if (hugetlb_free_vmemmap_enabled()) > + return h->nr_free_vmemmap_pages; > + return 0; > } > #else > static inline int alloc_huge_page_vmemmap(struct hstate *h, struct page *head) > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index c226a337c1ef..c2115e566abc 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -50,6 +50,11 @@ static bool memmap_on_memory __ro_after_init; > #ifdef CONFIG_MHP_MEMMAP_ON_MEMORY > module_param(memmap_on_memory, bool, 0444); > MODULE_PARM_DESC(memmap_on_memory, "Enable memmap on memory for memory hotplug"); > + > +bool mhp_memmap_on_memory(void) > +{ > + return memmap_on_memory; > +} > #endif > > enum { > -- > 2.11.0 >