linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Vishal Annapurve <vannapurve@google.com>
To: Steven Price <steven.price@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 19/43] arm64: RME: Allow populating initial contents
Date: Fri, 15 Aug 2025 11:18:15 -0700	[thread overview]
Message-ID: <CAGtprH9rbW173qZyC5_cHkKT5J4YDSg8itFcR2VZvSY88fsGrQ@mail.gmail.com> (raw)
In-Reply-To: <23be7cdb-f094-4303-87ae-2fdfed80178b@arm.com>

On Fri, Aug 15, 2025 at 8:48 AM Steven Price <steven.price@arm.com> wrote:
>
> >>>> +static int populate_region(struct kvm *kvm,
> >>>> +                          phys_addr_t ipa_base,
> >>>> +                          phys_addr_t ipa_end,
> >>>> +                          unsigned long data_flags)
> >>>> +{
> >>>> +       struct realm *realm = &kvm->arch.realm;
> >>>> +       struct kvm_memory_slot *memslot;
> >>>> +       gfn_t base_gfn, end_gfn;
> >>>> +       int idx;
> >>>> +       phys_addr_t ipa = ipa_base;
> >>>> +       int ret = 0;
> >>>> +
> >>>> +       base_gfn = gpa_to_gfn(ipa_base);
> >>>> +       end_gfn = gpa_to_gfn(ipa_end);
> >>>> +
> >>>> +       idx = srcu_read_lock(&kvm->srcu);
> >>>> +       memslot = gfn_to_memslot(kvm, base_gfn);
> >>>> +       if (!memslot) {
> >>>> +               ret = -EFAULT;
> >>>> +               goto out;
> >>>> +       }
> >>>> +
> >>>> +       /* We require the region to be contained within a single memslot */
> >>>> +       if (memslot->base_gfn + memslot->npages < end_gfn) {
> >>>> +               ret = -EINVAL;
> >>>> +               goto out;
> >>>> +       }
> >>>> +
> >>>> +       if (!kvm_slot_can_be_private(memslot)) {
> >>>> +               ret = -EPERM;
> >>>> +               goto out;
> >>>> +       }
> >>>> +
> >>>> +       while (ipa < ipa_end) {
> >>>> +               struct vm_area_struct *vma;
> >>>> +               unsigned long hva;
> >>>> +               struct page *page;
> >>>> +               bool writeable;
> >>>> +               kvm_pfn_t pfn;
> >>>> +               kvm_pfn_t priv_pfn;
> >>>> +               struct page *gmem_page;
> >>>> +
> >>>> +               hva = gfn_to_hva_memslot(memslot, gpa_to_gfn(ipa));
> >>>> +               vma = vma_lookup(current->mm, hva);
> >>>> +               if (!vma) {
> >>>> +                       ret = -EFAULT;
> >>>> +                       break;
> >>>> +               }
> >>>> +
> >>>> +               pfn = __kvm_faultin_pfn(memslot, gpa_to_gfn(ipa), FOLL_WRITE,
> >>>> +                                       &writeable, &page);
> >>>
> >>> Is this assuming double backing of guest memory ranges? Is this logic
> >>> trying to simulate a shared fault?
> >>
> >> Yes and yes...
> >>
> >>> Does memory population work with CCA if priv_pfn and pfn are the same?
> >>> I am curious how the memory population will work with in-place
> >>> conversion support available for guest_memfd files.
> >>
> >> The RMM interface doesn't support an in-place conversion. The
> >> RMI_DATA_CREATE operation takes the PA of the already delegated
> >> granule[1] along with the PA of a non-delegated granule with the data.
> >
> > Ok, I think this will need a source buffer from userspace that is
> > outside guest_memfd once guest_memfd will support a single backing for
> > guest memory. You might want to simulate private access fault for
> > destination GPAs backed by guest_memfd ranges for this initial data
> > population -> similar to how memory population works today with TDX
> > VMs.
>
> Yes, that might well be the best option. At the moment I'm not sure what
> the best approach from the perspective of the VMM is. The current setup
> is nice because the VMM can populate the VM just like a normal non-coco
> setup, so we don't need to special-case anything. Requiring the VMM to
> load the initial contents into some other memory for the purpose of the
> populate call is a little ugly.

IIUC ARM CCA architecture requires two buffers for initial memory
population irrespective of whether we do it within kernel or in
userspace.

IMO, doing it in the kernel is uglier than doing it in userspace.
Baking the requirement of passing two buffers into userspace ABI for
populate seems cleaner to me.

>
> The other option is to just return to the double-memcpy() approach of
> emulating an in-place content-preserving populate by the kernel copying
> the data out of guest_memfd into a temporary page before doing the
> conversion and the RMM copying back from the temporary page. I worry
> about the performance of this, although it doesn't prevent the first
> option being added in the future if necessary. The big benefit is that
> it goes back to looking like a non-coco VM (but using guest_memfd).

Populate path is CoCo specific, I don't see the benefit of trying to
match the behavior with non-coco VMs in userspace.

>
> > Note that with single backing around, at least for x86, KVM
> > shared/private stage2 faults will always be served using guest_memfd
> > as the source of truth (i.e. not via userspace pagetables for shared
> > faults).
>
> Indeed, it's not yet clear to me whether we can only support this
> "single backing" world for CCA, or if it's going to be an option
> alongside using guest_memfd only for protected memory. Obviously we need
> the guest_memfd changes to land first too...

Having a dual backing support just for supporting the initial populate
seems overkill to me. How much payload in general are we talking about
in terms of percentage of total memory size?

IMO, dual backing for guest_memfd was a stopgap solution and should be
deprecated once we have single memory backing support.
CoCo VMs should default to using single backing going forward. Mmap
support [1] for guest_memfd is close to getting merged. In-place
conversion support is likely to follow soon.

[1] https://lore.kernel.org/all/20250729225455.670324-1-seanjc@google.com/

>
> At the moment I'm planning to post a v10 of this series soon, keeping
> the same API. But we will definitely want to support the new guest_memfd
> approach when it's ready.
>
> Thanks,
> Steve
>


  reply	other threads:[~2025-08-15 20:20 UTC|newest]

Thread overview: 90+ 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:16   ` zhuangyiwei
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
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 [this message]
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=CAGtprH9rbW173qZyC5_cHkKT5J4YDSg8itFcR2VZvSY88fsGrQ@mail.gmail.com \
    --to=vannapurve@google.com \
    --cc=alexandru.elisei@arm.com \
    --cc=alpergun@google.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=steven.price@arm.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;
as well as URLs for NNTP newsgroup(s).