]> git.ipfire.org Git - thirdparty/linux.git/commit
KVM: arm64: Reject guest_memfd memslots when the VM has MTE
authorAlexandru Elisei <alexandru.elisei@arm.com>
Wed, 22 Jul 2026 09:03:54 +0000 (10:03 +0100)
committerMarc Zyngier <maz@kernel.org>
Thu, 23 Jul 2026 08:57:06 +0000 (09:57 +0100)
commit679d7201c1f09e37fa1c12ce28d84079c17fc87f
treed4ab4562cccc1106c74708aa21250ba817b66a60
parente7821048e8d72a94b1fb7422f8b45aa374ff076f
KVM: arm64: Reject guest_memfd memslots when the VM has MTE

The user cannot use MTE on VMAs created by mapping a guest_memfd file,
as arch_calc_vm_flag_bits() does not set VM_MTE_ALLOWED.

When creating a guest_memfd backed memslot,
kvm_arch_prepare_memory_region() rejects the memslot if MTE is enabled for
the VM and if guest_memfd has been mapped in a VMA that intersects the
memslot.

However, the documentation for KVM_SET_USER_MEMORY_REGION2 explicitly
states that the only condition for userspace_addr is for it to be a legal
userspace address, but the mapping is not required to be valid nor
populated at memslot creation.

If userspace sets userspace_addr to an address that hasn't been mapped, or
if userspace_addr belongs to a VMA that isn't backed by the guest_memfd
file, or if the VMA doesn't intersect the memslot, memslot creation is
successful and KVM ends up with a VM with MTE and guest_memfd-backed
memslots.

The same happens if the order is reversed: when userspace enables MTE, KVM
does not check if memslots backed by guest_memfd are already present.

Fix both issues by rejecting guest_memfd-backed memslots when MTE is
enabled, and by rejecting MTE when guest_memfd-backed memslots are already
present.

Fixes: 32e200bd6e44 ("KVM: arm64: Enable support for guest_memfd backed memory")
Tested-by: Fuad Tabba <fuad.tabba@linux.dev>
Reviewed-by: Fuad Tabba <fuad.tabba@linux.dev>
Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
Link: https://patch.msgid.link/20260722090354.94245-1-alexandru.elisei@arm.com
Signed-off-by: Marc Zyngier <maz@kernel.org>
Documentation/virt/kvm/api.rst
arch/arm64/kvm/arm.c
arch/arm64/kvm/mmu.c