On Wed, Jan 14, 2026 at 01:45:23PM +0000, Kalyazin, Nikita wrote:
> From: Nikita Kalyazin <[email protected]>
>
> These allow guest_memfd to remove its memory from the direct map.
> Only implement them for architectures that have direct map.
> In folio_zap_direct_map(), flush TLB on architectures where
> set_direct_map_valid_noflush() does not flush it internally.
...
> diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c
> index d3ce04a4b248..df4a487b484d 100644
> --- a/arch/s390/mm/pageattr.c
> +++ b/arch/s390/mm/pageattr.c
> @@ -412,6 +412,24 @@ int set_direct_map_valid_noflush(struct page *page,
> unsigned nr, bool valid)
> return __set_memory((unsigned long)page_to_virt(page), nr, flags);
> }
>
> +int folio_zap_direct_map(struct folio *folio)
> +{
> + unsigned long addr = (unsigned long)folio_address(folio);
> + int ret;
> +
> + ret = set_direct_map_valid_noflush(folio_page(folio, 0),
> + folio_nr_pages(folio), false);
> + flush_tlb_kernel_range(addr, addr + folio_size(folio));
> +
> + return ret;
> +}
The instructions used in the s390 implementation of
set_direct_map_valid_noflush() do flush TLB entries.
The extra flush_tlb_kernel_range() is not required.