From: Catalin Marinas <catalin.marinas@arm.com>
To: Suzuki K Poulose <suzuki.poulose@arm.com>
Cc: Steven Price <steven.price@arm.com>,
kvm@vger.kernel.org, kvmarm@lists.linux.dev,
Marc Zyngier <maz@kernel.org>, Will Deacon <will@kernel.org>,
James Morse <james.morse@arm.com>,
Oliver Upton <oliver.upton@linux.dev>,
Zenghui Yu <yuzenghui@huawei.com>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, Joey Gouly <joey.gouly@arm.com>,
Alexandru Elisei <alexandru.elisei@arm.com>,
Christoffer Dall <christoffer.dall@arm.com>,
Fuad Tabba <tabba@google.com>,
linux-coco@lists.linux.dev,
Ganapatrao Kulkarni <gankulkarni@os.amperecomputing.com>,
Gavin Shan <gshan@redhat.com>,
Shanker Donthineni <sdonthineni@nvidia.com>,
Alper Gun <alpergun@google.com>,
"Aneesh Kumar K . V" <aneesh.kumar@kernel.org>,
Emi Kisanuki <fj0570is@fujitsu.com>,
Vishal Annapurve <vannapurve@google.com>,
WeiLin.Chang@arm.com, Lorenzo Pieralisi <lpieralisi@kernel.org>
Subject: Re: [PATCH v16 29/45] KVM: arm64: CCA: Support runtime faulting of memory
Date: Wed, 12 Aug 2026 15:06:15 +0100 [thread overview]
Message-ID: <anx9195WR8wokAcL@arm.com> (raw)
In-Reply-To: <b512db4b-793b-4dd1-baac-e873b39f5b0b@arm.com>
On Wed, Aug 12, 2026 at 10:01:48AM +0100, Suzuki K Poulose wrote:
> On 11/08/2026 16:42, Catalin Marinas wrote:
> > On Mon, Aug 03, 2026 at 02:43:45PM +0100, Steven Price wrote:
> > > At runtime if the realm guest accesses memory which hasn't yet been
> > > mapped then KVM needs to either populate the region or fault the guest.
> > >
> > > For memory in the lower (protected) region of IPA a fresh page is
> > > provided to the RMM which will zero the contents. For memory in the
> > > upper (shared) region of IPA, the memory from the memslot is mapped
> > > into the realm VM non secure.
> >
> > Is this still true with in-place guestmem conversion?
> >
> > > @@ -1693,7 +1709,14 @@ static int gmem_abort(const struct kvm_s2_fault_desc *s2fd)
> > > kvm_fault_lock(kvm);
> > > if (mmu_invalidate_retry(kvm, mmu_seq)) {
> > > ret = -EAGAIN;
> > > - goto out_unlock;
> > > + goto out_release_page;
> > > + }
> > > +
> > > + if (kvm_is_realm(kvm)) {
> > > + prot &= ~KVM_PGTABLE_PROT_X;
> > > + ret = realm_map_ipa(kvm, s2fd->fault_ipa, pfn,
> > > + PAGE_SIZE, prot, memcache);
> > > + goto out_release_page;
> > > }
> >
> > [...]
> >
> > > +int realm_map_ipa(struct kvm *kvm, phys_addr_t ipa,
> > > + kvm_pfn_t pfn, unsigned long map_size,
> > > + enum kvm_pgtable_prot prot,
> > > + struct kvm_mmu_memory_cache *memcache)
> > > +{
> > > + struct realm *realm = &kvm->arch.realm;
> > > +
> > > + ipa = ALIGN_DOWN(ipa, map_size);
> > > + if (!kvm_realm_is_private_address(realm, ipa)) {
> > > + return realm_map_non_secure(kvm, ipa, pfn, map_size, prot,
> > > + memcache);
> > > + }
> > > +
> > > + /* It's impossible to map protected pages read-only. */
> > > + if (WARN_ON(!(prot & KVM_PGTABLE_PROT_W)))
> > > + return -EFAULT;
> > > + return realm_map_protected(kvm, ipa, pfn, map_size, memcache);
> > > +}
> >
> > I was trying to understand (with the help of some LLMs) to understand
> > whether we can end up on the do_gpf() path as a result of VMM actions.
> > The above kvm_realm_is_private_address() only checks for the IPA but
> > does not check against guestmem if the page is truly private. I probably
> > miss something but the scenario would be something like:
> >
> > 1. VMM creates the gmem region with GUEST_MEMFD_FLAG_MMAP |
> > GUEST_MEMFD_FLAG_INIT_SHARED, mmap()able and GUP-pinnable
> >
> > 2. VMM starts an O_DIRECT write() from that mapping; the block layer
> > FOLL_PINs the shared folio
> >
> > 3. VMM runs a vCPU so the realm touches the protected-IPA alias of the
> > same gfn. gmem_abort() delegates the pinned, still-shared page to
> > the RMM
> >
> > 4. The in-flight I/O then reads the now-Realm page from the kernel
> > linear map. That access takes a GPF at EL1, so do_gpf() ->
> > die_kernel_fault()
>
> This is correct. The fundamental issue is that we have a disconnect
> between the "gmem attribute" changes (to private/shared) and the
> RIPAS and this is something we want to fix.
>
> e.g., the KVM CCA driver sets the entire DRAM to RIPAS_RAM for
> the Realm before ACTIVATION and we expect that the VMM changes
> the gmem to PRIVATE. They both are not in sync. his is something
> we were discussing the other day with Aneesh.
>
> Once they are in sync, we are protected. If the RIPAS=EMPTY
> (gmem=shared) a stage2 fault doesn't come to the Host.
>
> If the RIPAS=RAM, the gmem is private and there are no usespace
> mappings.
>
> The reason why it is disconnected at the moment is due to the
> weird semantics for Guest triggered conversions in CCA
> i.e., Realm requests via RSI_IPA_STATE_SET, triggering a RIPAS_CHANGE
> exit to the KVM.
>
> The KVM exits to VMM with MEMORY_FAULT_EXIT and the VMM can service this
> by invoking GMEM(SET_ATTRIBUTES2).
I guess a buggy or malicious VMM may skip the gmem attribute setting and
simply resume the guest. Currently we can end up with SET_RIPAS
irrespective of what the VMM did. So at this point maybe we need to
check that the gmem attribute was actually changed before handling the
pending RMI requests.
The other place to check the gmem status is when handling the
gmem_abort().
I wonder whether we can have any races with either of these if multiple
vCPUs toggle the RIPAS state between RAM and EMPTY and we need both
places (the RIPAS_CHANGE exit and the actual stage 2 fault).
> But, the KVM needs to invoke the
> RMI_RTT_SET_RIPAS in the context of the "vcpu", which we don't have
> from the "kvm" context. I guess we can fix it by running through the
> vcpus and find the matching one with the "ipa" range and the "ripas".
Or multiple vcpus? Does the spec allow multiple RIPAS_CHANGE requests
for the same IPA? If yes, we probably need to clear all.
--
Catalin
next prev parent reply other threads:[~2026-08-12 14:06 UTC|newest]
Thread overview: 86+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-03 13:43 [PATCH v16 00/45] arm64: Support for Arm CCA in KVM Steven Price
2026-08-03 13:43 ` [PATCH v16 01/45] firmware: arm_rmm: Add SMC definitions for calling the RMM Steven Price
2026-08-03 13:43 ` [PATCH v16 02/45] firmware: arm_rmm: Add wrappers for direct RMI calls Steven Price
2026-08-03 13:43 ` [PATCH v16 03/45] firmware: arm_rmm: Check for RMI support at init Steven Price
2026-08-03 13:43 ` [PATCH v16 04/45] firmware: arm_rmm: Configure the RMM with the host's page size Steven Price
2026-08-03 13:43 ` [PATCH v16 05/45] firmware: arm_rmm: Add support for SRO Steven Price
2026-08-03 13:43 ` [PATCH v16 06/45] firmware: arm_rmm: Ensure the RMM has GPT entries for memory Steven Price
2026-08-09 6:42 ` Suzuki K Poulose
2026-08-03 13:43 ` [PATCH v16 07/45] arm64: mm: Handle Granule Protection Faults (GPFs) Steven Price
2026-08-11 14:44 ` Catalin Marinas
2026-08-11 15:11 ` Suzuki K Poulose
2026-08-12 12:42 ` Pavan Kondeti
2026-08-12 13:51 ` Catalin Marinas
2026-08-03 13:43 ` [PATCH v16 08/45] KVM: arm64: Include kvm_emulate.h in kvm/arm_psci.h Steven Price
2026-08-03 13:43 ` [PATCH v16 09/45] KVM: arm64: Avoid including linux/kvm_host.h in kvm_pgtable.h Steven Price
2026-08-03 13:43 ` [PATCH v16 10/45] KVM: arm64: CCA: Add wrappers for realm related RMIs Steven Price
2026-08-03 13:43 ` [PATCH v16 11/45] KVM: arm64: CCA: Check for RMI support at KVM init Steven Price
2026-08-04 14:55 ` Fuad Tabba
2026-08-04 14:59 ` Suzuki K Poulose
2026-08-03 13:43 ` [PATCH v16 12/45] KVM: arm64: CCA: Check for LPA2 support Steven Price
2026-08-03 13:43 ` [PATCH v16 13/45] KVM: arm64: CCA: Define the user ABI Steven Price
2026-08-03 13:43 ` [PATCH v16 14/45] KVM: arm64: CCA: Add basic infrastructure for creating a realm Steven Price
2026-08-03 13:43 ` [PATCH v16 15/45] KVM: arm64: CCA: Don't expose unsupported capabilities for realm guests Steven Price
2026-08-03 13:43 ` [PATCH v16 16/45] KVM: arm64: CCA: Allow passing the machine type in KVM creation Steven Price
2026-08-03 13:43 ` [PATCH v16 17/45] KVM: arm64: CCA: Tear down RTTs Steven Price
2026-08-03 22:29 ` Alper Gun
2026-08-04 12:16 ` Suzuki K Poulose
2026-08-11 14:51 ` Suzuki K Poulose
2026-08-03 13:43 ` [PATCH v16 18/45] KVM: arm64: CCA: Allocate and free RECs to match vCPUs Steven Price
2026-08-03 13:43 ` [PATCH v16 19/45] KVM: arm64: CCA: Support the VGIC in realms Steven Price
2026-08-03 13:43 ` [PATCH v16 20/45] KVM: arm64: CCA: Support timers in realm RECs Steven Price
2026-08-03 13:43 ` [PATCH v16 21/45] KVM: arm64: CCA: Handle realm enter/exit Steven Price
2026-08-04 8:57 ` Aneesh Kumar K.V
2026-08-04 13:36 ` Aneesh Kumar K.V
2026-08-10 8:03 ` Kohei Enju
2026-08-03 13:43 ` [PATCH v16 22/45] KVM: arm64: CCA: Handle RMI_EXIT_RIPAS_CHANGE Steven Price
2026-08-05 15:59 ` Ackerley Tng
2026-08-06 8:42 ` Suzuki K Poulose
2026-08-03 13:43 ` [PATCH v16 23/45] KVM: arm64: CCA: Handle realm MMIO emulation Steven Price
2026-08-03 13:43 ` [PATCH v16 24/45] KVM: arm64: Expose support for private memory Steven Price
2026-08-05 16:02 ` Ackerley Tng
2026-08-07 10:12 ` Suzuki K Poulose
2026-08-03 13:43 ` [PATCH v16 25/45] KVM: arm64: CCA: Create the realm descriptor Steven Price
2026-08-03 13:43 ` [PATCH v16 26/45] KVM: arm64: CCA: Activate realms on first vCPU run Steven Price
2026-08-03 13:43 ` [PATCH v16 27/45] KVM: arm64: CCA: Allow populating initial contents Steven Price
2026-08-06 22:43 ` Ackerley Tng
2026-08-07 10:58 ` Suzuki K Poulose
2026-08-03 13:43 ` [PATCH v16 28/45] KVM: arm64: CCA: Set RIPAS of initial memslots Steven Price
2026-08-03 13:43 ` [PATCH v16 29/45] KVM: arm64: CCA: Support runtime faulting of memory Steven Price
2026-08-06 23:11 ` Ackerley Tng
2026-08-11 15:42 ` Catalin Marinas
2026-08-12 9:01 ` Suzuki K Poulose
2026-08-12 14:06 ` Catalin Marinas [this message]
2026-08-12 15:40 ` Suzuki K Poulose
2026-08-03 13:43 ` [PATCH v16 30/45] KVM: arm64: CCA: Handle realm vCPU load Steven Price
2026-08-10 14:46 ` Kohei Enju
2026-08-03 13:43 ` [PATCH v16 31/45] KVM: arm64: CCA: Validate register access for Realm VMs Steven Price
2026-08-03 13:43 ` [PATCH v16 32/45] KVM: arm64: CCA: Handle Realm PSCI requests Steven Price
2026-08-03 13:43 ` [PATCH v16 33/45] KVM: arm64: WARN on injected undef exceptions Steven Price
2026-08-03 13:43 ` [PATCH v16 34/45] KVM: arm64: CCA: Allow userspace to inject aborts Steven Price
2026-08-03 13:43 ` [PATCH v16 35/45] KVM: arm64: CCA: Support RSI_HOST_CALL Steven Price
2026-08-03 13:43 ` [PATCH v16 36/45] KVM: arm64: CCA: Allow checking SVE on VM instance Steven Price
2026-08-03 13:43 ` [PATCH v16 37/45] KVM: arm64: CCA: Prevent Device mappings for realms Steven Price
2026-08-03 13:43 ` [PATCH v16 38/45] KVM: arm64: CCA: Propagate breakpoint and watchpoint counts to userspace Steven Price
2026-08-03 13:43 ` [PATCH v16 39/45] KVM: arm64: CCA: Set breakpoint parameters through SET_ONE_REG Steven Price
2026-08-03 13:43 ` [PATCH v16 40/45] KVM: arm64: CCA: Propagate max SVE vector length from the RMM Steven Price
2026-08-03 13:43 ` [PATCH v16 41/45] KVM: arm64: CCA: Configure max SVE vector length for a Realm Steven Price
2026-08-03 13:43 ` [PATCH v16 42/45] KVM: arm64: CCA: Provide register list for unfinalized RECs Steven Price
2026-08-03 13:43 ` [PATCH v16 43/45] KVM: arm64: CCA: Provide an accurate register list Steven Price
2026-08-03 13:44 ` [PATCH v16 44/45] KVM: arm64: CCA: Require ICH_HCR_EL2.TDIR for realms Steven Price
2026-08-10 4:58 ` Kohei Enju
2026-08-10 9:41 ` Marc Zyngier
2026-08-03 13:44 ` [PATCH v16 45/45] KVM: arm64: CCA: Enable realms to be created Steven Price
2026-08-03 15:01 ` [PATCH v16 00/45] arm64: Support for Arm CCA in KVM Marc Zyngier
2026-08-03 15:06 ` Steven Price
2026-08-03 15:20 ` Marc Zyngier
2026-08-03 15:45 ` Steven Price
2026-08-04 14:24 ` Fuad Tabba
2026-08-06 22:05 ` Suzuki K Poulose
2026-08-11 4:44 ` Gavin Shan
2026-08-11 11:12 ` Suzuki K Poulose
2026-08-12 3:07 ` Gavin Shan
2026-08-12 3:25 ` Alper Gun
2026-08-12 6:04 ` Suzuki K Poulose
2026-08-12 10:35 ` Gavin Shan
2026-08-12 12:18 ` Suzuki K Poulose
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=anx9195WR8wokAcL@arm.com \
--to=catalin.marinas@arm.com \
--cc=WeiLin.Chang@arm.com \
--cc=alexandru.elisei@arm.com \
--cc=alpergun@google.com \
--cc=aneesh.kumar@kernel.org \
--cc=christoffer.dall@arm.com \
--cc=fj0570is@fujitsu.com \
--cc=gankulkarni@os.amperecomputing.com \
--cc=gshan@redhat.com \
--cc=james.morse@arm.com \
--cc=joey.gouly@arm.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=lpieralisi@kernel.org \
--cc=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=sdonthineni@nvidia.com \
--cc=steven.price@arm.com \
--cc=suzuki.poulose@arm.com \
--cc=tabba@google.com \
--cc=vannapurve@google.com \
--cc=will@kernel.org \
--cc=yuzenghui@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.