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: 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
This commit is contained in:
Родитель
c9df3f809c
Коммит
c7ba2d6363
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -494,14 +494,30 @@ void flush_dcache_page(struct page *page)
|
|||
}
|
||||
EXPORT_SYMBOL(flush_dcache_page);
|
||||
|
||||
static 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 flush_dcache_icache_page(struct page *page)
|
||||
{
|
||||
#ifdef CONFIG_HUGETLB_PAGE
|
||||
if (PageCompound(page)) {
|
||||
flush_dcache_icache_hugepage(page);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
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));
|
||||
|
|
Загрузка…
Ссылка в новой задаче