arm64: mte: Define the number of bytes for storing the tags in a page
authorCatalin Marinas <catalin.marinas@arm.com>
Mon, 31 Jan 2022 16:54:54 +0000 (16:54 +0000)
committerWill Deacon <will@kernel.org>
Tue, 15 Feb 2022 22:53:29 +0000 (22:53 +0000)
Rather than explicitly calculating the number of bytes for a compact tag
storage format corresponding to a page, just add a MTE_PAGE_TAG_STORAGE
macro. With the current MTE implementation of 4 bits per tag, we store
2 tags in a byte.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Luis Machado <luis.machado@linaro.org>
Link: https://lore.kernel.org/r/20220131165456.2160675-4-catalin.marinas@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/mte-def.h
arch/arm64/lib/mte.S
arch/arm64/mm/mteswap.c

index 626d359..14ee86b 100644 (file)
@@ -11,6 +11,7 @@
 #define MTE_TAG_SHIFT          56
 #define MTE_TAG_SIZE           4
 #define MTE_TAG_MASK           GENMASK((MTE_TAG_SHIFT + (MTE_TAG_SIZE - 1)), MTE_TAG_SHIFT)
+#define MTE_PAGE_TAG_STORAGE   (MTE_GRANULES_PER_PAGE * MTE_TAG_SIZE / 8)
 
 #define __MTE_PREAMBLE         ARM64_ASM_PREAMBLE ".arch_extension memtag\n"
 
index f531dcb..8590af3 100644 (file)
@@ -134,7 +134,7 @@ SYM_FUNC_END(mte_copy_tags_to_user)
 /*
  * Save the tags in a page
  *   x0 - page address
- *   x1 - tag storage
+ *   x1 - tag storage, MTE_PAGE_TAG_STORAGE bytes
  */
 SYM_FUNC_START(mte_save_page_tags)
        multitag_transfer_size x7, x5
@@ -158,7 +158,7 @@ SYM_FUNC_END(mte_save_page_tags)
 /*
  * Restore the tags in a page
  *   x0 - page address
- *   x1 - tag storage
+ *   x1 - tag storage, MTE_PAGE_TAG_STORAGE bytes
  */
 SYM_FUNC_START(mte_restore_page_tags)
        multitag_transfer_size x7, x5
index 7c4ef56..a9e50e9 100644 (file)
@@ -12,7 +12,7 @@ static DEFINE_XARRAY(mte_pages);
 void *mte_allocate_tag_storage(void)
 {
        /* tags granule is 16 bytes, 2 tags stored per byte */
-       return kmalloc(PAGE_SIZE / 16 / 2, GFP_KERNEL);
+       return kmalloc(MTE_PAGE_TAG_STORAGE, GFP_KERNEL);
 }
 
 void mte_free_tag_storage(char *storage)