@@ -29,9 +29,8 @@ void copy_user_highpage(struct page *to, struct page *from,
void copy_highpage(struct page *to, struct page *from);
#define __HAVE_ARCH_COPY_HIGHPAGE
-struct folio *vma_alloc_zeroed_movable_folio(struct vm_area_struct *vma,
- unsigned long vaddr);
-#define vma_alloc_zeroed_movable_folio vma_alloc_zeroed_movable_folio
+#define vma_alloc_zeroed_movable_folio(vma, vaddr) \
+ vma_alloc_folio(GFP_HIGHUSER_MOVABLE | __GFP_ZERO, 0, vma, vaddr, false)
void tag_clear_highpage(struct page *to);
#define __HAVE_ARCH_TAG_CLEAR_HIGHPAGE
@@ -936,25 +936,6 @@ void do_debug_exception(unsigned long addr_if_watchpoint, unsigned long esr,
}
NOKPROBE_SYMBOL(do_debug_exception);
-/*
- * Used during anonymous page fault handling.
- */
-struct folio *vma_alloc_zeroed_movable_folio(struct vm_area_struct *vma,
- unsigned long vaddr)
-{
- gfp_t flags = GFP_HIGHUSER_MOVABLE | __GFP_ZERO;
-
- /*
- * If the page is mapped with PROT_MTE, initialise the tags at the
- * point of allocation and page zeroing as this is usually faster than
- * separate DC ZVA and STGM.
- */
- if (vma->vm_flags & VM_MTE)
- flags |= __GFP_TAGGED;
-
- return vma_alloc_folio(flags, 0, vma, vaddr, false);
-}
-
void tag_clear_highpage(struct page *page)
{
/* Tag storage pages cannot be tagged. */
@@ -2170,6 +2170,9 @@ struct folio *vma_alloc_folio(gfp_t gfp, int order, struct vm_area_struct *vma,
int preferred_nid;
nodemask_t *nmask;
+ if (vma->vm_flags & VM_MTE)
+ gfp |= __GFP_TAGGED;
+
pol = get_vma_policy(vma, addr);
if (pol->mode == MPOL_INTERLEAVE) {
When an anonymous page is mapped into the user address space as a result of a write fault, that page is zeroed. On arm64, when the VMA has metadata enabled, the tags are zeroed at the same time as the page contents, with the combination of gfp flags __GFP_ZERO | __GFP_TAGGED (which used be called __GFP_ZEROTAGS for this reason). For this use case, it is enough to set the __GFP_TAGGED flag in vma_alloc_zeroed_movable_folio(). But with dynamic tag storage reuse, it becomes necessary to have the __GFP_TAGGED flag set when allocating a page to be mapped in a VMA with metadata enabled in order reserve the corresponding metadata storage. Change vma_alloc_folio() to take into account VMAs with metadata enabled. Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> --- arch/arm64/include/asm/page.h | 5 ++--- arch/arm64/mm/fault.c | 19 ------------------- mm/mempolicy.c | 3 +++ 3 files changed, 5 insertions(+), 22 deletions(-)