Message ID | 20220613063512.17540-2-songmuchun@bytedance.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Simplify hugetlb vmemmap and improve its readability | expand |
On Mon, Jun 13, 2022 at 02:35:07PM +0800, Muchun Song wrote: > The name hugetlb_optimize_vmemmap_enabled() a bit confusing as it tests > two conditions (enabled and pages in use). Instead of coming up to > an appropriate name, we could just delete it. There is already a > discussion about deleting it in thread [1]. > > There is only one user of hugetlb_optimize_vmemmap_enabled() outside of > hugetlb_vmemmap, that is flush_dcache_page() in arch/arm64/mm/flush.c. > However, it does not need to call hugetlb_optimize_vmemmap_enabled() > in flush_dcache_page() since HugeTLB pages are always fully mapped and > only head page will be set PG_dcache_clean meaning only head page's flag > may need to be cleared (see commit cf5a501d985b). So it is easy to > remove hugetlb_optimize_vmemmap_enabled(). > > Link: https://lore.kernel.org/all/c77c61c8-8a5a-87e8-db89-d04d8aaab4cc@oracle.com/ [1] > Signed-off-by: Muchun Song <songmuchun@bytedance.com> > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Will Deacon <will@kernel.org> > Cc: Anshuman Khandual <anshuman.khandual@arm.com> Reviewed-by: Oscar Salvador <osalvador@suse.de>
On Mon, Jun 13, 2022 at 02:35:07PM +0800”, Muchun Song wrote: > The name hugetlb_optimize_vmemmap_enabled() a bit confusing as it tests > two conditions (enabled and pages in use). Instead of coming up to > an appropriate name, we could just delete it. There is already a > discussion about deleting it in thread [1]. > > There is only one user of hugetlb_optimize_vmemmap_enabled() outside of > hugetlb_vmemmap, that is flush_dcache_page() in arch/arm64/mm/flush.c. > However, it does not need to call hugetlb_optimize_vmemmap_enabled() > in flush_dcache_page() since HugeTLB pages are always fully mapped and > only head page will be set PG_dcache_clean meaning only head page's flag > may need to be cleared (see commit cf5a501d985b). So it is easy to > remove hugetlb_optimize_vmemmap_enabled(). > > Link: https://lore.kernel.org/all/c77c61c8-8a5a-87e8-db89-d04d8aaab4cc@oracle.com/ [1] > Signed-off-by: Muchun Song <songmuchun@bytedance.com> > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Will Deacon <will@kernel.org> > Cc: Anshuman Khandual <anshuman.khandual@arm.com> > --- > arch/arm64/mm/flush.c | 13 +++---------- > include/linux/page-flags.h | 14 ++------------ > 2 files changed, 5 insertions(+), 22 deletions(-) Thanks. I think this makes the code less confusing. Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
On Mon, Jun 13, 2022 at 02:35:07PM +0800, Muchun Song wrote: > The name hugetlb_optimize_vmemmap_enabled() a bit confusing as it tests > two conditions (enabled and pages in use). Instead of coming up to > an appropriate name, we could just delete it. There is already a > discussion about deleting it in thread [1]. > > There is only one user of hugetlb_optimize_vmemmap_enabled() outside of > hugetlb_vmemmap, that is flush_dcache_page() in arch/arm64/mm/flush.c. > However, it does not need to call hugetlb_optimize_vmemmap_enabled() > in flush_dcache_page() since HugeTLB pages are always fully mapped and > only head page will be set PG_dcache_clean meaning only head page's flag > may need to be cleared (see commit cf5a501d985b). So it is easy to > remove hugetlb_optimize_vmemmap_enabled(). > > Link: https://lore.kernel.org/all/c77c61c8-8a5a-87e8-db89-d04d8aaab4cc@oracle.com/ [1] > Signed-off-by: Muchun Song <songmuchun@bytedance.com> > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Will Deacon <will@kernel.org> > Cc: Anshuman Khandual <anshuman.khandual@arm.com> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
diff --git a/arch/arm64/mm/flush.c b/arch/arm64/mm/flush.c index fc4f710e9820..5f9379b3c8c8 100644 --- a/arch/arm64/mm/flush.c +++ b/arch/arm64/mm/flush.c @@ -76,17 +76,10 @@ EXPORT_SYMBOL_GPL(__sync_icache_dcache); void flush_dcache_page(struct page *page) { /* - * Only the head page's flags of HugeTLB can be cleared since the tail - * vmemmap pages associated with each HugeTLB page are mapped with - * read-only when CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP is enabled (more - * details can refer to vmemmap_remap_pte()). Although - * __sync_icache_dcache() only set PG_dcache_clean flag on the head - * page struct, there is more than one page struct with PG_dcache_clean - * associated with the HugeTLB page since the head vmemmap page frame - * is reused (more details can refer to the comments above - * page_fixed_fake_head()). + * HugeTLB pages are always fully mapped and only head page will be + * set PG_dcache_clean (see comments in __sync_icache_dcache()). */ - if (hugetlb_optimize_vmemmap_enabled() && PageHuge(page)) + if (PageHuge(page)) page = compound_head(page); if (test_bit(PG_dcache_clean, &page->flags)) diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index de80f0c26b2f..b8b992cb201c 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -203,12 +203,6 @@ enum pageflags { DECLARE_STATIC_KEY_MAYBE(CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON, hugetlb_optimize_vmemmap_key); -static __always_inline bool hugetlb_optimize_vmemmap_enabled(void) -{ - return static_branch_maybe(CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON, - &hugetlb_optimize_vmemmap_key); -} - /* * If the feature of optimizing vmemmap pages associated with each HugeTLB * page is enabled, the head vmemmap page frame is reused and all of the tail @@ -227,7 +221,8 @@ static __always_inline bool hugetlb_optimize_vmemmap_enabled(void) */ static __always_inline const struct page *page_fixed_fake_head(const struct page *page) { - if (!hugetlb_optimize_vmemmap_enabled()) + if (!static_branch_maybe(CONFIG_HUGETLB_PAGE_OPTIMIZE_VMEMMAP_DEFAULT_ON, + &hugetlb_optimize_vmemmap_key)) return page; /* @@ -255,11 +250,6 @@ static inline const struct page *page_fixed_fake_head(const struct page *page) { return page; } - -static inline bool hugetlb_optimize_vmemmap_enabled(void) -{ - return false; -} #endif static __always_inline int page_is_fake_head(struct page *page)
The name hugetlb_optimize_vmemmap_enabled() a bit confusing as it tests two conditions (enabled and pages in use). Instead of coming up to an appropriate name, we could just delete it. There is already a discussion about deleting it in thread [1]. There is only one user of hugetlb_optimize_vmemmap_enabled() outside of hugetlb_vmemmap, that is flush_dcache_page() in arch/arm64/mm/flush.c. However, it does not need to call hugetlb_optimize_vmemmap_enabled() in flush_dcache_page() since HugeTLB pages are always fully mapped and only head page will be set PG_dcache_clean meaning only head page's flag may need to be cleared (see commit cf5a501d985b). So it is easy to remove hugetlb_optimize_vmemmap_enabled(). Link: https://lore.kernel.org/all/c77c61c8-8a5a-87e8-db89-d04d8aaab4cc@oracle.com/ [1] Signed-off-by: Muchun Song <songmuchun@bytedance.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Will Deacon <will@kernel.org> Cc: Anshuman Khandual <anshuman.khandual@arm.com> --- arch/arm64/mm/flush.c | 13 +++---------- include/linux/page-flags.h | 14 ++------------ 2 files changed, 5 insertions(+), 22 deletions(-)