From: Steven Price <steven.price@arm.com>
To: Andre Przywara <andre.przywara@arm.com>
Cc: kvm@vger.kernel.org, kvmarm@lists.linux.dev,
Catalin Marinas <catalin.marinas@arm.com>,
Marc Zyngier <maz@kernel.org>, Will Deacon <will@kernel.org>,
James Morse <james.morse@arm.com>,
Oliver Upton <oliver.upton@linux.dev>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
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>
Subject: Re: [PATCH v9 15/43] arm64: RME: Allow VMM to set RIPAS
Date: Mon, 23 Jun 2025 15:45:28 +0100 [thread overview]
Message-ID: <c96eb50e-eee6-4589-894a-6e10613f6dfb@arm.com> (raw)
In-Reply-To: <20250618133355.2af1dcc4@donnerap.manchester.arm.com>
On 18/06/2025 13:33, Andre Przywara wrote:
> On Wed, 11 Jun 2025 11:48:12 +0100
> Steven Price <steven.price@arm.com> wrote:
>
> Hi Steven,
>
> one build error below, on my machine (with GCC10):
>
>> Each page within the protected region of the realm guest can be marked
>> as either RAM or EMPTY. Allow the VMM to control this before the guest
>> has started and provide the equivalent functions to change this (with
>> the guest's approval) at runtime.
>>
>> When transitioning from RIPAS RAM (1) to RIPAS EMPTY (0) the memory is
>> unmapped from the guest and undelegated allowing the memory to be reused
>> by the host. When transitioning to RIPAS RAM the actual population of
>> the leaf RTTs is done later on stage 2 fault, however it may be
>> necessary to allocate additional RTTs to allow the RMM track the RIPAS
>> for the requested range.
>>
>> When freeing a block mapping it is necessary to temporarily unfold the
>> RTT which requires delegating an extra page to the RMM, this page can
>> then be recovered once the contents of the block mapping have been
>> freed.
>>
>> Signed-off-by: Steven Price <steven.price@arm.com>
>> ---
>> Changes from v8:
>> * Propagate the 'may_block' flag to allow conditional calls to
>> cond_resched_rwlock_write().
>> * Introduce alloc_rtt() to wrap alloc_delegated_granule() and
>> kvm_account_pgtable_pages() and use when allocating RTTs.
>> * Code reorganisation to allow init_ipa_state and set_ipa_state to
>> share a common ripas_change() function,
>> * Other minor changes following review.
>> Changes from v7:
>> * Replace use of "only_shared" with the upstream "attr_filter" field
>> of struct kvm_gfn_range.
>> * Clean up the logic in alloc_delegated_granule() for when to call
>> kvm_account_pgtable_pages().
>> * Rename realm_destroy_protected_granule() to
>> realm_destroy_private_granule() to match the naming elsewhere. Also
>> fix the return codes in the function to be descriptive.
>> * Several other minor changes to names/return codes.
>> Changes from v6:
>> * Split the code dealing with the guest triggering a RIPAS change into
>> a separate patch, so this patch is purely for the VMM setting up the
>> RIPAS before the guest first runs.
>> * Drop the useless flags argument from alloc_delegated_granule().
>> * Account RTTs allocated for a guest using kvm_account_pgtable_pages().
>> * Deal with the RMM granule size potentially being smaller than the
>> host's PAGE_SIZE. Although note alloc_delegated_granule() currently
>> still allocates an entire host page for every RMM granule (so wasting
>> memory when PAGE_SIZE>4k).
>> Changes from v5:
>> * Adapt to rebasing.
>> * Introduce find_map_level()
>> * Rename some functions to be clearer.
>> * Drop the "spare page" functionality.
>> Changes from v2:
>> * {alloc,free}_delegated_page() moved from previous patch to this one.
>> * alloc_delegated_page() now takes a gfp_t flags parameter.
>> * Fix the reference counting of guestmem pages to avoid leaking memory.
>> * Several misc code improvements and extra comments.
>> ---
>> arch/arm64/include/asm/kvm_rme.h | 6 +
>> arch/arm64/kvm/mmu.c | 8 +-
>> arch/arm64/kvm/rme.c | 447 +++++++++++++++++++++++++++++++
>> 3 files changed, 458 insertions(+), 3 deletions(-)
>>
>
> [ ... ]
>
>> diff --git a/arch/arm64/kvm/rme.c b/arch/arm64/kvm/rme.c
>> index 25705da6f153..fe75c41d6ac3 100644
>> --- a/arch/arm64/kvm/rme.c
>> +++ b/arch/arm64/kvm/rme.c
>
> [ ... ]
>
>> @@ -318,6 +619,140 @@ static int realm_create_rd(struct kvm *kvm)
>> return r;
>> }
>>
>> +static void realm_unmap_private_range(struct kvm *kvm,
>> + unsigned long start,
>> + unsigned long end,
>> + bool may_block)
>> +{
>> + struct realm *realm = &kvm->arch.realm;
>> + unsigned long next_addr, addr;
>> + int ret;
>> +
>> + for (addr = start; addr < end; addr = next_addr) {
>> + ret = realm_unmap_private_page(realm, addr, &next_addr);
>> +
>> + if (ret)
>> + break;
>> +
>> + if (may_block)
>> + cond_resched_rwlock_write(&kvm->mmu_lock);
>> + }
>> +
>> + realm_fold_rtt_level(realm, get_start_level(realm) + 1,
>> + start, end);
>> +}
>> +
>> +void kvm_realm_unmap_range(struct kvm *kvm, unsigned long start,
>> + unsigned long size, bool unmap_private,
>> + bool may_block)
>> +{
>> + unsigned long end = start + size;
>> + struct realm *realm = &kvm->arch.realm;
>> +
>> + end = min(BIT(realm->ia_bits - 1), end);
>> +
>> + if (!kvm_realm_is_created(kvm))
>> + return;
>> +
>> + realm_unmap_shared_range(kvm, find_map_level(realm, start, end),
>> + start, end, may_block);
>> + if (unmap_private)
>> + realm_unmap_private_range(kvm, start, end, may_block);
>> +}
>> +
>> +enum ripas_action {
>> + RIPAS_INIT,
>> + RIPAS_SET,
>> +};
>> +
>> +static int ripas_change(struct kvm *kvm,
>> + struct kvm_vcpu *vcpu,
>> + unsigned long ipa,
>> + unsigned long end,
>> + enum ripas_action action,
>> + unsigned long *top_ipa)
>> +{
>> + struct realm *realm = &kvm->arch.realm;
>> + phys_addr_t rd_phys = virt_to_phys(realm->rd);
>> + phys_addr_t rec_phys;
>> + struct kvm_mmu_memory_cache *memcache = NULL;
>> + int ret = 0;
>> +
>> + if (vcpu) {
>> + rec_phys = virt_to_phys(vcpu->arch.rec.rec_page);
>> + memcache = &vcpu->arch.mmu_page_cache;
>> +
>> + WARN_ON(action != RIPAS_SET);
>> + } else {
>> + WARN_ON(action != RIPAS_INIT);
>> + }
>> +
>> + while (ipa < end) {
>> + unsigned long next;
>> +
>> + switch (action) {
>> + case RIPAS_INIT:
>> + ret = rmi_rtt_init_ripas(rd_phys, ipa, end, &next);
>> + break;
>> + case RIPAS_SET:
>> + ret = rmi_rtt_set_ripas(rd_phys, rec_phys, ipa, end,
>> + &next);
>> + break;
>> + }
>> +
>> + switch (RMI_RETURN_STATUS(ret)) {
>> + case RMI_SUCCESS:
>> + ipa = next;
>> + break;
>> + case RMI_ERROR_RTT:
>> + int err_level = RMI_RETURN_INDEX(ret);
>
> This breaks the build on GCC <= v10:
>
> /src/linux/arch/arm64/kvm/rme.c: In function ‘ripas_change’:
> /src/linux/arch/arm64/kvm/rme.c:1190:4: error: a label can only be part of a statement and a declaration is not a statement
> 1190 | int err_level = RMI_RETURN_INDEX(ret);
> | ^~~
> /src/linux/arch/arm64/kvm/rme.c:1191:4: error: expected expression before int’
> 1191 | int level = find_map_level(realm, ipa, end);
> | ^~~
> /src/linux/arch/arm64/kvm/rme.c:1193:21: error: ‘level’ undeclared (first use in this function)
> 1193 | if (err_level >= level)
> | ^~~~~
>
> With GCC 11 and later I see this still as a warning when using -Wpedantic,
> but it vanishes when also paired with -std=gnu2x.
>
> So either hoist the variable declaration up, or use brackets, this worked
> for me as well, and I see it in other places:
>
> case RMI_ERROR_RTT: {
> ....
> }
> default:
I'm surprised my compiler didn't complain - variable declarations in
switch statements can often be dodgy because it can cause subtle cases
where the variable is used without being set. Although perhaps Duff's
Device means the compiler is hard pressed to generate meaningful warnings.
I think in this case the extra brackets is probably cleanest.
Thanks,
Steve
> Cheers,
> Andre
>
>
>> + int level = find_map_level(realm, ipa, end);
>> +
>> + if (err_level >= level)
>> + return -EINVAL;
>> +
>> + ret = realm_create_rtt_levels(realm, ipa,
>> err_level,
>> + level, memcache);
>> + if (ret)
>> + return ret;
>> + /* Retry with the RTT levels in place */
>> + break;
>> + default:
>> + WARN_ON(1);
>> + return -ENXIO;
>> + }
>> + }
>> +
>> + if (top_ipa)
>> + *top_ipa = ipa;
>> +
>> + return 0;
>> +}
>> +
>> +static int realm_init_ipa_state(struct kvm *kvm,
>> + unsigned long ipa,
>> + unsigned long end)
>> +{
>> + return ripas_change(kvm, NULL, ipa, end, RIPAS_INIT, NULL);
>> +}
>> +
>> +static int kvm_init_ipa_range_realm(struct kvm *kvm,
>> + struct arm_rme_init_ripas *args)
>> +{
>> + gpa_t addr, end;
>> +
>> + addr = args->base;
>> + end = addr + args->size;
>> +
>> + if (end < addr)
>> + return -EINVAL;
>> +
>> + if (kvm_realm_state(kvm) != REALM_STATE_NEW)
>> + return -EPERM;
>> +
>> + return realm_init_ipa_state(kvm, addr, end);
>> +}
>> +
>> /* Protects access to rme_vmid_bitmap */
>> static DEFINE_SPINLOCK(rme_vmid_lock);
>> static unsigned long *rme_vmid_bitmap;
>> @@ -441,6 +876,18 @@ int kvm_realm_enable_cap(struct kvm *kvm, struct
>> kvm_enable_cap *cap) case KVM_CAP_ARM_RME_CREATE_REALM:
>> r = kvm_create_realm(kvm);
>> break;
>> + case KVM_CAP_ARM_RME_INIT_RIPAS_REALM: {
>> + struct arm_rme_init_ripas args;
>> + void __user *argp = u64_to_user_ptr(cap->args[1]);
>> +
>> + if (copy_from_user(&args, argp, sizeof(args))) {
>> + r = -EFAULT;
>> + break;
>> + }
>> +
>> + r = kvm_init_ipa_range_realm(kvm, &args);
>> + break;
>> + }
>> default:
>> r = -EINVAL;
>> break;
>
next prev parent reply other threads:[~2025-06-23 14:45 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-11 10:47 [PATCH v9 00/43] arm64: Support for Arm CCA in KVM Steven Price
2025-06-11 10:47 ` [PATCH v9 01/43] kvm: arm64: Include kvm_emulate.h in kvm/arm_psci.h Steven Price
2025-06-11 10:47 ` [PATCH v9 02/43] arm64: RME: Handle Granule Protection Faults (GPFs) Steven Price
2025-06-11 10:48 ` [PATCH v9 03/43] arm64: RME: Add SMC definitions for calling the RMM Steven Price
2025-06-11 10:48 ` [PATCH v9 04/43] arm64: RME: Add wrappers for RMI calls Steven Price
2025-06-11 10:48 ` [PATCH v9 05/43] arm64: RME: Check for RME support at KVM init Steven Price
2025-06-11 10:48 ` [PATCH v9 06/43] arm64: RME: Define the user ABI Steven Price
2025-07-01 6:29 ` Gavin Shan
2025-06-11 10:48 ` [PATCH v9 07/43] arm64: RME: ioctls to create and configure realms Steven Price
2025-06-16 10:47 ` Suzuki K Poulose
2025-06-23 13:17 ` zhuangyiwei
2025-06-23 14:45 ` Steven Price
2025-06-11 10:48 ` [PATCH v9 08/43] kvm: arm64: Don't expose debug capabilities for realm guests Steven Price
2025-06-11 10:48 ` [PATCH v9 09/43] KVM: arm64: Allow passing machine type in KVM creation Steven Price
2025-07-01 6:38 ` Gavin Shan
2025-06-11 10:48 ` [PATCH v9 10/43] arm64: RME: RTT tear down Steven Price
2025-06-16 10:41 ` Suzuki K Poulose
2025-06-23 14:45 ` Steven Price
2025-06-11 10:48 ` [PATCH v9 11/43] arm64: RME: Allocate/free RECs to match vCPUs Steven Price
2025-06-25 9:00 ` Joey Gouly
2025-06-27 10:37 ` Steven Price
2025-06-11 10:48 ` [PATCH v9 12/43] KVM: arm64: vgic: Provide helper for number of list registers Steven Price
2025-07-01 10:16 ` Suzuki K Poulose
2025-06-11 10:48 ` [PATCH v9 13/43] arm64: RME: Support for the VGIC in realms Steven Price
2025-07-01 6:41 ` Gavin Shan
2025-07-01 10:20 ` Suzuki K Poulose
2025-07-03 13:22 ` Suzuki K Poulose
2025-07-09 14:42 ` Steven Price
2025-06-11 10:48 ` [PATCH v9 14/43] KVM: arm64: Support timers in realm RECs Steven Price
2025-07-01 6:42 ` Gavin Shan
2025-07-09 14:49 ` Joey Gouly
2025-07-09 15:29 ` Steven Price
2025-06-11 10:48 ` [PATCH v9 15/43] arm64: RME: Allow VMM to set RIPAS Steven Price
2025-06-17 12:56 ` zhuangyiwei
2025-06-23 14:45 ` Steven Price
2025-06-18 12:33 ` Andre Przywara
2025-06-23 14:45 ` Steven Price [this message]
2025-07-02 0:37 ` Gavin Shan
2025-07-09 14:42 ` Steven Price
2025-07-10 5:24 ` Gavin Shan
2025-06-11 10:48 ` [PATCH v9 16/43] arm64: RME: Handle realm enter/exit Steven Price
2025-06-25 1:45 ` Emi Kisanuki (Fujitsu)
2025-07-02 0:41 ` Gavin Shan
2025-06-11 10:48 ` [PATCH v9 17/43] arm64: RME: Handle RMI_EXIT_RIPAS_CHANGE Steven Price
2025-07-02 0:44 ` Gavin Shan
2025-06-11 10:48 ` [PATCH v9 18/43] KVM: arm64: Handle realm MMIO emulation Steven Price
2025-06-11 10:48 ` [PATCH v9 19/43] arm64: RME: Allow populating initial contents Steven Price
2025-08-01 1:56 ` Vishal Annapurve
2025-08-13 9:30 ` Steven Price
2025-08-14 16:26 ` Vishal Annapurve
2025-08-15 15:48 ` Steven Price
2025-08-15 18:18 ` Vishal Annapurve
2025-08-16 1:56 ` Vishal Annapurve
2025-06-11 10:48 ` [PATCH v9 20/43] arm64: RME: Runtime faulting of memory Steven Price
2025-06-16 11:55 ` Gavin Shan
2025-06-23 16:04 ` Steven Price
2025-07-02 1:04 ` Gavin Shan
2025-06-11 10:48 ` [PATCH v9 21/43] KVM: arm64: Handle realm VCPU load Steven Price
2025-06-11 10:48 ` [PATCH v9 22/43] KVM: arm64: Validate register access for a Realm VM Steven Price
2025-06-24 15:10 ` Joey Gouly
2025-06-11 10:48 ` [PATCH v9 23/43] KVM: arm64: Handle Realm PSCI requests Steven Price
2025-06-11 10:48 ` [PATCH v9 24/43] KVM: arm64: WARN on injected undef exceptions Steven Price
2025-06-11 10:48 ` [PATCH v9 25/43] arm64: Don't expose stolen time for realm guests Steven Price
2025-06-11 10:48 ` [PATCH v9 26/43] arm64: RME: allow userspace to inject aborts Steven Price
2025-06-11 10:48 ` [PATCH v9 27/43] arm64: RME: support RSI_HOST_CALL Steven Price
2025-06-11 10:48 ` [PATCH v9 28/43] arm64: RME: Allow checking SVE on VM instance Steven Price
2025-06-24 12:50 ` Joey Gouly
2025-06-11 10:48 ` [PATCH v9 29/43] arm64: RME: Always use 4k pages for realms Steven Price
2025-06-11 10:48 ` [PATCH v9 30/43] arm64: RME: Prevent Device mappings for Realms Steven Price
2025-06-11 10:48 ` [PATCH v9 31/43] arm_pmu: Provide a mechanism for disabling the physical IRQ Steven Price
2025-06-11 10:48 ` [PATCH v9 32/43] arm64: RME: Enable PMU support with a realm guest Steven Price
2025-06-11 10:48 ` [PATCH v9 33/43] arm64: RME: Hide KVM_CAP_READONLY_MEM for realm guests Steven Price
2025-06-11 10:48 ` [PATCH v9 34/43] arm64: RME: Propagate number of breakpoints and watchpoints to userspace Steven Price
2025-07-24 10:20 ` Joey Gouly
2025-06-11 10:48 ` [PATCH v9 35/43] arm64: RME: Set breakpoint parameters through SET_ONE_REG Steven Price
2025-06-11 10:48 ` [PATCH v9 36/43] arm64: RME: Initialize PMCR.N with number counter supported by RMM Steven Price
2025-07-24 10:47 ` Joey Gouly
2025-06-11 10:48 ` [PATCH v9 37/43] arm64: RME: Propagate max SVE vector length from RMM Steven Price
2025-06-11 10:48 ` [PATCH v9 38/43] arm64: RME: Configure max SVE vector length for a Realm Steven Price
2025-06-11 10:48 ` [PATCH v9 39/43] arm64: RME: Provide register list for unfinalized RME RECs Steven Price
2025-06-11 10:48 ` [PATCH v9 40/43] arm64: RME: Provide accurate register list Steven Price
2025-06-11 10:48 ` [PATCH v9 41/43] KVM: arm64: Expose support for private memory Steven Price
2025-06-12 15:14 ` Joey Gouly
2025-06-12 15:32 ` Steven Price
2025-06-11 10:48 ` [PATCH v9 42/43] KVM: arm64: Expose KVM_ARM_VCPU_REC to user space Steven Price
2025-06-11 10:48 ` [PATCH v9 43/43] KVM: arm64: Allow activating realms Steven Price
2025-06-25 1:51 ` [PATCH v9 00/43] arm64: Support for Arm CCA in KVM Emi Kisanuki (Fujitsu)
2025-06-27 10:37 ` Steven Price
2025-07-04 4:58 ` Gavin Shan
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=c96eb50e-eee6-4589-894a-6e10613f6dfb@arm.com \
--to=steven.price@arm.com \
--cc=alexandru.elisei@arm.com \
--cc=alpergun@google.com \
--cc=andre.przywara@arm.com \
--cc=aneesh.kumar@kernel.org \
--cc=catalin.marinas@arm.com \
--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=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=sdonthineni@nvidia.com \
--cc=suzuki.poulose@arm.com \
--cc=tabba@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®