* [v2 PATCH 1/2] hugetlb: arm64: add mte support
@ 2024-08-21 18:47 Yang Shi
2024-08-21 18:47 ` [v2 PATCH 2/2] selftests: arm64: add hugetlb mte tests Yang Shi
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Yang Shi @ 2024-08-21 18:47 UTC (permalink / raw)
To: catalin.marinas, will, muchun.song, akpm
Cc: yang, linux-arm-kernel, linux-mm, linux-kernel
Enable MTE support for hugetlb.
The MTE page flags will be set on the head page only. When copying
hugetlb folio, the tags for all tail pages will be copied when copying
head page.
When freeing hugetlb folio, the MTE flags will be cleared.
Signed-off-by: Yang Shi <yang@os.amperecomputing.com>
---
arch/arm64/include/asm/hugetlb.h | 11 ++++++++++-
arch/arm64/include/asm/mman.h | 3 ++-
arch/arm64/kernel/hibernate.c | 7 +++++++
arch/arm64/kernel/mte.c | 25 +++++++++++++++++++++++--
arch/arm64/kvm/guest.c | 16 +++++++++++++---
arch/arm64/kvm/mmu.c | 11 +++++++++++
arch/arm64/mm/copypage.c | 25 +++++++++++++++++++++++--
fs/hugetlbfs/inode.c | 2 +-
8 files changed, 90 insertions(+), 10 deletions(-)
v2: * Reimplemented the patch to fix the comments from Catalin.
* Added test cases (patch #2) per Catalin.
diff --git a/arch/arm64/include/asm/hugetlb.h b/arch/arm64/include/asm/hugetlb.h
index 293f880865e8..00a1f75d40ee 100644
--- a/arch/arm64/include/asm/hugetlb.h
+++ b/arch/arm64/include/asm/hugetlb.h
@@ -11,6 +11,7 @@
#define __ASM_HUGETLB_H
#include <asm/cacheflush.h>
+#include <asm/mte.h>
#include <asm/page.h>
#ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
@@ -20,7 +21,15 @@ extern bool arch_hugetlb_migration_supported(struct hstate *h);
static inline void arch_clear_hugetlb_flags(struct folio *folio)
{
- clear_bit(PG_dcache_clean, &folio->flags);
+ const unsigned long clear_flags = BIT(PG_dcache_clean) |
+ BIT(PG_mte_tagged) | BIT(PG_mte_lock);
+
+ if (!system_supports_mte()) {
+ clear_bit(PG_dcache_clean, &folio->flags);
+ return;
+ }
+
+ folio->flags &= ~clear_flags;
}
#define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
diff --git a/arch/arm64/include/asm/mman.h b/arch/arm64/include/asm/mman.h
index 5966ee4a6154..304dfc499e68 100644
--- a/arch/arm64/include/asm/mman.h
+++ b/arch/arm64/include/asm/mman.h
@@ -28,7 +28,8 @@ static inline unsigned long arch_calc_vm_flag_bits(unsigned long flags)
* backed by tags-capable memory. The vm_flags may be overridden by a
* filesystem supporting MTE (RAM-based).
*/
- if (system_supports_mte() && (flags & MAP_ANONYMOUS))
+ if (system_supports_mte() &&
+ (flags & (MAP_ANONYMOUS | MAP_HUGETLB)))
return VM_MTE_ALLOWED;
return 0;
diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c
index 02870beb271e..722e76f29141 100644
--- a/arch/arm64/kernel/hibernate.c
+++ b/arch/arm64/kernel/hibernate.c
@@ -266,10 +266,17 @@ static int swsusp_mte_save_tags(void)
max_zone_pfn = zone_end_pfn(zone);
for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) {
struct page *page = pfn_to_online_page(pfn);
+ struct folio *folio;
if (!page)
continue;
+ folio = page_folio(page);
+
+ if (folio_test_hugetlb(folio) &&
+ !page_mte_tagged(&folio->page))
+ continue;
+
if (!page_mte_tagged(page))
continue;
diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c
index 6174671be7c1..b21f706018f7 100644
--- a/arch/arm64/kernel/mte.c
+++ b/arch/arm64/kernel/mte.c
@@ -38,7 +38,22 @@ EXPORT_SYMBOL_GPL(mte_async_or_asymm_mode);
void mte_sync_tags(pte_t pte, unsigned int nr_pages)
{
struct page *page = pte_page(pte);
- unsigned int i;
+ struct folio *folio = page_folio(page);
+ unsigned long i;
+
+ if (folio_test_hugetlb(folio)) {
+ unsigned long nr = folio_nr_pages(folio);
+ /* Hugetlb MTE flags are set for head page only */
+ if (try_page_mte_tagging(&folio->page)) {
+ for (i = 0; i < nr; i++, page++)
+ mte_clear_page_tags(page_address(page));
+ set_page_mte_tagged(&folio->page);
+ }
+
+ smp_wmb();
+
+ return;
+ }
/* if PG_mte_tagged is set, tags have already been initialised */
for (i = 0; i < nr_pages; i++, page++) {
@@ -410,6 +425,7 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr,
void *maddr;
struct page *page = get_user_page_vma_remote(mm, addr,
gup_flags, &vma);
+ struct folio *folio;
if (IS_ERR(page)) {
err = PTR_ERR(page);
@@ -428,7 +444,12 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr,
put_page(page);
break;
}
- WARN_ON_ONCE(!page_mte_tagged(page));
+
+ folio = page_folio(page);
+ if (folio_test_hugetlb(folio))
+ WARN_ON_ONCE(!page_mte_tagged(&folio->page));
+ else
+ WARN_ON_ONCE(!page_mte_tagged(page));
/* limit access to the end of the page */
offset = offset_in_page(addr);
diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
index 11098eb7eb44..77e181d96e97 100644
--- a/arch/arm64/kvm/guest.c
+++ b/arch/arm64/kvm/guest.c
@@ -1050,6 +1050,7 @@ int kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
void *maddr;
unsigned long num_tags;
struct page *page;
+ struct folio *folio;
if (is_error_noslot_pfn(pfn)) {
ret = -EFAULT;
@@ -1062,10 +1063,13 @@ int kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
ret = -EFAULT;
goto out;
}
+ folio = page_folio(page);
maddr = page_address(page);
if (!write) {
- if (page_mte_tagged(page))
+ if (page_mte_tagged(page) ||
+ (folio_test_hugetlb(folio) &&
+ page_mte_tagged(&folio->page)))
num_tags = mte_copy_tags_to_user(tags, maddr,
MTE_GRANULES_PER_PAGE);
else
@@ -1079,14 +1083,20 @@ int kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
* __set_ptes() in the VMM but still overriding the
* tags, hence ignoring the return value.
*/
- try_page_mte_tagging(page);
+ if (folio_test_hugetlb(folio))
+ try_page_mte_tagging(&folio->page);
+ else
+ try_page_mte_tagging(page);
num_tags = mte_copy_tags_from_user(maddr, tags,
MTE_GRANULES_PER_PAGE);
/* uaccess failed, don't leave stale tags */
if (num_tags != MTE_GRANULES_PER_PAGE)
mte_clear_page_tags(maddr);
- set_page_mte_tagged(page);
+ if (folio_test_hugetlb(folio))
+ set_page_mte_tagged(&folio->page);
+ else
+ set_page_mte_tagged(page);
kvm_release_pfn_dirty(pfn);
}
diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
index 6981b1bc0946..1fa51ac4e3f4 100644
--- a/arch/arm64/kvm/mmu.c
+++ b/arch/arm64/kvm/mmu.c
@@ -1401,10 +1401,21 @@ static void sanitise_mte_tags(struct kvm *kvm, kvm_pfn_t pfn,
{
unsigned long i, nr_pages = size >> PAGE_SHIFT;
struct page *page = pfn_to_page(pfn);
+ struct folio *folio = page_folio(page);
if (!kvm_has_mte(kvm))
return;
+ if (folio_test_hugetlb(folio)) {
+ /* Hugetlb has MTE flags set on head page only */
+ if (try_page_mte_tagging(&folio->page)) {
+ for (i = 0; i < nr_pages; i++, page++)
+ mte_clear_page_tags(page_address(page));
+ set_page_mte_tagged(&folio->page);
+ }
+ return;
+ }
+
for (i = 0; i < nr_pages; i++, page++) {
if (try_page_mte_tagging(page)) {
mte_clear_page_tags(page_address(page));
diff --git a/arch/arm64/mm/copypage.c b/arch/arm64/mm/copypage.c
index a7bb20055ce0..0f3b07d4a5cf 100644
--- a/arch/arm64/mm/copypage.c
+++ b/arch/arm64/mm/copypage.c
@@ -18,6 +18,9 @@ void copy_highpage(struct page *to, struct page *from)
{
void *kto = page_address(to);
void *kfrom = page_address(from);
+ struct folio *src = page_folio(from);
+ struct folio *dst = page_folio(to);
+ unsigned int i, nr_pages;
copy_page(kto, kfrom);
@@ -27,8 +30,26 @@ void copy_highpage(struct page *to, struct page *from)
if (system_supports_mte() && page_mte_tagged(from)) {
/* It's a new page, shouldn't have been tagged yet */
WARN_ON_ONCE(!try_page_mte_tagging(to));
- mte_copy_page_tags(kto, kfrom);
- set_page_mte_tagged(to);
+
+ /* Populate tags for all subpages if hugetlb */
+ if (folio_test_hugetlb(src)) {
+ /*
+ * MTE page flag is just set on the head page of
+ * hugetlb. If from has MTE flag set, it must be the
+ * head page.
+ */
+ VM_BUG_ON(!PageHead(from));
+ nr_pages = folio_nr_pages(src);
+ for (i = 0; i < nr_pages; i++, to++, from++) {
+ kto = page_address(to);
+ kfrom = page_address(from);
+ mte_copy_page_tags(kto, kfrom);
+ }
+ set_page_mte_tagged(&dst->page);
+ } else {
+ mte_copy_page_tags(kto, kfrom);
+ set_page_mte_tagged(to);
+ }
}
}
EXPORT_SYMBOL(copy_highpage);
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 9f6cff356796..f944e8e7126b 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -110,7 +110,7 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma)
* way when do_mmap unwinds (may be important on powerpc
* and ia64).
*/
- vm_flags_set(vma, VM_HUGETLB | VM_DONTEXPAND);
+ vm_flags_set(vma, VM_HUGETLB | VM_DONTEXPAND | VM_MTE_ALLOWED);
vma->vm_ops = &hugetlb_vm_ops;
ret = seal_check_write(info->seals, vma);
--
2.41.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* [v2 PATCH 2/2] selftests: arm64: add hugetlb mte tests
2024-08-21 18:47 [v2 PATCH 1/2] hugetlb: arm64: add mte support Yang Shi
@ 2024-08-21 18:47 ` Yang Shi
2024-08-26 11:15 ` [v2 PATCH 1/2] hugetlb: arm64: add mte support kernel test robot
` (2 subsequent siblings)
3 siblings, 0 replies; 10+ messages in thread
From: Yang Shi @ 2024-08-21 18:47 UTC (permalink / raw)
To: catalin.marinas, will, muchun.song, akpm
Cc: yang, linux-arm-kernel, linux-mm, linux-kernel
The tests cover mmap, mprotect hugetlb with MTE prot and COW.
Signed-off-by: Yang Shi <yang@os.amperecomputing.com>
---
.../arm64/mte/check_hugetlb_options.c | 285 ++++++++++++++++++
1 file changed, 285 insertions(+)
create mode 100644 tools/testing/selftests/arm64/mte/check_hugetlb_options.c
diff --git a/tools/testing/selftests/arm64/mte/check_hugetlb_options.c b/tools/testing/selftests/arm64/mte/check_hugetlb_options.c
new file mode 100644
index 000000000000..c2402e3d6bca
--- /dev/null
+++ b/tools/testing/selftests/arm64/mte/check_hugetlb_options.c
@@ -0,0 +1,285 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (C) 2024 Ampere Computing LLC
+
+#define _GNU_SOURCE
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ucontext.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "kselftest.h"
+#include "mte_common_util.h"
+#include "mte_def.h"
+
+#define TAG_CHECK_ON 0
+#define TAG_CHECK_OFF 1
+
+static unsigned long default_huge_page_size(void)
+{
+ unsigned long hps = 0;
+ char *line = NULL;
+ size_t linelen = 0;
+ FILE *f = fopen("/proc/meminfo", "r");
+
+ if (!f)
+ return 0;
+ while (getline(&line, &linelen, f) > 0) {
+ if (sscanf(line, "Hugepagesize: %lu kB", &hps) == 1) {
+ hps <<= 10;
+ break;
+ }
+ }
+
+ free(line);
+ fclose(f);
+ return hps;
+}
+
+static bool is_hugetlb_allocated(void)
+{
+ unsigned long hps = 0;
+ char *line = NULL;
+ size_t linelen = 0;
+ FILE *f = fopen("/proc/meminfo", "r");
+
+ if (!f)
+ return false;
+ while (getline(&line, &linelen, f) > 0) {
+ if (sscanf(line, "Hugetlb: %lu kB", &hps) == 1) {
+ hps <<= 10;
+ break;
+ }
+ }
+
+ free(line);
+ fclose(f);
+
+ if (hps > 0)
+ return true;
+
+ return false;
+}
+
+static void write_sysfs(char *str, unsigned long val)
+{
+ FILE *f;
+
+ f = fopen(str, "w");
+ if (!f) {
+ ksft_print_msg("ERR: missing %s\n", str);
+ return;
+ }
+ fprintf(f, "%lu", val);
+ fclose(f);
+}
+
+static void allocate_hugetlb()
+{
+ write_sysfs("/proc/sys/vm/nr_hugepages", 2);
+}
+
+static void free_hugetlb()
+{
+ write_sysfs("/proc/sys/vm/nr_hugepages", 0);
+}
+
+static int check_child_tag_inheritance(char *ptr, int size, int mode)
+{
+ int i, parent_tag, child_tag, fault, child_status;
+ pid_t child;
+
+ parent_tag = MT_FETCH_TAG((uintptr_t)ptr);
+ fault = 0;
+
+ child = fork();
+ if (child == -1) {
+ ksft_print_msg("FAIL: child process creation\n");
+ return KSFT_FAIL;
+ } else if (child == 0) {
+ mte_initialize_current_context(mode, (uintptr_t)ptr, size);
+ /* Do copy on write */
+ memset(ptr, '1', size);
+ mte_wait_after_trig();
+ if (cur_mte_cxt.fault_valid == true) {
+ fault = 1;
+ goto check_child_tag_inheritance_err;
+ }
+ for (i = 0; i < size; i += MT_GRANULE_SIZE) {
+ child_tag = MT_FETCH_TAG((uintptr_t)(mte_get_tag_address(ptr + i)));
+ if (parent_tag != child_tag) {
+ ksft_print_msg("FAIL: child mte tag (%d) mismatch\n", i);
+ fault = 1;
+ goto check_child_tag_inheritance_err;
+ }
+ }
+check_child_tag_inheritance_err:
+ _exit(fault);
+ }
+ /* Wait for child process to terminate */
+ wait(&child_status);
+ if (WIFEXITED(child_status))
+ fault = WEXITSTATUS(child_status);
+ else
+ fault = 1;
+ return (fault) ? KSFT_FAIL : KSFT_PASS;
+}
+
+static int check_mte_memory(char *ptr, int size, int mode, int tag_check)
+{
+ mte_initialize_current_context(mode, (uintptr_t)ptr, size);
+ memset(ptr, '1', size);
+ mte_wait_after_trig();
+ if (cur_mte_cxt.fault_valid == true)
+ return KSFT_FAIL;
+
+ return KSFT_PASS;
+}
+
+static int check_hugetlb_memory_mapping(int mem_type, int mode, int mapping, int tag_check)
+{
+ char *ptr, *map_ptr;
+ int result;
+ unsigned long map_size;
+
+ map_size = default_huge_page_size();
+
+ mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
+ map_ptr = (char *)mte_allocate_memory(map_size, mem_type, mapping, false);
+ if (check_allocated_memory(map_ptr, map_size, mem_type, false) != KSFT_PASS)
+ return KSFT_FAIL;
+
+ mte_initialize_current_context(mode, (uintptr_t)map_ptr, map_size);
+ /* Only mte enabled memory will allow tag insertion */
+ ptr = mte_insert_tags((void *)map_ptr, map_size);
+ if (!ptr || cur_mte_cxt.fault_valid == true) {
+ ksft_print_msg("FAIL: Insert tags on anonymous mmap memory\n");
+ munmap((void *)map_ptr, map_size);
+ return KSFT_FAIL;
+ }
+ result = check_mte_memory(ptr, map_size, mode, tag_check);
+ mte_clear_tags((void *)ptr, map_size);
+ mte_free_memory((void *)map_ptr, map_size, mem_type, false);
+ if (result == KSFT_FAIL)
+ return KSFT_FAIL;
+
+ return KSFT_PASS;
+}
+
+static int check_clear_prot_mte_flag(int mem_type, int mode, int mapping)
+{
+ char *map_ptr;
+ int prot_flag, result;
+ unsigned long map_size;
+
+ prot_flag = PROT_READ | PROT_WRITE;
+ mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
+ map_size = default_huge_page_size();
+ map_ptr = (char *)mte_allocate_memory_tag_range(map_size, mem_type, mapping,
+ 0, 0);
+ if (check_allocated_memory_range(map_ptr, map_size, mem_type,
+ 0, 0) != KSFT_PASS)
+ return KSFT_FAIL;
+ /* Try to clear PROT_MTE property and verify it by tag checking */
+ if (mprotect(map_ptr, map_size, prot_flag)) {
+ mte_free_memory_tag_range((void *)map_ptr, map_size, mem_type,
+ 0, 0);
+ ksft_print_msg("FAIL: mprotect not ignoring clear PROT_MTE property\n");
+ return KSFT_FAIL;
+ }
+ result = check_mte_memory(map_ptr, map_size, mode, TAG_CHECK_ON);
+ mte_free_memory_tag_range((void *)map_ptr, map_size, mem_type, 0, 0);
+ if (result != KSFT_PASS)
+ return KSFT_FAIL;
+
+ return KSFT_PASS;
+}
+
+static int check_child_hugetlb_memory_mapping(int mem_type, int mode, int mapping)
+{
+ char *ptr;
+ int result;
+ unsigned long map_size;
+
+ map_size = default_huge_page_size();
+
+ mte_switch_mode(mode, MTE_ALLOW_NON_ZERO_TAG);
+ ptr = (char *)mte_allocate_memory_tag_range(map_size, mem_type, mapping,
+ 0, 0);
+ if (check_allocated_memory_range(ptr, map_size, mem_type,
+ 0, 0) != KSFT_PASS)
+ return KSFT_FAIL;
+ result = check_child_tag_inheritance(ptr, map_size, mode);
+ mte_free_memory_tag_range((void *)ptr, map_size, mem_type, 0, 0);
+ if (result == KSFT_FAIL)
+ return result;
+
+ return KSFT_PASS;
+}
+
+int main(int argc, char *argv[])
+{
+ int err;
+
+ err = mte_default_setup();
+ if (err)
+ return err;
+
+ /* Register signal handlers */
+ mte_register_signal(SIGBUS, mte_default_handler);
+ mte_register_signal(SIGSEGV, mte_default_handler);
+
+ allocate_hugetlb();
+
+ if (!is_hugetlb_allocated()) {
+ ksft_print_msg("ERR: Unable allocate hugetlb pages\n");
+ return KSFT_FAIL;
+ }
+
+ /* Set test plan */
+ ksft_set_plan(12);
+
+ mte_enable_pstate_tco();
+
+ evaluate_test(check_hugetlb_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVATE | MAP_HUGETLB, TAG_CHECK_OFF),
+ "Check hugetlb memory with private mapping, sync error mode, mmap memory and tag check off\n");
+
+ mte_disable_pstate_tco();
+ evaluate_test(check_hugetlb_memory_mapping(USE_MMAP, MTE_NONE_ERR, MAP_PRIVATE | MAP_HUGETLB, TAG_CHECK_OFF),
+ "Check hugetlb memory with private mapping, no error mode, mmap memory and tag check off\n");
+
+ evaluate_test(check_hugetlb_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVATE | MAP_HUGETLB, TAG_CHECK_ON),
+ "Check hugetlb memory with private mapping, sync error mode, mmap memory and tag check on\n");
+ evaluate_test(check_hugetlb_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_PRIVATE | MAP_HUGETLB, TAG_CHECK_ON),
+ "Check hugetlb memory with private mapping, sync error mode, mmap/mprotect memory and tag check on\n");
+ evaluate_test(check_hugetlb_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP_PRIVATE | MAP_HUGETLB, TAG_CHECK_ON),
+ "Check hugetlb memory with private mapping, async error mode, mmap memory and tag check on\n");
+ evaluate_test(check_hugetlb_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR, MAP_PRIVATE | MAP_HUGETLB, TAG_CHECK_ON),
+ "Check hugetlb memory with private mapping, async error mode, mmap/mprotect memory and tag check on\n");
+
+ evaluate_test(check_clear_prot_mte_flag(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVATE | MAP_HUGETLB),
+ "Check clear PROT_MTE flags with private mapping, sync error mode and mmap memory\n");
+ evaluate_test(check_clear_prot_mte_flag(USE_MPROTECT, MTE_SYNC_ERR, MAP_PRIVATE | MAP_HUGETLB),
+ "Check clear PROT_MTE flags with private mapping and sync error mode and mmap/mprotect memory\n");
+
+ evaluate_test(check_child_hugetlb_memory_mapping(USE_MMAP, MTE_SYNC_ERR, MAP_PRIVATE | MAP_HUGETLB),
+ "Check child hugetlb memory with private mapping, precise mode and mmap memory\n");
+ evaluate_test(check_child_hugetlb_memory_mapping(USE_MMAP, MTE_ASYNC_ERR, MAP_PRIVATE | MAP_HUGETLB),
+ "Check child hugetlb memory with private mapping, precise mode and mmap memory\n");
+ evaluate_test(check_child_hugetlb_memory_mapping(USE_MPROTECT, MTE_SYNC_ERR, MAP_PRIVATE | MAP_HUGETLB),
+ "Check child hugetlb memory with private mapping, precise mode and mmap/mprotect memory\n");
+ evaluate_test(check_child_hugetlb_memory_mapping(USE_MPROTECT, MTE_ASYNC_ERR, MAP_PRIVATE | MAP_HUGETLB),
+ "Check child hugetlb memory with private mapping, precise mode and mmap/mprotect memory\n");
+
+ mte_restore_setup();
+ free_hugetlb();
+ ksft_print_cnts();
+ return ksft_get_fail_cnt() == 0 ? KSFT_PASS : KSFT_FAIL;
+}
--
2.41.0
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [v2 PATCH 1/2] hugetlb: arm64: add mte support
2024-08-21 18:47 [v2 PATCH 1/2] hugetlb: arm64: add mte support Yang Shi
2024-08-21 18:47 ` [v2 PATCH 2/2] selftests: arm64: add hugetlb mte tests Yang Shi
@ 2024-08-26 11:15 ` kernel test robot
2024-08-26 17:02 ` Yang Shi
2024-08-28 17:57 ` Yang Shi
2024-09-02 14:33 ` David Hildenbrand
3 siblings, 1 reply; 10+ messages in thread
From: kernel test robot @ 2024-08-26 11:15 UTC (permalink / raw)
To: Yang Shi, catalin.marinas, will, muchun.song, akpm
Cc: llvm, oe-kbuild-all, yang, linux-arm-kernel, linux-mm, linux-kernel
Hi Yang,
kernel test robot noticed the following build errors:
[auto build test ERROR on arm64/for-next/core]
[also build test ERROR on kvmarm/next akpm-mm/mm-everything linus/master v6.11-rc5 next-20240823]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Yang-Shi/selftests-arm64-add-hugetlb-mte-tests/20240822-024935
base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core
patch link: https://lore.kernel.org/r/20240821184752.3535276-1-yang%40os.amperecomputing.com
patch subject: [v2 PATCH 1/2] hugetlb: arm64: add mte support
config: arm64-randconfig-004-20240824 (https://download.01.org/0day-ci/archive/20240826/202408261816.ACEJvgZw-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 08e5a1de8227512d4774a534b91cb2353cef6284)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240826/202408261816.ACEJvgZw-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202408261816.ACEJvgZw-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from mm/gup.c:7:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
501 | item];
| ~~~~
include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
508 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
520 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from mm/gup.c:18:
In file included from include/linux/hugetlb.h:798:
>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
| ^
In file included from mm/gup.c:20:
include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~ ^ ~~~
include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
49 | NR_ZONE_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~~~~~~ ^ ~~~
6 warnings and 1 error generated.
--
In file included from mm/swap.c:17:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
501 | item];
| ~~~~
include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
508 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
520 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from mm/swap.c:26:
include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~ ^ ~~~
include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
49 | NR_ZONE_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~~~~~~ ^ ~~~
In file included from mm/swap.c:36:
In file included from include/linux/hugetlb.h:798:
>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
| ^
6 warnings and 1 error generated.
--
In file included from mm/shmem.c:28:
In file included from include/linux/ramfs.h:5:
In file included from include/linux/fs_parser.h:11:
In file included from include/linux/fs_context.h:14:
In file included from include/linux/security.h:33:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
501 | item];
| ~~~~
include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
508 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
520 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from mm/shmem.c:39:
In file included from include/linux/hugetlb.h:798:
>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
| ^
In file included from mm/shmem.c:58:
include/linux/mman.h:158:9: warning: division by zero is undefined [-Wdivision-by-zero]
158 | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
| ^ ~~~~~~~~~~~~~~~~~
include/linux/mman.h:159:9: warning: division by zero is undefined [-Wdivision-by-zero]
159 | _calc_vm_trans(flags, MAP_STACK, VM_NOHUGEPAGE) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
| ^ ~~~~~~~~~~~~~~~~~
6 warnings and 1 error generated.
--
In file included from mm/mprotect.c:12:
In file included from include/linux/pagewalk.h:5:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
501 | item];
| ~~~~
include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
508 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
520 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from mm/mprotect.c:13:
In file included from include/linux/hugetlb.h:798:
>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
| ^
In file included from mm/mprotect.c:15:
include/linux/mman.h:158:9: warning: division by zero is undefined [-Wdivision-by-zero]
158 | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
| ^ ~~~~~~~~~~~~~~~~~
include/linux/mman.h:159:9: warning: division by zero is undefined [-Wdivision-by-zero]
159 | _calc_vm_trans(flags, MAP_STACK, VM_NOHUGEPAGE) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
| ^ ~~~~~~~~~~~~~~~~~
In file included from mm/mprotect.c:30:
include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~ ^ ~~~
include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
49 | NR_ZONE_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~~~~~~ ^ ~~~
8 warnings and 1 error generated.
--
In file included from mm/show_mem.c:8:
In file included from include/linux/blkdev.h:9:
In file included from include/linux/blk_types.h:10:
In file included from include/linux/bvec.h:10:
In file included from include/linux/highmem.h:8:
In file included from include/linux/cacheflush.h:5:
In file included from arch/arm64/include/asm/cacheflush.h:11:
In file included from include/linux/kgdb.h:19:
In file included from include/linux/kprobes.h:28:
In file included from include/linux/ftrace.h:13:
In file included from include/linux/kallsyms.h:13:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
501 | item];
| ~~~~
include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
508 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
520 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from mm/show_mem.c:12:
In file included from include/linux/hugetlb.h:798:
>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
| ^
4 warnings and 1 error generated.
--
In file included from mm/mremap.c:11:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
501 | item];
| ~~~~
include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
508 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
520 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from mm/mremap.c:12:
include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~ ^ ~~~
include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
49 | NR_ZONE_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~~~~~~ ^ ~~~
In file included from mm/mremap.c:13:
In file included from include/linux/hugetlb.h:798:
>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
| ^
In file included from mm/mremap.c:16:
include/linux/mman.h:158:9: warning: division by zero is undefined [-Wdivision-by-zero]
158 | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
| ^ ~~~~~~~~~~~~~~~~~
include/linux/mman.h:159:9: warning: division by zero is undefined [-Wdivision-by-zero]
159 | _calc_vm_trans(flags, MAP_STACK, VM_NOHUGEPAGE) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
| ^ ~~~~~~~~~~~~~~~~~
8 warnings and 1 error generated.
--
In file included from mm/huge_memory.c:8:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
501 | item];
| ~~~~
include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
508 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
520 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from mm/huge_memory.c:14:
In file included from include/linux/hugetlb.h:798:
>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
| ^
In file included from mm/huge_memory.c:19:
include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~ ^ ~~~
include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
49 | NR_ZONE_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~~~~~~ ^ ~~~
In file included from mm/huge_memory.c:27:
include/linux/mman.h:158:9: warning: division by zero is undefined [-Wdivision-by-zero]
158 | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
| ^ ~~~~~~~~~~~~~~~~~
include/linux/mman.h:159:9: warning: division by zero is undefined [-Wdivision-by-zero]
159 | _calc_vm_trans(flags, MAP_STACK, VM_NOHUGEPAGE) |
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
| ^ ~~~~~~~~~~~~~~~~~
8 warnings and 1 error generated.
--
In file included from mm/vmscan.c:15:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
501 | item];
| ~~~~
include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
508 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
520 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
In file included from mm/vmscan.c:30:
include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~ ^ ~~~
include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
49 | NR_ZONE_LRU_BASE + lru, nr_pages);
| ~~~~~~~~~~~~~~~~ ^ ~~~
In file included from mm/vmscan.c:42:
In file included from include/linux/migrate.h:8:
In file included from include/linux/hugetlb.h:798:
>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
| ^
mm/vmscan.c:401:51: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
401 | size += zone_page_state(zone, NR_ZONE_LRU_BASE + lru);
| ~~~~~~~~~~~~~~~~ ^ ~~~
mm/vmscan.c:1729:4: warning: arithmetic between different enumeration types ('enum vm_event_item' and 'enum zone_type') [-Wenum-enum-conversion]
1729 | __count_zid_vm_events(PGSCAN_SKIP, zid, nr_skipped[zid]);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:135:34: note: expanded from macro '__count_zid_vm_events'
135 | __count_vm_events(item##_NORMAL - ZONE_NORMAL + zid, delta)
| ~~~~~~~~~~~~~ ^ ~~~~~~~~~~~
mm/vmscan.c:2232:51: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
2232 | inactive = lruvec_page_state(lruvec, NR_LRU_BASE + inactive_lru);
| ~~~~~~~~~~~ ^ ~~~~~~~~~~~~
mm/vmscan.c:2233:49: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
2233 | active = lruvec_page_state(lruvec, NR_LRU_BASE + active_lru);
| ~~~~~~~~~~~ ^ ~~~~~~~~~~
mm/vmscan.c:6247:3: warning: arithmetic between different enumeration types ('enum vm_event_item' and 'enum zone_type') [-Wenum-enum-conversion]
6247 | __count_zid_vm_events(ALLOCSTALL, sc->reclaim_idx, 1);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:135:34: note: expanded from macro '__count_zid_vm_events'
135 | __count_vm_events(item##_NORMAL - ZONE_NORMAL + zid, delta)
| ~~~~~~~~~~~~~ ^ ~~~~~~~~~~~
11 warnings and 1 error generated.
..
vim +/PG_mte_lock +25 arch/arm64/include/asm/hugetlb.h
21
22 static inline void arch_clear_hugetlb_flags(struct folio *folio)
23 {
24 const unsigned long clear_flags = BIT(PG_dcache_clean) |
> 25 BIT(PG_mte_tagged) | BIT(PG_mte_lock);
26
27 if (!system_supports_mte()) {
28 clear_bit(PG_dcache_clean, &folio->flags);
29 return;
30 }
31
32 folio->flags &= ~clear_flags;
33 }
34 #define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
35
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [v2 PATCH 1/2] hugetlb: arm64: add mte support
2024-08-26 11:15 ` [v2 PATCH 1/2] hugetlb: arm64: add mte support kernel test robot
@ 2024-08-26 17:02 ` Yang Shi
0 siblings, 0 replies; 10+ messages in thread
From: Yang Shi @ 2024-08-26 17:02 UTC (permalink / raw)
To: kernel test robot, catalin.marinas, will, muchun.song, akpm
Cc: llvm, oe-kbuild-all, linux-arm-kernel, linux-mm, linux-kernel
On 8/26/24 4:15 AM, kernel test robot wrote:
> Hi Yang,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on arm64/for-next/core]
> [also build test ERROR on kvmarm/next akpm-mm/mm-everything linus/master v6.11-rc5 next-20240823]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Yang-Shi/selftests-arm64-add-hugetlb-mte-tests/20240822-024935
> base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core
> patch link: https://lore.kernel.org/r/20240821184752.3535276-1-yang%40os.amperecomputing.com
> patch subject: [v2 PATCH 1/2] hugetlb: arm64: add mte support
> config: arm64-randconfig-004-20240824 (https://download.01.org/0day-ci/archive/20240826/202408261816.ACEJvgZw-lkp@intel.com/config)
> compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 08e5a1de8227512d4774a534b91cb2353cef6284)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240826/202408261816.ACEJvgZw-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202408261816.ACEJvgZw-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
> In file included from mm/gup.c:7:
> In file included from include/linux/mm.h:2228:
> include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 501 | item];
> | ~~~~
> include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 508 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 520 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> In file included from mm/gup.c:18:
> In file included from include/linux/hugetlb.h:798:
>>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
> 25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
Thanks for the report. It is because the config has CONFIG_MTE disabled.
I will fix this. But I'd prefer the response from the maintainers then
fix all them together.
> | ^
> In file included from mm/gup.c:20:
> include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 49 | NR_ZONE_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~~~~~~ ^ ~~~
> 6 warnings and 1 error generated.
> --
> In file included from mm/swap.c:17:
> In file included from include/linux/mm.h:2228:
> include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 501 | item];
> | ~~~~
> include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 508 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 520 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> In file included from mm/swap.c:26:
> include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 49 | NR_ZONE_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~~~~~~ ^ ~~~
> In file included from mm/swap.c:36:
> In file included from include/linux/hugetlb.h:798:
>>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
> 25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> | ^
> 6 warnings and 1 error generated.
> --
> In file included from mm/shmem.c:28:
> In file included from include/linux/ramfs.h:5:
> In file included from include/linux/fs_parser.h:11:
> In file included from include/linux/fs_context.h:14:
> In file included from include/linux/security.h:33:
> In file included from include/linux/mm.h:2228:
> include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 501 | item];
> | ~~~~
> include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 508 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 520 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> In file included from mm/shmem.c:39:
> In file included from include/linux/hugetlb.h:798:
>>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
> 25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> | ^
> In file included from mm/shmem.c:58:
> include/linux/mman.h:158:9: warning: division by zero is undefined [-Wdivision-by-zero]
> 158 | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ) |
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
> 136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
> | ^ ~~~~~~~~~~~~~~~~~
> include/linux/mman.h:159:9: warning: division by zero is undefined [-Wdivision-by-zero]
> 159 | _calc_vm_trans(flags, MAP_STACK, VM_NOHUGEPAGE) |
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
> 136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
> | ^ ~~~~~~~~~~~~~~~~~
> 6 warnings and 1 error generated.
> --
> In file included from mm/mprotect.c:12:
> In file included from include/linux/pagewalk.h:5:
> In file included from include/linux/mm.h:2228:
> include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 501 | item];
> | ~~~~
> include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 508 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 520 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> In file included from mm/mprotect.c:13:
> In file included from include/linux/hugetlb.h:798:
>>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
> 25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> | ^
> In file included from mm/mprotect.c:15:
> include/linux/mman.h:158:9: warning: division by zero is undefined [-Wdivision-by-zero]
> 158 | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ) |
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
> 136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
> | ^ ~~~~~~~~~~~~~~~~~
> include/linux/mman.h:159:9: warning: division by zero is undefined [-Wdivision-by-zero]
> 159 | _calc_vm_trans(flags, MAP_STACK, VM_NOHUGEPAGE) |
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
> 136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
> | ^ ~~~~~~~~~~~~~~~~~
> In file included from mm/mprotect.c:30:
> include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 49 | NR_ZONE_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~~~~~~ ^ ~~~
> 8 warnings and 1 error generated.
> --
> In file included from mm/show_mem.c:8:
> In file included from include/linux/blkdev.h:9:
> In file included from include/linux/blk_types.h:10:
> In file included from include/linux/bvec.h:10:
> In file included from include/linux/highmem.h:8:
> In file included from include/linux/cacheflush.h:5:
> In file included from arch/arm64/include/asm/cacheflush.h:11:
> In file included from include/linux/kgdb.h:19:
> In file included from include/linux/kprobes.h:28:
> In file included from include/linux/ftrace.h:13:
> In file included from include/linux/kallsyms.h:13:
> In file included from include/linux/mm.h:2228:
> include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 501 | item];
> | ~~~~
> include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 508 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 520 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> In file included from mm/show_mem.c:12:
> In file included from include/linux/hugetlb.h:798:
>>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
> 25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> | ^
> 4 warnings and 1 error generated.
> --
> In file included from mm/mremap.c:11:
> In file included from include/linux/mm.h:2228:
> include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 501 | item];
> | ~~~~
> include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 508 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 520 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> In file included from mm/mremap.c:12:
> include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 49 | NR_ZONE_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~~~~~~ ^ ~~~
> In file included from mm/mremap.c:13:
> In file included from include/linux/hugetlb.h:798:
>>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
> 25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> | ^
> In file included from mm/mremap.c:16:
> include/linux/mman.h:158:9: warning: division by zero is undefined [-Wdivision-by-zero]
> 158 | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ) |
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
> 136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
> | ^ ~~~~~~~~~~~~~~~~~
> include/linux/mman.h:159:9: warning: division by zero is undefined [-Wdivision-by-zero]
> 159 | _calc_vm_trans(flags, MAP_STACK, VM_NOHUGEPAGE) |
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
> 136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
> | ^ ~~~~~~~~~~~~~~~~~
> 8 warnings and 1 error generated.
> --
> In file included from mm/huge_memory.c:8:
> In file included from include/linux/mm.h:2228:
> include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 501 | item];
> | ~~~~
> include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 508 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 520 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> In file included from mm/huge_memory.c:14:
> In file included from include/linux/hugetlb.h:798:
>>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
> 25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> | ^
> In file included from mm/huge_memory.c:19:
> include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 49 | NR_ZONE_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~~~~~~ ^ ~~~
> In file included from mm/huge_memory.c:27:
> include/linux/mman.h:158:9: warning: division by zero is undefined [-Wdivision-by-zero]
> 158 | _calc_vm_trans(flags, MAP_SYNC, VM_SYNC ) |
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
> 136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
> | ^ ~~~~~~~~~~~~~~~~~
> include/linux/mman.h:159:9: warning: division by zero is undefined [-Wdivision-by-zero]
> 159 | _calc_vm_trans(flags, MAP_STACK, VM_NOHUGEPAGE) |
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/mman.h:136:21: note: expanded from macro '_calc_vm_trans'
> 136 | : ((x) & (bit1)) / ((bit1) / (bit2))))
> | ^ ~~~~~~~~~~~~~~~~~
> 8 warnings and 1 error generated.
> --
> In file included from mm/vmscan.c:15:
> In file included from include/linux/mm.h:2228:
> include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 501 | item];
> | ~~~~
> include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 508 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
> 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~ ^
> 520 | NR_VM_NUMA_EVENT_ITEMS +
> | ~~~~~~~~~~~~~~~~~~~~~~
> In file included from mm/vmscan.c:30:
> include/linux/mm_inline.h:47:41: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 47 | __mod_lruvec_state(lruvec, NR_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~ ^ ~~~
> include/linux/mm_inline.h:49:22: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 49 | NR_ZONE_LRU_BASE + lru, nr_pages);
> | ~~~~~~~~~~~~~~~~ ^ ~~~
> In file included from mm/vmscan.c:42:
> In file included from include/linux/migrate.h:8:
> In file included from include/linux/hugetlb.h:798:
>>> arch/arm64/include/asm/hugetlb.h:25:28: error: use of undeclared identifier 'PG_mte_lock'
> 25 | BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> | ^
> mm/vmscan.c:401:51: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 401 | size += zone_page_state(zone, NR_ZONE_LRU_BASE + lru);
> | ~~~~~~~~~~~~~~~~ ^ ~~~
> mm/vmscan.c:1729:4: warning: arithmetic between different enumeration types ('enum vm_event_item' and 'enum zone_type') [-Wenum-enum-conversion]
> 1729 | __count_zid_vm_events(PGSCAN_SKIP, zid, nr_skipped[zid]);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:135:34: note: expanded from macro '__count_zid_vm_events'
> 135 | __count_vm_events(item##_NORMAL - ZONE_NORMAL + zid, delta)
> | ~~~~~~~~~~~~~ ^ ~~~~~~~~~~~
> mm/vmscan.c:2232:51: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 2232 | inactive = lruvec_page_state(lruvec, NR_LRU_BASE + inactive_lru);
> | ~~~~~~~~~~~ ^ ~~~~~~~~~~~~
> mm/vmscan.c:2233:49: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
> 2233 | active = lruvec_page_state(lruvec, NR_LRU_BASE + active_lru);
> | ~~~~~~~~~~~ ^ ~~~~~~~~~~
> mm/vmscan.c:6247:3: warning: arithmetic between different enumeration types ('enum vm_event_item' and 'enum zone_type') [-Wenum-enum-conversion]
> 6247 | __count_zid_vm_events(ALLOCSTALL, sc->reclaim_idx, 1);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/vmstat.h:135:34: note: expanded from macro '__count_zid_vm_events'
> 135 | __count_vm_events(item##_NORMAL - ZONE_NORMAL + zid, delta)
> | ~~~~~~~~~~~~~ ^ ~~~~~~~~~~~
> 11 warnings and 1 error generated.
> ..
>
>
> vim +/PG_mte_lock +25 arch/arm64/include/asm/hugetlb.h
>
> 21
> 22 static inline void arch_clear_hugetlb_flags(struct folio *folio)
> 23 {
> 24 const unsigned long clear_flags = BIT(PG_dcache_clean) |
> > 25 BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> 26
> 27 if (!system_supports_mte()) {
> 28 clear_bit(PG_dcache_clean, &folio->flags);
> 29 return;
> 30 }
> 31
> 32 folio->flags &= ~clear_flags;
> 33 }
> 34 #define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
> 35
>
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [v2 PATCH 1/2] hugetlb: arm64: add mte support
2024-08-21 18:47 [v2 PATCH 1/2] hugetlb: arm64: add mte support Yang Shi
2024-08-21 18:47 ` [v2 PATCH 2/2] selftests: arm64: add hugetlb mte tests Yang Shi
2024-08-26 11:15 ` [v2 PATCH 1/2] hugetlb: arm64: add mte support kernel test robot
@ 2024-08-28 17:57 ` Yang Shi
2024-09-02 14:33 ` David Hildenbrand
3 siblings, 0 replies; 10+ messages in thread
From: Yang Shi @ 2024-08-28 17:57 UTC (permalink / raw)
To: catalin.marinas, will, muchun.song, akpm
Cc: linux-arm-kernel, linux-mm, linux-kernel
On 8/21/24 11:47 AM, Yang Shi wrote:
> Enable MTE support for hugetlb.
>
> The MTE page flags will be set on the head page only. When copying
> hugetlb folio, the tags for all tail pages will be copied when copying
> head page.
>
> When freeing hugetlb folio, the MTE flags will be cleared.
>
> Signed-off-by: Yang Shi <yang@os.amperecomputing.com>
> ---
> arch/arm64/include/asm/hugetlb.h | 11 ++++++++++-
> arch/arm64/include/asm/mman.h | 3 ++-
> arch/arm64/kernel/hibernate.c | 7 +++++++
> arch/arm64/kernel/mte.c | 25 +++++++++++++++++++++++--
> arch/arm64/kvm/guest.c | 16 +++++++++++++---
> arch/arm64/kvm/mmu.c | 11 +++++++++++
> arch/arm64/mm/copypage.c | 25 +++++++++++++++++++++++--
> fs/hugetlbfs/inode.c | 2 +-
> 8 files changed, 90 insertions(+), 10 deletions(-)
>
> v2: * Reimplemented the patch to fix the comments from Catalin.
> * Added test cases (patch #2) per Catalin.
Ping... Is there any comment on this version?
Thanks,
Yang
>
> diff --git a/arch/arm64/include/asm/hugetlb.h b/arch/arm64/include/asm/hugetlb.h
> index 293f880865e8..00a1f75d40ee 100644
> --- a/arch/arm64/include/asm/hugetlb.h
> +++ b/arch/arm64/include/asm/hugetlb.h
> @@ -11,6 +11,7 @@
> #define __ASM_HUGETLB_H
>
> #include <asm/cacheflush.h>
> +#include <asm/mte.h>
> #include <asm/page.h>
>
> #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
> @@ -20,7 +21,15 @@ extern bool arch_hugetlb_migration_supported(struct hstate *h);
>
> static inline void arch_clear_hugetlb_flags(struct folio *folio)
> {
> - clear_bit(PG_dcache_clean, &folio->flags);
> + const unsigned long clear_flags = BIT(PG_dcache_clean) |
> + BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> +
> + if (!system_supports_mte()) {
> + clear_bit(PG_dcache_clean, &folio->flags);
> + return;
> + }
> +
> + folio->flags &= ~clear_flags;
> }
> #define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
>
> diff --git a/arch/arm64/include/asm/mman.h b/arch/arm64/include/asm/mman.h
> index 5966ee4a6154..304dfc499e68 100644
> --- a/arch/arm64/include/asm/mman.h
> +++ b/arch/arm64/include/asm/mman.h
> @@ -28,7 +28,8 @@ static inline unsigned long arch_calc_vm_flag_bits(unsigned long flags)
> * backed by tags-capable memory. The vm_flags may be overridden by a
> * filesystem supporting MTE (RAM-based).
> */
> - if (system_supports_mte() && (flags & MAP_ANONYMOUS))
> + if (system_supports_mte() &&
> + (flags & (MAP_ANONYMOUS | MAP_HUGETLB)))
> return VM_MTE_ALLOWED;
>
> return 0;
> diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c
> index 02870beb271e..722e76f29141 100644
> --- a/arch/arm64/kernel/hibernate.c
> +++ b/arch/arm64/kernel/hibernate.c
> @@ -266,10 +266,17 @@ static int swsusp_mte_save_tags(void)
> max_zone_pfn = zone_end_pfn(zone);
> for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) {
> struct page *page = pfn_to_online_page(pfn);
> + struct folio *folio;
>
> if (!page)
> continue;
>
> + folio = page_folio(page);
> +
> + if (folio_test_hugetlb(folio) &&
> + !page_mte_tagged(&folio->page))
> + continue;
> +
> if (!page_mte_tagged(page))
> continue;
>
> diff --git a/arch/arm64/kernel/mte.c b/arch/arm64/kernel/mte.c
> index 6174671be7c1..b21f706018f7 100644
> --- a/arch/arm64/kernel/mte.c
> +++ b/arch/arm64/kernel/mte.c
> @@ -38,7 +38,22 @@ EXPORT_SYMBOL_GPL(mte_async_or_asymm_mode);
> void mte_sync_tags(pte_t pte, unsigned int nr_pages)
> {
> struct page *page = pte_page(pte);
> - unsigned int i;
> + struct folio *folio = page_folio(page);
> + unsigned long i;
> +
> + if (folio_test_hugetlb(folio)) {
> + unsigned long nr = folio_nr_pages(folio);
> + /* Hugetlb MTE flags are set for head page only */
> + if (try_page_mte_tagging(&folio->page)) {
> + for (i = 0; i < nr; i++, page++)
> + mte_clear_page_tags(page_address(page));
> + set_page_mte_tagged(&folio->page);
> + }
> +
> + smp_wmb();
> +
> + return;
> + }
>
> /* if PG_mte_tagged is set, tags have already been initialised */
> for (i = 0; i < nr_pages; i++, page++) {
> @@ -410,6 +425,7 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr,
> void *maddr;
> struct page *page = get_user_page_vma_remote(mm, addr,
> gup_flags, &vma);
> + struct folio *folio;
>
> if (IS_ERR(page)) {
> err = PTR_ERR(page);
> @@ -428,7 +444,12 @@ static int __access_remote_tags(struct mm_struct *mm, unsigned long addr,
> put_page(page);
> break;
> }
> - WARN_ON_ONCE(!page_mte_tagged(page));
> +
> + folio = page_folio(page);
> + if (folio_test_hugetlb(folio))
> + WARN_ON_ONCE(!page_mte_tagged(&folio->page));
> + else
> + WARN_ON_ONCE(!page_mte_tagged(page));
>
> /* limit access to the end of the page */
> offset = offset_in_page(addr);
> diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
> index 11098eb7eb44..77e181d96e97 100644
> --- a/arch/arm64/kvm/guest.c
> +++ b/arch/arm64/kvm/guest.c
> @@ -1050,6 +1050,7 @@ int kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
> void *maddr;
> unsigned long num_tags;
> struct page *page;
> + struct folio *folio;
>
> if (is_error_noslot_pfn(pfn)) {
> ret = -EFAULT;
> @@ -1062,10 +1063,13 @@ int kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
> ret = -EFAULT;
> goto out;
> }
> + folio = page_folio(page);
> maddr = page_address(page);
>
> if (!write) {
> - if (page_mte_tagged(page))
> + if (page_mte_tagged(page) ||
> + (folio_test_hugetlb(folio) &&
> + page_mte_tagged(&folio->page)))
> num_tags = mte_copy_tags_to_user(tags, maddr,
> MTE_GRANULES_PER_PAGE);
> else
> @@ -1079,14 +1083,20 @@ int kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
> * __set_ptes() in the VMM but still overriding the
> * tags, hence ignoring the return value.
> */
> - try_page_mte_tagging(page);
> + if (folio_test_hugetlb(folio))
> + try_page_mte_tagging(&folio->page);
> + else
> + try_page_mte_tagging(page);
> num_tags = mte_copy_tags_from_user(maddr, tags,
> MTE_GRANULES_PER_PAGE);
>
> /* uaccess failed, don't leave stale tags */
> if (num_tags != MTE_GRANULES_PER_PAGE)
> mte_clear_page_tags(maddr);
> - set_page_mte_tagged(page);
> + if (folio_test_hugetlb(folio))
> + set_page_mte_tagged(&folio->page);
> + else
> + set_page_mte_tagged(page);
>
> kvm_release_pfn_dirty(pfn);
> }
> diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
> index 6981b1bc0946..1fa51ac4e3f4 100644
> --- a/arch/arm64/kvm/mmu.c
> +++ b/arch/arm64/kvm/mmu.c
> @@ -1401,10 +1401,21 @@ static void sanitise_mte_tags(struct kvm *kvm, kvm_pfn_t pfn,
> {
> unsigned long i, nr_pages = size >> PAGE_SHIFT;
> struct page *page = pfn_to_page(pfn);
> + struct folio *folio = page_folio(page);
>
> if (!kvm_has_mte(kvm))
> return;
>
> + if (folio_test_hugetlb(folio)) {
> + /* Hugetlb has MTE flags set on head page only */
> + if (try_page_mte_tagging(&folio->page)) {
> + for (i = 0; i < nr_pages; i++, page++)
> + mte_clear_page_tags(page_address(page));
> + set_page_mte_tagged(&folio->page);
> + }
> + return;
> + }
> +
> for (i = 0; i < nr_pages; i++, page++) {
> if (try_page_mte_tagging(page)) {
> mte_clear_page_tags(page_address(page));
> diff --git a/arch/arm64/mm/copypage.c b/arch/arm64/mm/copypage.c
> index a7bb20055ce0..0f3b07d4a5cf 100644
> --- a/arch/arm64/mm/copypage.c
> +++ b/arch/arm64/mm/copypage.c
> @@ -18,6 +18,9 @@ void copy_highpage(struct page *to, struct page *from)
> {
> void *kto = page_address(to);
> void *kfrom = page_address(from);
> + struct folio *src = page_folio(from);
> + struct folio *dst = page_folio(to);
> + unsigned int i, nr_pages;
>
> copy_page(kto, kfrom);
>
> @@ -27,8 +30,26 @@ void copy_highpage(struct page *to, struct page *from)
> if (system_supports_mte() && page_mte_tagged(from)) {
> /* It's a new page, shouldn't have been tagged yet */
> WARN_ON_ONCE(!try_page_mte_tagging(to));
> - mte_copy_page_tags(kto, kfrom);
> - set_page_mte_tagged(to);
> +
> + /* Populate tags for all subpages if hugetlb */
> + if (folio_test_hugetlb(src)) {
> + /*
> + * MTE page flag is just set on the head page of
> + * hugetlb. If from has MTE flag set, it must be the
> + * head page.
> + */
> + VM_BUG_ON(!PageHead(from));
> + nr_pages = folio_nr_pages(src);
> + for (i = 0; i < nr_pages; i++, to++, from++) {
> + kto = page_address(to);
> + kfrom = page_address(from);
> + mte_copy_page_tags(kto, kfrom);
> + }
> + set_page_mte_tagged(&dst->page);
> + } else {
> + mte_copy_page_tags(kto, kfrom);
> + set_page_mte_tagged(to);
> + }
> }
> }
> EXPORT_SYMBOL(copy_highpage);
> diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
> index 9f6cff356796..f944e8e7126b 100644
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -110,7 +110,7 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma)
> * way when do_mmap unwinds (may be important on powerpc
> * and ia64).
> */
> - vm_flags_set(vma, VM_HUGETLB | VM_DONTEXPAND);
> + vm_flags_set(vma, VM_HUGETLB | VM_DONTEXPAND | VM_MTE_ALLOWED);
> vma->vm_ops = &hugetlb_vm_ops;
>
> ret = seal_check_write(info->seals, vma);
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [v2 PATCH 1/2] hugetlb: arm64: add mte support
2024-08-21 18:47 [v2 PATCH 1/2] hugetlb: arm64: add mte support Yang Shi
` (2 preceding siblings ...)
2024-08-28 17:57 ` Yang Shi
@ 2024-09-02 14:33 ` David Hildenbrand
2024-09-03 16:46 ` Yang Shi
3 siblings, 1 reply; 10+ messages in thread
From: David Hildenbrand @ 2024-09-02 14:33 UTC (permalink / raw)
To: Yang Shi, catalin.marinas, will, muchun.song, akpm
Cc: linux-arm-kernel, linux-mm, linux-kernel
On 21.08.24 20:47, Yang Shi wrote:
> Enable MTE support for hugetlb.
>
> The MTE page flags will be set on the head page only. When copying
> hugetlb folio, the tags for all tail pages will be copied when copying
> head page.
>
> When freeing hugetlb folio, the MTE flags will be cleared.
>
> Signed-off-by: Yang Shi <yang@os.amperecomputing.com>
> ---
> arch/arm64/include/asm/hugetlb.h | 11 ++++++++++-
> arch/arm64/include/asm/mman.h | 3 ++-
> arch/arm64/kernel/hibernate.c | 7 +++++++
> arch/arm64/kernel/mte.c | 25 +++++++++++++++++++++++--
> arch/arm64/kvm/guest.c | 16 +++++++++++++---
> arch/arm64/kvm/mmu.c | 11 +++++++++++
> arch/arm64/mm/copypage.c | 25 +++++++++++++++++++++++--
> fs/hugetlbfs/inode.c | 2 +-
> 8 files changed, 90 insertions(+), 10 deletions(-)
>
> v2: * Reimplemented the patch to fix the comments from Catalin.
> * Added test cases (patch #2) per Catalin.
>
> diff --git a/arch/arm64/include/asm/hugetlb.h b/arch/arm64/include/asm/hugetlb.h
> index 293f880865e8..00a1f75d40ee 100644
> --- a/arch/arm64/include/asm/hugetlb.h
> +++ b/arch/arm64/include/asm/hugetlb.h
> @@ -11,6 +11,7 @@
> #define __ASM_HUGETLB_H
>
> #include <asm/cacheflush.h>
> +#include <asm/mte.h>
> #include <asm/page.h>
>
> #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
> @@ -20,7 +21,15 @@ extern bool arch_hugetlb_migration_supported(struct hstate *h);
>
> static inline void arch_clear_hugetlb_flags(struct folio *folio)
> {
> - clear_bit(PG_dcache_clean, &folio->flags);
> + const unsigned long clear_flags = BIT(PG_dcache_clean) |
> + BIT(PG_mte_tagged) | BIT(PG_mte_lock);
> +
> + if (!system_supports_mte()) {
> + clear_bit(PG_dcache_clean, &folio->flags);
> + return;
> + }
> +
> + folio->flags &= ~clear_flags;
> }
> #define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
>
> diff --git a/arch/arm64/include/asm/mman.h b/arch/arm64/include/asm/mman.h
> index 5966ee4a6154..304dfc499e68 100644
> --- a/arch/arm64/include/asm/mman.h
> +++ b/arch/arm64/include/asm/mman.h
> @@ -28,7 +28,8 @@ static inline unsigned long arch_calc_vm_flag_bits(unsigned long flags)
> * backed by tags-capable memory. The vm_flags may be overridden by a
> * filesystem supporting MTE (RAM-based).
> */
> - if (system_supports_mte() && (flags & MAP_ANONYMOUS))
> + if (system_supports_mte() &&
> + (flags & (MAP_ANONYMOUS | MAP_HUGETLB)))
> return VM_MTE_ALLOWED;
>
> return 0;
> diff --git a/arch/arm64/kernel/hibernate.c b/arch/arm64/kernel/hibernate.c
> index 02870beb271e..722e76f29141 100644
> --- a/arch/arm64/kernel/hibernate.c
> +++ b/arch/arm64/kernel/hibernate.c
> @@ -266,10 +266,17 @@ static int swsusp_mte_save_tags(void)
> max_zone_pfn = zone_end_pfn(zone);
> for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) {
> struct page *page = pfn_to_online_page(pfn);
> + struct folio *folio;
>
> if (!page)
> continue;
>
> + folio = page_folio(page);
> +
> + if (folio_test_hugetlb(folio) &&
> + !page_mte_tagged(&folio->page))
> + continue;
Can we have folio_test_mte_tagged() whereby you make sure that only
folio_test_hugetlb() uses it for now (VM_WARN_ON_ONCE) and then make
sure that nobody uses page_mte_tagged() on hugetlb folios (VM_WARN_ON_ONCE)?
Same for folio_set_mte_tagged() and other functions. We could slap a
"hugetlb" into the function names, but maybe in the future we'll be able
to use a single flag per folio (I know, it's complicated ...).
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [v2 PATCH 1/2] hugetlb: arm64: add mte support
2024-09-02 14:33 ` David Hildenbrand
@ 2024-09-03 16:46 ` Yang Shi
2024-09-03 21:35 ` David Hildenbrand
0 siblings, 1 reply; 10+ messages in thread
From: Yang Shi @ 2024-09-03 16:46 UTC (permalink / raw)
To: David Hildenbrand, catalin.marinas, will, muchun.song, akpm
Cc: linux-arm-kernel, linux-mm, linux-kernel
On 9/2/24 7:33 AM, David Hildenbrand wrote:
> On 21.08.24 20:47, Yang Shi wrote:
>> Enable MTE support for hugetlb.
>>
>> The MTE page flags will be set on the head page only. When copying
>> hugetlb folio, the tags for all tail pages will be copied when copying
>> head page.
>>
>> When freeing hugetlb folio, the MTE flags will be cleared.
>>
>> Signed-off-by: Yang Shi <yang@os.amperecomputing.com>
>> ---
>> arch/arm64/include/asm/hugetlb.h | 11 ++++++++++-
>> arch/arm64/include/asm/mman.h | 3 ++-
>> arch/arm64/kernel/hibernate.c | 7 +++++++
>> arch/arm64/kernel/mte.c | 25 +++++++++++++++++++++++--
>> arch/arm64/kvm/guest.c | 16 +++++++++++++---
>> arch/arm64/kvm/mmu.c | 11 +++++++++++
>> arch/arm64/mm/copypage.c | 25 +++++++++++++++++++++++--
>> fs/hugetlbfs/inode.c | 2 +-
>> 8 files changed, 90 insertions(+), 10 deletions(-)
>>
>> v2: * Reimplemented the patch to fix the comments from Catalin.
>> * Added test cases (patch #2) per Catalin.
>>
>> diff --git a/arch/arm64/include/asm/hugetlb.h
>> b/arch/arm64/include/asm/hugetlb.h
>> index 293f880865e8..00a1f75d40ee 100644
>> --- a/arch/arm64/include/asm/hugetlb.h
>> +++ b/arch/arm64/include/asm/hugetlb.h
>> @@ -11,6 +11,7 @@
>> #define __ASM_HUGETLB_H
>> #include <asm/cacheflush.h>
>> +#include <asm/mte.h>
>> #include <asm/page.h>
>> #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
>> @@ -20,7 +21,15 @@ extern bool
>> arch_hugetlb_migration_supported(struct hstate *h);
>> static inline void arch_clear_hugetlb_flags(struct folio *folio)
>> {
>> - clear_bit(PG_dcache_clean, &folio->flags);
>> + const unsigned long clear_flags = BIT(PG_dcache_clean) |
>> + BIT(PG_mte_tagged) | BIT(PG_mte_lock);
>> +
>> + if (!system_supports_mte()) {
>> + clear_bit(PG_dcache_clean, &folio->flags);
>> + return;
>> + }
>> +
>> + folio->flags &= ~clear_flags;
>> }
>> #define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
>> diff --git a/arch/arm64/include/asm/mman.h
>> b/arch/arm64/include/asm/mman.h
>> index 5966ee4a6154..304dfc499e68 100644
>> --- a/arch/arm64/include/asm/mman.h
>> +++ b/arch/arm64/include/asm/mman.h
>> @@ -28,7 +28,8 @@ static inline unsigned long
>> arch_calc_vm_flag_bits(unsigned long flags)
>> * backed by tags-capable memory. The vm_flags may be
>> overridden by a
>> * filesystem supporting MTE (RAM-based).
>> */
>> - if (system_supports_mte() && (flags & MAP_ANONYMOUS))
>> + if (system_supports_mte() &&
>> + (flags & (MAP_ANONYMOUS | MAP_HUGETLB)))
>> return VM_MTE_ALLOWED;
>> return 0;
>> diff --git a/arch/arm64/kernel/hibernate.c
>> b/arch/arm64/kernel/hibernate.c
>> index 02870beb271e..722e76f29141 100644
>> --- a/arch/arm64/kernel/hibernate.c
>> +++ b/arch/arm64/kernel/hibernate.c
>> @@ -266,10 +266,17 @@ static int swsusp_mte_save_tags(void)
>> max_zone_pfn = zone_end_pfn(zone);
>> for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) {
>> struct page *page = pfn_to_online_page(pfn);
>> + struct folio *folio;
>> if (!page)
>> continue;
>> + folio = page_folio(page);
>> +
>> + if (folio_test_hugetlb(folio) &&
>> + !page_mte_tagged(&folio->page))
>> + continue;
>
> Can we have folio_test_mte_tagged() whereby you make sure that only
> folio_test_hugetlb() uses it for now (VM_WARN_ON_ONCE) and then make
> sure that nobody uses page_mte_tagged() on hugetlb folios
> (VM_WARN_ON_ONCE)?
IIUC, you mean something like the below?
bool folio_test_mte_tagged(struct folio *folio)
{
VM_WARN_ON_ONCE(!folio_test_hugetlb(folio));
return test_bit(PG_mte_tagged, &folio->page->flags);
}
bool page_mte_tagged(struct page *page)
{
struct folio *folio = page_folio(page);
VM_WARN_ON_ONCE(folio_test_hugetlb(folio));
return test_bit(PG_mte_tagged, &pge->flags);
}
>
> Same for folio_set_mte_tagged() and other functions. We could slap a
> "hugetlb" into the function names, but maybe in the future we'll be
> able to use a single flag per folio (I know, it's complicated ...).
A single flag per folio should be the future direction, but I haven't
done the research so can't tell how complicated it will be.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [v2 PATCH 1/2] hugetlb: arm64: add mte support
2024-09-03 16:46 ` Yang Shi
@ 2024-09-03 21:35 ` David Hildenbrand
2024-09-04 17:57 ` Yang Shi
0 siblings, 1 reply; 10+ messages in thread
From: David Hildenbrand @ 2024-09-03 21:35 UTC (permalink / raw)
To: Yang Shi, catalin.marinas, will, muchun.song, akpm
Cc: linux-arm-kernel, linux-mm, linux-kernel
On 03.09.24 18:46, Yang Shi wrote:
>
>
> On 9/2/24 7:33 AM, David Hildenbrand wrote:
>> On 21.08.24 20:47, Yang Shi wrote:
>>> Enable MTE support for hugetlb.
>>>
>>> The MTE page flags will be set on the head page only. When copying
>>> hugetlb folio, the tags for all tail pages will be copied when copying
>>> head page.
>>>
>>> When freeing hugetlb folio, the MTE flags will be cleared.
>>>
>>> Signed-off-by: Yang Shi <yang@os.amperecomputing.com>
>>> ---
>>> arch/arm64/include/asm/hugetlb.h | 11 ++++++++++-
>>> arch/arm64/include/asm/mman.h | 3 ++-
>>> arch/arm64/kernel/hibernate.c | 7 +++++++
>>> arch/arm64/kernel/mte.c | 25 +++++++++++++++++++++++--
>>> arch/arm64/kvm/guest.c | 16 +++++++++++++---
>>> arch/arm64/kvm/mmu.c | 11 +++++++++++
>>> arch/arm64/mm/copypage.c | 25 +++++++++++++++++++++++--
>>> fs/hugetlbfs/inode.c | 2 +-
>>> 8 files changed, 90 insertions(+), 10 deletions(-)
>>>
>>> v2: * Reimplemented the patch to fix the comments from Catalin.
>>> * Added test cases (patch #2) per Catalin.
>>>
>>> diff --git a/arch/arm64/include/asm/hugetlb.h
>>> b/arch/arm64/include/asm/hugetlb.h
>>> index 293f880865e8..00a1f75d40ee 100644
>>> --- a/arch/arm64/include/asm/hugetlb.h
>>> +++ b/arch/arm64/include/asm/hugetlb.h
>>> @@ -11,6 +11,7 @@
>>> #define __ASM_HUGETLB_H
>>> #include <asm/cacheflush.h>
>>> +#include <asm/mte.h>
>>> #include <asm/page.h>
>>> #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
>>> @@ -20,7 +21,15 @@ extern bool
>>> arch_hugetlb_migration_supported(struct hstate *h);
>>> static inline void arch_clear_hugetlb_flags(struct folio *folio)
>>> {
>>> - clear_bit(PG_dcache_clean, &folio->flags);
>>> + const unsigned long clear_flags = BIT(PG_dcache_clean) |
>>> + BIT(PG_mte_tagged) | BIT(PG_mte_lock);
>>> +
>>> + if (!system_supports_mte()) {
>>> + clear_bit(PG_dcache_clean, &folio->flags);
>>> + return;
>>> + }
>>> +
>>> + folio->flags &= ~clear_flags;
>>> }
>>> #define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
>>> diff --git a/arch/arm64/include/asm/mman.h
>>> b/arch/arm64/include/asm/mman.h
>>> index 5966ee4a6154..304dfc499e68 100644
>>> --- a/arch/arm64/include/asm/mman.h
>>> +++ b/arch/arm64/include/asm/mman.h
>>> @@ -28,7 +28,8 @@ static inline unsigned long
>>> arch_calc_vm_flag_bits(unsigned long flags)
>>> * backed by tags-capable memory. The vm_flags may be
>>> overridden by a
>>> * filesystem supporting MTE (RAM-based).
>>> */
>>> - if (system_supports_mte() && (flags & MAP_ANONYMOUS))
>>> + if (system_supports_mte() &&
>>> + (flags & (MAP_ANONYMOUS | MAP_HUGETLB)))
>>> return VM_MTE_ALLOWED;
>>> return 0;
>>> diff --git a/arch/arm64/kernel/hibernate.c
>>> b/arch/arm64/kernel/hibernate.c
>>> index 02870beb271e..722e76f29141 100644
>>> --- a/arch/arm64/kernel/hibernate.c
>>> +++ b/arch/arm64/kernel/hibernate.c
>>> @@ -266,10 +266,17 @@ static int swsusp_mte_save_tags(void)
>>> max_zone_pfn = zone_end_pfn(zone);
>>> for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn; pfn++) {
>>> struct page *page = pfn_to_online_page(pfn);
>>> + struct folio *folio;
>>> if (!page)
>>> continue;
>>> + folio = page_folio(page);
>>> +
>>> + if (folio_test_hugetlb(folio) &&
>>> + !page_mte_tagged(&folio->page))
>>> + continue;
>>
>> Can we have folio_test_mte_tagged() whereby you make sure that only
>> folio_test_hugetlb() uses it for now (VM_WARN_ON_ONCE) and then make
>> sure that nobody uses page_mte_tagged() on hugetlb folios
>> (VM_WARN_ON_ONCE)?
>
>
> IIUC, you mean something like the below?
>
> bool folio_test_mte_tagged(struct folio *folio)
> {
> VM_WARN_ON_ONCE(!folio_test_hugetlb(folio));
>
> return test_bit(PG_mte_tagged, &folio->page->flags);
folio->flags
> }
>
> bool page_mte_tagged(struct page *page)
> {
> struct folio *folio = page_folio(page);
>
> VM_WARN_ON_ONCE(folio_test_hugetlb(folio));
Yes, but better as
VM_WARN_ON_ONCE(folio_test_hugetlb(page_folio(page)));
>
> return test_bit(PG_mte_tagged, &pge->flags);
> }
>
>>
>> Same for folio_set_mte_tagged() and other functions. We could slap a
>> "hugetlb" into the function names, but maybe in the future we'll be
>> able to use a single flag per folio (I know, it's complicated ...).
>
> A single flag per folio should be the future direction, but I haven't
> done the research so can't tell how complicated it will be.
There were some discussions on it, and it's tricky. So maybe we should
really just have folio_test_hugetlb_mte_tagged() etc. for now
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [v2 PATCH 1/2] hugetlb: arm64: add mte support
2024-09-03 21:35 ` David Hildenbrand
@ 2024-09-04 17:57 ` Yang Shi
2024-09-04 18:35 ` David Hildenbrand
0 siblings, 1 reply; 10+ messages in thread
From: Yang Shi @ 2024-09-04 17:57 UTC (permalink / raw)
To: David Hildenbrand, catalin.marinas, will, muchun.song, akpm
Cc: linux-arm-kernel, linux-mm, linux-kernel
On 9/3/24 2:35 PM, David Hildenbrand wrote:
> On 03.09.24 18:46, Yang Shi wrote:
>>
>>
>> On 9/2/24 7:33 AM, David Hildenbrand wrote:
>>> On 21.08.24 20:47, Yang Shi wrote:
>>>> Enable MTE support for hugetlb.
>>>>
>>>> The MTE page flags will be set on the head page only. When copying
>>>> hugetlb folio, the tags for all tail pages will be copied when copying
>>>> head page.
>>>>
>>>> When freeing hugetlb folio, the MTE flags will be cleared.
>>>>
>>>> Signed-off-by: Yang Shi <yang@os.amperecomputing.com>
>>>> ---
>>>> arch/arm64/include/asm/hugetlb.h | 11 ++++++++++-
>>>> arch/arm64/include/asm/mman.h | 3 ++-
>>>> arch/arm64/kernel/hibernate.c | 7 +++++++
>>>> arch/arm64/kernel/mte.c | 25 +++++++++++++++++++++++--
>>>> arch/arm64/kvm/guest.c | 16 +++++++++++++---
>>>> arch/arm64/kvm/mmu.c | 11 +++++++++++
>>>> arch/arm64/mm/copypage.c | 25 +++++++++++++++++++++++--
>>>> fs/hugetlbfs/inode.c | 2 +-
>>>> 8 files changed, 90 insertions(+), 10 deletions(-)
>>>>
>>>> v2: * Reimplemented the patch to fix the comments from Catalin.
>>>> * Added test cases (patch #2) per Catalin.
>>>>
>>>> diff --git a/arch/arm64/include/asm/hugetlb.h
>>>> b/arch/arm64/include/asm/hugetlb.h
>>>> index 293f880865e8..00a1f75d40ee 100644
>>>> --- a/arch/arm64/include/asm/hugetlb.h
>>>> +++ b/arch/arm64/include/asm/hugetlb.h
>>>> @@ -11,6 +11,7 @@
>>>> #define __ASM_HUGETLB_H
>>>> #include <asm/cacheflush.h>
>>>> +#include <asm/mte.h>
>>>> #include <asm/page.h>
>>>> #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
>>>> @@ -20,7 +21,15 @@ extern bool
>>>> arch_hugetlb_migration_supported(struct hstate *h);
>>>> static inline void arch_clear_hugetlb_flags(struct folio *folio)
>>>> {
>>>> - clear_bit(PG_dcache_clean, &folio->flags);
>>>> + const unsigned long clear_flags = BIT(PG_dcache_clean) |
>>>> + BIT(PG_mte_tagged) | BIT(PG_mte_lock);
>>>> +
>>>> + if (!system_supports_mte()) {
>>>> + clear_bit(PG_dcache_clean, &folio->flags);
>>>> + return;
>>>> + }
>>>> +
>>>> + folio->flags &= ~clear_flags;
>>>> }
>>>> #define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
>>>> diff --git a/arch/arm64/include/asm/mman.h
>>>> b/arch/arm64/include/asm/mman.h
>>>> index 5966ee4a6154..304dfc499e68 100644
>>>> --- a/arch/arm64/include/asm/mman.h
>>>> +++ b/arch/arm64/include/asm/mman.h
>>>> @@ -28,7 +28,8 @@ static inline unsigned long
>>>> arch_calc_vm_flag_bits(unsigned long flags)
>>>> * backed by tags-capable memory. The vm_flags may be
>>>> overridden by a
>>>> * filesystem supporting MTE (RAM-based).
>>>> */
>>>> - if (system_supports_mte() && (flags & MAP_ANONYMOUS))
>>>> + if (system_supports_mte() &&
>>>> + (flags & (MAP_ANONYMOUS | MAP_HUGETLB)))
>>>> return VM_MTE_ALLOWED;
>>>> return 0;
>>>> diff --git a/arch/arm64/kernel/hibernate.c
>>>> b/arch/arm64/kernel/hibernate.c
>>>> index 02870beb271e..722e76f29141 100644
>>>> --- a/arch/arm64/kernel/hibernate.c
>>>> +++ b/arch/arm64/kernel/hibernate.c
>>>> @@ -266,10 +266,17 @@ static int swsusp_mte_save_tags(void)
>>>> max_zone_pfn = zone_end_pfn(zone);
>>>> for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn;
>>>> pfn++) {
>>>> struct page *page = pfn_to_online_page(pfn);
>>>> + struct folio *folio;
>>>> if (!page)
>>>> continue;
>>>> + folio = page_folio(page);
>>>> +
>>>> + if (folio_test_hugetlb(folio) &&
>>>> + !page_mte_tagged(&folio->page))
>>>> + continue;
>>>
>>> Can we have folio_test_mte_tagged() whereby you make sure that only
>>> folio_test_hugetlb() uses it for now (VM_WARN_ON_ONCE) and then make
>>> sure that nobody uses page_mte_tagged() on hugetlb folios
>>> (VM_WARN_ON_ONCE)?
>>
>>
>> IIUC, you mean something like the below?
>>
>> bool folio_test_mte_tagged(struct folio *folio)
>> {
>> VM_WARN_ON_ONCE(!folio_test_hugetlb(folio));
>>
>> return test_bit(PG_mte_tagged, &folio->page->flags);
>
> folio->flags
>
>> }
>>
>> bool page_mte_tagged(struct page *page)
>> {
>> struct folio *folio = page_folio(page);
>>
>> VM_WARN_ON_ONCE(folio_test_hugetlb(folio));
>
> Yes, but better as
>
> VM_WARN_ON_ONCE(folio_test_hugetlb(page_folio(page)));
I see. But I think all the call sites for folio_test_mte_tagged()
actually need have folio_test_hugetlb() before it. So the warn seems not
very useful other than warning on some misuse.
>
>>
>> return test_bit(PG_mte_tagged, &pge->flags);
>> }
>>
>>>
>>> Same for folio_set_mte_tagged() and other functions. We could slap a
>>> "hugetlb" into the function names, but maybe in the future we'll be
>>> able to use a single flag per folio (I know, it's complicated ...).
>>
>> A single flag per folio should be the future direction, but I haven't
>> done the research so can't tell how complicated it will be.
>
> There were some discussions on it, and it's tricky. So maybe we should
> really just have folio_test_hugetlb_mte_tagged() etc. for now
Either w/ hugetlb or w/o hugetlb is fine, I don't have strong opinion on
the naming.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [v2 PATCH 1/2] hugetlb: arm64: add mte support
2024-09-04 17:57 ` Yang Shi
@ 2024-09-04 18:35 ` David Hildenbrand
0 siblings, 0 replies; 10+ messages in thread
From: David Hildenbrand @ 2024-09-04 18:35 UTC (permalink / raw)
To: Yang Shi, catalin.marinas, will, muchun.song, akpm
Cc: linux-arm-kernel, linux-mm, linux-kernel
On 04.09.24 19:57, Yang Shi wrote:
>
>
> On 9/3/24 2:35 PM, David Hildenbrand wrote:
>> On 03.09.24 18:46, Yang Shi wrote:
>>>
>>>
>>> On 9/2/24 7:33 AM, David Hildenbrand wrote:
>>>> On 21.08.24 20:47, Yang Shi wrote:
>>>>> Enable MTE support for hugetlb.
>>>>>
>>>>> The MTE page flags will be set on the head page only. When copying
>>>>> hugetlb folio, the tags for all tail pages will be copied when copying
>>>>> head page.
>>>>>
>>>>> When freeing hugetlb folio, the MTE flags will be cleared.
>>>>>
>>>>> Signed-off-by: Yang Shi <yang@os.amperecomputing.com>
>>>>> ---
>>>>> arch/arm64/include/asm/hugetlb.h | 11 ++++++++++-
>>>>> arch/arm64/include/asm/mman.h | 3 ++-
>>>>> arch/arm64/kernel/hibernate.c | 7 +++++++
>>>>> arch/arm64/kernel/mte.c | 25 +++++++++++++++++++++++--
>>>>> arch/arm64/kvm/guest.c | 16 +++++++++++++---
>>>>> arch/arm64/kvm/mmu.c | 11 +++++++++++
>>>>> arch/arm64/mm/copypage.c | 25 +++++++++++++++++++++++--
>>>>> fs/hugetlbfs/inode.c | 2 +-
>>>>> 8 files changed, 90 insertions(+), 10 deletions(-)
>>>>>
>>>>> v2: * Reimplemented the patch to fix the comments from Catalin.
>>>>> * Added test cases (patch #2) per Catalin.
>>>>>
>>>>> diff --git a/arch/arm64/include/asm/hugetlb.h
>>>>> b/arch/arm64/include/asm/hugetlb.h
>>>>> index 293f880865e8..00a1f75d40ee 100644
>>>>> --- a/arch/arm64/include/asm/hugetlb.h
>>>>> +++ b/arch/arm64/include/asm/hugetlb.h
>>>>> @@ -11,6 +11,7 @@
>>>>> #define __ASM_HUGETLB_H
>>>>> #include <asm/cacheflush.h>
>>>>> +#include <asm/mte.h>
>>>>> #include <asm/page.h>
>>>>> #ifdef CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION
>>>>> @@ -20,7 +21,15 @@ extern bool
>>>>> arch_hugetlb_migration_supported(struct hstate *h);
>>>>> static inline void arch_clear_hugetlb_flags(struct folio *folio)
>>>>> {
>>>>> - clear_bit(PG_dcache_clean, &folio->flags);
>>>>> + const unsigned long clear_flags = BIT(PG_dcache_clean) |
>>>>> + BIT(PG_mte_tagged) | BIT(PG_mte_lock);
>>>>> +
>>>>> + if (!system_supports_mte()) {
>>>>> + clear_bit(PG_dcache_clean, &folio->flags);
>>>>> + return;
>>>>> + }
>>>>> +
>>>>> + folio->flags &= ~clear_flags;
>>>>> }
>>>>> #define arch_clear_hugetlb_flags arch_clear_hugetlb_flags
>>>>> diff --git a/arch/arm64/include/asm/mman.h
>>>>> b/arch/arm64/include/asm/mman.h
>>>>> index 5966ee4a6154..304dfc499e68 100644
>>>>> --- a/arch/arm64/include/asm/mman.h
>>>>> +++ b/arch/arm64/include/asm/mman.h
>>>>> @@ -28,7 +28,8 @@ static inline unsigned long
>>>>> arch_calc_vm_flag_bits(unsigned long flags)
>>>>> * backed by tags-capable memory. The vm_flags may be
>>>>> overridden by a
>>>>> * filesystem supporting MTE (RAM-based).
>>>>> */
>>>>> - if (system_supports_mte() && (flags & MAP_ANONYMOUS))
>>>>> + if (system_supports_mte() &&
>>>>> + (flags & (MAP_ANONYMOUS | MAP_HUGETLB)))
>>>>> return VM_MTE_ALLOWED;
>>>>> return 0;
>>>>> diff --git a/arch/arm64/kernel/hibernate.c
>>>>> b/arch/arm64/kernel/hibernate.c
>>>>> index 02870beb271e..722e76f29141 100644
>>>>> --- a/arch/arm64/kernel/hibernate.c
>>>>> +++ b/arch/arm64/kernel/hibernate.c
>>>>> @@ -266,10 +266,17 @@ static int swsusp_mte_save_tags(void)
>>>>> max_zone_pfn = zone_end_pfn(zone);
>>>>> for (pfn = zone->zone_start_pfn; pfn < max_zone_pfn;
>>>>> pfn++) {
>>>>> struct page *page = pfn_to_online_page(pfn);
>>>>> + struct folio *folio;
>>>>> if (!page)
>>>>> continue;
>>>>> + folio = page_folio(page);
>>>>> +
>>>>> + if (folio_test_hugetlb(folio) &&
>>>>> + !page_mte_tagged(&folio->page))
>>>>> + continue;
>>>>
>>>> Can we have folio_test_mte_tagged() whereby you make sure that only
>>>> folio_test_hugetlb() uses it for now (VM_WARN_ON_ONCE) and then make
>>>> sure that nobody uses page_mte_tagged() on hugetlb folios
>>>> (VM_WARN_ON_ONCE)?
>>>
>>>
>>> IIUC, you mean something like the below?
>>>
>>> bool folio_test_mte_tagged(struct folio *folio)
>>> {
>>> VM_WARN_ON_ONCE(!folio_test_hugetlb(folio));
>>>
>>> return test_bit(PG_mte_tagged, &folio->page->flags);
>>
>> folio->flags
>>
>>> }
>>>
>>> bool page_mte_tagged(struct page *page)
>>> {
>>> struct folio *folio = page_folio(page);
>>>
>>> VM_WARN_ON_ONCE(folio_test_hugetlb(folio));
>>
>> Yes, but better as
>>
>> VM_WARN_ON_ONCE(folio_test_hugetlb(page_folio(page)));
>
> I see. But I think all the call sites for folio_test_mte_tagged()
> actually need have folio_test_hugetlb() before it. So the warn seems not
> very useful other than warning on some misuse.
... well, that's the whole reason for them :)
>
>>
>>>
>>> return test_bit(PG_mte_tagged, &pge->flags);
>>> }
>>>
>>>>
>>>> Same for folio_set_mte_tagged() and other functions. We could slap a
>>>> "hugetlb" into the function names, but maybe in the future we'll be
>>>> able to use a single flag per folio (I know, it's complicated ...).
>>>
>>> A single flag per folio should be the future direction, but I haven't
>>> done the research so can't tell how complicated it will be.
>>
>> There were some discussions on it, and it's tricky. So maybe we should
>> really just have folio_test_hugetlb_mte_tagged() etc. for now
>
> Either w/ hugetlb or w/o hugetlb is fine, I don't have strong opinion on
> the naming.
Let's go with "hugetlb" for now, using it for other large folios is out
of sight a bit ... at least right now :)
--
Cheers,
David / dhildenb
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-09-04 18:35 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-08-21 18:47 [v2 PATCH 1/2] hugetlb: arm64: add mte support Yang Shi
2024-08-21 18:47 ` [v2 PATCH 2/2] selftests: arm64: add hugetlb mte tests Yang Shi
2024-08-26 11:15 ` [v2 PATCH 1/2] hugetlb: arm64: add mte support kernel test robot
2024-08-26 17:02 ` Yang Shi
2024-08-28 17:57 ` Yang Shi
2024-09-02 14:33 ` David Hildenbrand
2024-09-03 16:46 ` Yang Shi
2024-09-03 21:35 ` David Hildenbrand
2024-09-04 17:57 ` Yang Shi
2024-09-04 18:35 ` David Hildenbrand
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox