[PATCH v2 2/4] KVM: arm64: Clear the whole hugetlb folio when storing MTE tags
From: Fuad Tabba
Date: Wed Oct 21 2026 - 07:12:36 EST
When KVM_ARM_MTE_COPY_TAGS copies tags into a page, it marks the page as
tagged. For a hugetlb folio the flag covers every page in the folio. If
the folio wasn't tagged yet, its other pages are marked as tagged with
their previous owner's tags still in place. The stage-2 fault path then
maps them into the guest without clearing them. The ioctl's read side
also copies them out to the VMM.
Clear the whole folio on its first tagging, before copying in this
page's tags.
Fixes: 25c17c4b55def ("hugetlb: arm64: add mte support")
Reviewed-by: Lorenzo Stoakes (ARM) <ljs@xxxxxxxxxx>
Cc: stable@xxxxxxxxxxxxxxx
Signed-off-by: Fuad Tabba <fuad.tabba@xxxxxxxxx>
---
arch/arm64/kvm/guest.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/arch/arm64/kvm/guest.c b/arch/arm64/kvm/guest.c
index b01d6622b8720..cda655fbff657 100644
--- a/arch/arm64/kvm/guest.c
+++ b/arch/arm64/kvm/guest.c
@@ -1012,6 +1012,7 @@ int kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
void *maddr;
unsigned long num_tags;
struct folio *folio;
+ unsigned long i;
if (!page) {
ret = -EFAULT;
@@ -1042,12 +1043,14 @@ int kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
/*
* Only locking to serialise with a concurrent
* __set_ptes() in the VMM but still overriding the
- * tags, hence ignoring the return value.
+ * tags. A hugetlb folio is marked tagged as a whole,
+ * so its first tagging clears every page.
*/
- if (folio_test_hugetlb(folio))
- folio_try_hugetlb_mte_tagging(folio);
- else
+ if (!folio_test_hugetlb(folio))
try_page_mte_tagging(page);
+ else if (folio_try_hugetlb_mte_tagging(folio))
+ for (i = 0; i < folio_nr_pages(folio); i++)
+ mte_clear_page_tags(page_address(folio_page(folio, i)));
num_tags = mte_copy_tags_from_user(maddr, tags,
MTE_GRANULES_PER_PAGE);
--
2.47.3