]> git.baikalelectronics.ru Git - kernel.git/commitdiff
powerpc/mm: Enable compound page check for both THP and HugeTLB
authorAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Wed, 3 Feb 2021 04:58:10 +0000 (10:28 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 11 Feb 2021 12:35:06 +0000 (23:35 +1100)
THP config results in compound pages. Make sure the kernel enables
the PageCompound() check with CONFIG_HUGETLB_PAGE disabled and
CONFIG_TRANSPARENT_HUGEPAGE enabled.

This makes sure we correctly flush the icache with THP pages.
flush_dcache_icache_page only matter for platforms that don't support
COHERENT_ICACHE.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210203045812.234439-1-aneesh.kumar@linux.ibm.com
arch/powerpc/include/asm/hugetlb.h
arch/powerpc/mm/hugetlbpage.c
arch/powerpc/mm/mem.c

index 013165e6261861591d778833979f45807a8af514..f18c543bc01de36adee0ddc670d19cc0aac75b0f 100644 (file)
@@ -17,8 +17,6 @@ extern bool hugetlb_disabled;
 
 void hugetlbpage_init_default(void);
 
-void flush_dcache_icache_hugepage(struct page *page);
-
 int slice_is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
                           unsigned long len);
 
index 4e7d9b91f1da7584ada00ed3775d5fd8a6a7b863..d142b76d507d5c765b23df5f79a5734715519d2a 100644 (file)
@@ -663,24 +663,6 @@ static int __init hugetlbpage_init(void)
 
 arch_initcall(hugetlbpage_init);
 
-void flush_dcache_icache_hugepage(struct page *page)
-{
-       int i;
-       void *start;
-
-       BUG_ON(!PageCompound(page));
-
-       for (i = 0; i < compound_nr(page); i++) {
-               if (!PageHighMem(page)) {
-                       __flush_dcache_icache(page_address(page+i));
-               } else {
-                       start = kmap_atomic(page+i);
-                       __flush_dcache_icache(start);
-                       kunmap_atomic(start);
-               }
-       }
-}
-
 void __init gigantic_hugetlb_cma_reserve(void)
 {
        unsigned long order = 0;
index afab328d088740fdbe454d4f9d53737fea1371c0..ed64ca80d5fdd12637bc66aa1326515b9e9e4128 100644 (file)
@@ -494,14 +494,30 @@ void flush_dcache_page(struct page *page)
 }
 EXPORT_SYMBOL(flush_dcache_page);
 
-void flush_dcache_icache_page(struct page *page)
+static void flush_dcache_icache_hugepage(struct page *page)
 {
-#ifdef CONFIG_HUGETLB_PAGE
-       if (PageCompound(page)) {
-               flush_dcache_icache_hugepage(page);
-               return;
+       int i;
+       void *start;
+
+       BUG_ON(!PageCompound(page));
+
+       for (i = 0; i < compound_nr(page); i++) {
+               if (!PageHighMem(page)) {
+                       __flush_dcache_icache(page_address(page+i));
+               } else {
+                       start = kmap_atomic(page+i);
+                       __flush_dcache_icache(start);
+                       kunmap_atomic(start);
+               }
        }
-#endif
+}
+
+void flush_dcache_icache_page(struct page *page)
+{
+
+       if (PageCompound(page))
+               return flush_dcache_icache_hugepage(page);
+
 #if defined(CONFIG_PPC_8xx) || defined(CONFIG_PPC64)
        /* On 8xx there is no need to kmap since highmem is not supported */
        __flush_dcache_icache(page_address(page));