Commit c7ba2d63 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman

powerpc/mm: Enable compound page check for both THP and HugeTLB

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: default avatarAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210203045812.234439-1-aneesh.kumar@linux.ibm.com
parent c9df3f80
...@@ -17,8 +17,6 @@ extern bool hugetlb_disabled; ...@@ -17,8 +17,6 @@ extern bool hugetlb_disabled;
void hugetlbpage_init_default(void); 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, int slice_is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
unsigned long len); unsigned long len);
......
...@@ -663,24 +663,6 @@ static int __init hugetlbpage_init(void) ...@@ -663,24 +663,6 @@ static int __init hugetlbpage_init(void)
arch_initcall(hugetlbpage_init); 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) void __init gigantic_hugetlb_cma_reserve(void)
{ {
unsigned long order = 0; unsigned long order = 0;
......
...@@ -494,14 +494,30 @@ void flush_dcache_page(struct page *page) ...@@ -494,14 +494,30 @@ void flush_dcache_page(struct page *page)
} }
EXPORT_SYMBOL(flush_dcache_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 int i;
if (PageCompound(page)) { void *start;
flush_dcache_icache_hugepage(page);
return; 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) #if defined(CONFIG_PPC_8xx) || defined(CONFIG_PPC64)
/* On 8xx there is no need to kmap since highmem is not supported */ /* On 8xx there is no need to kmap since highmem is not supported */
__flush_dcache_icache(page_address(page)); __flush_dcache_icache(page_address(page));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment