mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-04 00:06:36 +00:00

Currently, on an anonymous page fault, the kernel allocates a zeroed page and maps it in user space. If the mapping is tagged (PROT_MTE), set_pte_at() additionally clears the tags. It is, however, more efficient to clear the tags at the same time as zeroing the data on allocation. To avoid clearing the tags on any page (which may not be mapped as tagged), only do this if the vma flags contain VM_MTE. This requires introducing a new GFP flag that is used to determine whether to clear the tags. The DC GZVA instruction with a 0 top byte (and 0 tag) requires top-byte-ignore. Set the TCR_EL1.{TBI1,TBID1} bits irrespective of whether KASAN_HW is enabled. Signed-off-by: Peter Collingbourne <pcc@google.com> Co-developed-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Link: https://linux-review.googlesource.com/id/Id46dc94e30fe11474f7e54f5d65e7658dbdddb26 Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Reviewed-by: Andrey Konovalov <andreyknvl@gmail.com> Link: https://lore.kernel.org/r/20210602235230.3928842-4-pcc@google.com Signed-off-by: Will Deacon <will@kernel.org>
54 lines
1.3 KiB
C
54 lines
1.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Based on arch/arm/include/asm/page.h
|
|
*
|
|
* Copyright (C) 1995-2003 Russell King
|
|
* Copyright (C) 2012 ARM Ltd.
|
|
*/
|
|
#ifndef __ASM_PAGE_H
|
|
#define __ASM_PAGE_H
|
|
|
|
#include <asm/page-def.h>
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
#include <linux/personality.h> /* for READ_IMPLIES_EXEC */
|
|
#include <linux/types.h> /* for gfp_t */
|
|
#include <asm/pgtable-types.h>
|
|
|
|
struct page;
|
|
struct vm_area_struct;
|
|
|
|
extern void copy_page(void *to, const void *from);
|
|
extern void clear_page(void *to);
|
|
|
|
void copy_user_highpage(struct page *to, struct page *from,
|
|
unsigned long vaddr, struct vm_area_struct *vma);
|
|
#define __HAVE_ARCH_COPY_USER_HIGHPAGE
|
|
|
|
void copy_highpage(struct page *to, struct page *from);
|
|
#define __HAVE_ARCH_COPY_HIGHPAGE
|
|
|
|
struct page *alloc_zeroed_user_highpage_movable(struct vm_area_struct *vma,
|
|
unsigned long vaddr);
|
|
#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE_MOVABLE
|
|
|
|
void tag_clear_highpage(struct page *to);
|
|
#define __HAVE_ARCH_TAG_CLEAR_HIGHPAGE
|
|
|
|
#define clear_user_page(page, vaddr, pg) clear_page(page)
|
|
#define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
|
|
|
|
typedef struct page *pgtable_t;
|
|
|
|
extern int pfn_valid(unsigned long);
|
|
|
|
#include <asm/memory.h>
|
|
|
|
#endif /* !__ASSEMBLY__ */
|
|
|
|
#define VM_DATA_DEFAULT_FLAGS (VM_DATA_FLAGS_TSK_EXEC | VM_MTE_ALLOWED)
|
|
|
|
#include <asm-generic/getorder.h>
|
|
|
|
#endif
|