arm64: mte: handle tags zeroing at page allocation time
authorPeter Collingbourne <pcc@google.com>
Wed, 2 Jun 2021 23:52:29 +0000 (16:52 -0700)
committerWill Deacon <will@kernel.org>
Fri, 4 Jun 2021 18:32:21 +0000 (19:32 +0100)
commit013bb59dbb7cf876449df860946458a595a96d51
tree2c086b293dc8c5d6e33881248aa49b0dbe698808
parent7a3b835371883558eb63e069d891bd87f562380d
arm64: mte: handle tags zeroing at page allocation time

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>
arch/arm64/include/asm/mte.h
arch/arm64/include/asm/page.h
arch/arm64/lib/mte.S
arch/arm64/mm/fault.c
arch/arm64/mm/proc.S
include/linux/gfp.h
include/linux/highmem.h
mm/kasan/hw_tags.c
mm/page_alloc.c