Hi Matthew,

On Wed, Aug 02, 2023 at 04:13:49PM +0100, Matthew Wilcox (Oracle) wrote:
> Add set_ptes(), update_mmu_cache_range() and flush_dcache_folio().
> Change the PG_arch_1 (aka PG_dcache_dirty) flag from being per-page to
> per-folio.
> 
> Signed-off-by: Matthew Wilcox (Oracle) <wi...@infradead.org>
> Acked-by: Mike Rapoport (IBM) <r...@kernel.org>
> Cc: Michael Ellerman <m...@ellerman.id.au>
> Cc: Nicholas Piggin <npig...@gmail.com>
> Cc: Christophe Leroy <christophe.le...@csgroup.eu>
> Cc: linuxppc-dev@lists.ozlabs.org
...
> diff --git a/arch/powerpc/include/asm/kvm_ppc.h 
> b/arch/powerpc/include/asm/kvm_ppc.h
> index d16d80ad2ae4..b4da8514af43 100644
> --- a/arch/powerpc/include/asm/kvm_ppc.h
> +++ b/arch/powerpc/include/asm/kvm_ppc.h
> @@ -894,7 +894,7 @@ void kvmppc_init_lpid(unsigned long nr_lpids);
>  
>  static inline void kvmppc_mmu_flush_icache(kvm_pfn_t pfn)
>  {
> -     struct page *page;
> +     struct folio *folio;
>       /*
>        * We can only access pages that the kernel maps
>        * as memory. Bail out for unmapped ones.
> @@ -903,10 +903,10 @@ static inline void kvmppc_mmu_flush_icache(kvm_pfn_t 
> pfn)
>               return;
>  
>       /* Clear i-cache for new pages */
> -     page = pfn_to_page(pfn);
> -     if (!test_bit(PG_dcache_clean, &page->flags)) {
> -             flush_dcache_icache_page(page);
> -             set_bit(PG_dcache_clean, &page->flags);
> +     folio = page_folio(pfn_to_page(pfn));
> +     if (!test_bit(PG_dcache_clean, &folio->flags)) {
> +             flush_dcache_icache_folio(folio);
> +             set_bit(PG_dcache_clean, &folio->flags);
>       }
>  }
...
> diff --git a/arch/powerpc/mm/cacheflush.c b/arch/powerpc/mm/cacheflush.c
> index 0e9b4879c0f9..8760d2223abe 100644
> --- a/arch/powerpc/mm/cacheflush.c
> +++ b/arch/powerpc/mm/cacheflush.c
> @@ -148,44 +148,30 @@ static void __flush_dcache_icache(void *p)
>       invalidate_icache_range(addr, addr + PAGE_SIZE);
>  }
>  
> -static void flush_dcache_icache_hugepage(struct page *page)
> +void flush_dcache_icache_folio(struct folio *folio)
>  {
> -     int i;
> -     int nr = compound_nr(page);
> +     unsigned int i, nr = folio_nr_pages(folio);
>  
> -     if (!PageHighMem(page)) {
> +     if (flush_coherent_icache())
> +             return;
> +
> +     if (!folio_test_highmem(folio)) {
> +             void *addr = folio_address(folio);
>               for (i = 0; i < nr; i++)
> -                     __flush_dcache_icache(lowmem_page_address(page + i));
> -     } else {
> +                     __flush_dcache_icache(addr + i * PAGE_SIZE);
> +     } else if (IS_ENABLED(CONFIG_BOOKE) || sizeof(phys_addr_t) > 
> sizeof(void *)) {
>               for (i = 0; i < nr; i++) {
> -                     void *start = kmap_local_page(page + i);
> +                     void *start = kmap_local_folio(folio, i * PAGE_SIZE);
>  
>                       __flush_dcache_icache(start);
>                       kunmap_local(start);
>               }
> -     }
> -}
> -
> -void flush_dcache_icache_page(struct page *page)
> -{
> -     if (flush_coherent_icache())
> -             return;
> -
> -     if (PageCompound(page))
> -             return flush_dcache_icache_hugepage(page);
> -
> -     if (!PageHighMem(page)) {
> -             __flush_dcache_icache(lowmem_page_address(page));
> -     } else if (IS_ENABLED(CONFIG_BOOKE) || sizeof(phys_addr_t) > 
> sizeof(void *)) {
> -             void *start = kmap_local_page(page);
> -
> -             __flush_dcache_icache(start);
> -             kunmap_local(start);
>       } else {
> -             flush_dcache_icache_phys(page_to_phys(page));
> +             unsigned long pfn = folio_pfn(folio);
> +             for (i = 0; i < nr; i++)
> +                     flush_dcache_icache_phys((pfn + i) * PAGE_SIZE);
>       }
>  }
> -EXPORT_SYMBOL(flush_dcache_icache_page);

Apologies if this has already been fixed or reported, I searched lore
and did not find anything. The dropping of this export in combination
with the conversion above appears to cause ARCH=powerpc allmodconfig to
fail with:

  ERROR: modpost: "flush_dcache_icache_folio" [arch/powerpc/kvm/kvm-pr.ko] 
undefined!

I don't know if this should be re-exported or not but that does
obviously resolve the issue.

Cheers,
Nathan

Reply via email to