From: Vincent Donnefort <vdonnefort@google.com>
To: maz@kernel.org, oupton@kernel.org, kvmarm@lists.linux.dev,
linux-arm-kernel@lists.infradead.org
Cc: joey.gouly@arm.com, seiden@linux.ibm.com, suzuki.poulose@arm.com,
yuzenghui@huawei.com, catalin.marinas@arm.com, will@kernel.org,
kernel-team@android.com, fuad.tabba@linux.dev,
qperret@google.com
Subject: Re: [PATCH v5 00/18] KVM: arm64: Introduce pKVM hypervisor heap allocator
Date: Wed, 30 Sep 2026 15:50:29 +0100 [thread overview]
Message-ID: <ar0htZydVZdB9zVk@google.com> (raw)
In-Reply-To: <20260901080941.997769-1-vdonnefort@google.com>
Gentle ping for this series,
It's been fully reviewed by Fuad and is already based on 7.3-rc1.
--
Vincent
On Tue, Sep 01, 2026 at 09:09:23AM +0100, Vincent Donnefort wrote:
> pKVM historically lacked a dynamic memory allocator: all hypervisor-side
> VM and VCPU structures had to be sized on the host, allocated as
> contiguous pages and donated to the hypervisor.
>
> This design tightly coupled the hypervisor's memory footprint to
> host-side constraints, complicated memory reclaim, and severely
> restricted VM scalability.
>
> This patch series introduces a dynamically-mapped custom heap allocator
> (hyp_allocator) to the pKVM hypervisor. The initial users are the
> pkvm_hyp_vm and pkvm_hyp_vcpu structs, and the hypervisor tracing
> metadata.
>
> In the near future, this heap allocator is expected to be leveraged to
> support SVE in protected VMs and in the distant future, it will also
> support dynamic device assignment.
>
> By moving to a hypervisor-managed dynamic allocator, we also allow
> deduplicating the donation/reclaim path of EL2-private structures.
>
> The main building blocks for this series are:
>
> 1. pkvm_hyp_req:
> ----------------
> When the hypervisor heap allocator goes out of memory (-ENOMEM), it
> suspends the hypercall, embeds a PKVM_HYP_REQ_HYP_ALLOC top-up request
> into the SMCCC HVC return registers, and exits back to the host.
>
> This building block will also be useful for the future huge-mapping
> support in protected guests, allowing EL2 to raise requests such as
> block splitting back to the host.
>
> 2. hyp_allocator:
> ----------------
> This heap allocator manages a reserved VA space range, dynamically
> mapping and unmapping physical pages on-demand to minimise the pKVM
> hypervisor footprint. As memory is reclaimed and relinquished to the
> host, unmapped holes are introduced within the VA space. To prevent
> orphan mapped regions, neighboring unused chunks cannot be merged if
> they are separated by an unmapped region.
>
> The allocator chunk metadata is stored directly into the VA space range.
> To minimize metadata overhead, chunks only link to each other via a
> relative 32-bit offset.
>
> A simple hardening of the metadata is added via a simple 32-bit hash.
>
> 3. shrinker:
> ------------
> As the heap allocator isn't reclaimed actively on VM or tracing
> teardown, a shrinker is added to allow the host to reclaim unused memory
> from the hypervisor when the host is under heavy memory pressure.
>
> Changelog
> ---------
>
> v5:
>
> - Remove unreachable !prev checks in hyp_allocator_destroy_chunk() (Fuad)
> - Add kerneldoc to pkvm_call_hyp_req() (Fuad)
> - Avoid duplicate handle___pkvm_hyp_alloc_selftest() definitions when !CONFIG_NVHE_EL2_DEBUG
> - Chunk pkvm_hyp_reclaim() with cond_resched() to avoid blocking in EL2
> - Allow shrinker to scan across all runtime topup IDs
> - Reclaim chunks before draining allocator->mc in hyp_allocator_reclaim() (Fuad)
> - Make is_ttbr1_addr() check in __kern_hyp_va() conditional to pKVM (Fuad)
> - Rename pkvm_memcache to stage2_mc
> - Rebased on 7.3-rc1
>
> v4: https://lore.kernel.org/all/20260731143541.956291-1-vdonnefort@google.com/
>
> - Add kerneldoc to pkvm_remove_mappings
> - Allow pkvm_private_va_range_pa() to work with block-level mappings (Sashiko)
> - Add rollback and harden pkvm_map_private_va_range input (Sashiko)
> - Add missing mc count into reclaimable memory
> - Differentiate -ENOMEM from hyp_alloc in errno_to_smccc() (Sashiko)
> - Collect Fuad's Tested-by
>
> v3: https://lore.kernel.org/all/20260720171513.1415357-1-vdonnefort@google.com/
>
> - Remove unsafe WARN_ON(hyp_spin_is_locked(&pkvm_pgd_lock)) check in hyp_allocator_alloc() (Sashiko)
> - Modify MIN_ALLOC_SIZE to 16-bytes to comply with FPSIMD alignment requirements (Sashiko)
> - Allow hyp topup/reclaim HVCs pre-deprivilege
> - Add enum symbols to pkvm_hyp_req_handle event (Fuad)
> - Various clarification in commit descriptions (Fuad)
> - Restore unmap_donated_memory() for PGD on error path (Fuad)
> - Renamed __hyp_allocator_map -> pkvm_map_private_va_range (Fuad)
> - Collected Fuad's Reviewed-by tags
> - Rebased on 7.2-rc4
>
> v2: https://lore.kernel.org/all/20260706175415.2604046-1-vdonnefort@google.com/
>
> - Rebased series on 7.2-rc2.
> - Use scope-based hyp_spinlock.
> - Fix best_missing/best_data_size priority in hyp_allocator_find_efficient_chunk() (Sashiko)
> - Fix missing free_hyp_memcache() in pkvm_hyp_topup() (Sashiko)
> - Fix unused selftest_init() warning when !CONFIG_NVHE_EL2_DEBUG (Sashiko)
> - Fix missing shrinker_free() in teardown_hyp_mode() (Sashiko)
>
> v1: https://lore.kernel.org/r/20260520152650.4107895-1-vdonnefort@google.com
>
> Vincent Donnefort (18):
> KVM: arm64: Add pkvm_private_va_range_pa
> KVM: arm64: Add pkvm_remove_mappings
> KVM: arm64: Add pkvm_map_private_va_range
> KVM: arm64: Add a heap allocator for the pKVM hyp
> KVM: arm64: Allow kvm_hyp_memcache usage outside of stage-2
> KVM: arm64: Add pkvm_hyp_req infrastructure
> KVM: arm64: Add PKVM_HYP_REQ_HYP_ALLOC request
> KVM: arm64: Add reclaim interface for the pKVM heap alloc
> KVM: arm64: Add selftests for the pKVM heap allocator
> KVM: arm64: Add a shrinker for pKVM
> KVM: arm64: Filter out non-kernel addresses in kern_hyp_va
> KVM: arm64: Move hyp_vm refcount into the structure
> KVM: arm64: Alloc pkvm_hyp_vm using pKVM heap allocator
> KVM: arm64: Alloc pkvm_hyp_vcpu using pKVM heap allocator
> KVM: arm64: Rename vCPU pkvm_memcache to stage2_mc
> KVM: arm64: Reject hyp trace descriptors with fewer CPUs than
> hyp_nr_cpus
> KVM: arm64: Reject hyp trace descriptors with fewer than 3 pages
> KVM: arm64: Alloc simple_buffer_page using pKVM hyp allocator
>
> arch/arm64/include/asm/kvm_asm.h | 4 +
> arch/arm64/include/asm/kvm_host.h | 16 +-
> arch/arm64/include/asm/kvm_mmu.h | 3 +
> arch/arm64/include/asm/kvm_pkvm.h | 117 ++
> arch/arm64/kvm/arm.c | 4 +-
> arch/arm64/kvm/hyp/hyp-constants.c | 2 -
> arch/arm64/kvm/hyp/include/nvhe/alloc.h | 28 +
> arch/arm64/kvm/hyp/include/nvhe/mm.h | 3 +
> arch/arm64/kvm/hyp/include/nvhe/pkvm.h | 19 +-
> arch/arm64/kvm/hyp/include/nvhe/spinlock.h | 4 +
> arch/arm64/kvm/hyp/nvhe/Makefile | 2 +-
> arch/arm64/kvm/hyp/nvhe/alloc.c | 1211 ++++++++++++++++++++
> arch/arm64/kvm/hyp/nvhe/hyp-main.c | 125 +-
> arch/arm64/kvm/hyp/nvhe/mem_protect.c | 10 +-
> arch/arm64/kvm/hyp/nvhe/mm.c | 79 ++
> arch/arm64/kvm/hyp/nvhe/pkvm.c | 104 +-
> arch/arm64/kvm/hyp/nvhe/setup.c | 6 +
> arch/arm64/kvm/hyp/nvhe/trace.c | 70 +-
> arch/arm64/kvm/hyp_trace.c | 15 +-
> arch/arm64/kvm/mmu.c | 6 +-
> arch/arm64/kvm/pkvm.c | 200 +++-
> arch/arm64/kvm/trace_pkvm.h | 45 +
> 22 files changed, 1915 insertions(+), 158 deletions(-)
> create mode 100644 arch/arm64/kvm/hyp/include/nvhe/alloc.h
> create mode 100644 arch/arm64/kvm/hyp/nvhe/alloc.c
> create mode 100644 arch/arm64/kvm/trace_pkvm.h
>
>
> base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
> --
> 2.55.0.897.gb25b4bd76c-goog
>
next prev parent reply other threads:[~2026-09-30 14:51 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-01 8:09 [PATCH v5 00/18] KVM: arm64: Introduce pKVM hypervisor heap allocator Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 01/18] KVM: arm64: Add pkvm_private_va_range_pa Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 02/18] KVM: arm64: Add pkvm_remove_mappings Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 03/18] KVM: arm64: Add pkvm_map_private_va_range Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 04/18] KVM: arm64: Add a heap allocator for the pKVM hyp Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 05/18] KVM: arm64: Allow kvm_hyp_memcache usage outside of stage-2 Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 06/18] KVM: arm64: Add pkvm_hyp_req infrastructure Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 07/18] KVM: arm64: Add PKVM_HYP_REQ_HYP_ALLOC request Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 08/18] KVM: arm64: Add reclaim interface for the pKVM heap alloc Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 09/18] KVM: arm64: Add selftests for the pKVM heap allocator Vincent Donnefort
2026-09-01 8:27 ` sashiko-bot
2026-09-01 8:09 ` [PATCH v5 10/18] KVM: arm64: Add a shrinker for pKVM Vincent Donnefort
2026-09-01 17:30 ` Fuad Tabba
2026-09-01 8:09 ` [PATCH v5 11/18] KVM: arm64: Filter out non-kernel addresses in kern_hyp_va Vincent Donnefort
2026-09-01 8:23 ` sashiko-bot
2026-09-01 8:09 ` [PATCH v5 12/18] KVM: arm64: Move hyp_vm refcount into the structure Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 13/18] KVM: arm64: Alloc pkvm_hyp_vm using pKVM heap allocator Vincent Donnefort
2026-09-01 8:34 ` sashiko-bot
2026-09-01 8:09 ` [PATCH v5 14/18] KVM: arm64: Alloc pkvm_hyp_vcpu " Vincent Donnefort
2026-09-01 8:34 ` sashiko-bot
2026-09-01 8:09 ` [PATCH v5 15/18] KVM: arm64: Rename vCPU pkvm_memcache to stage2_mc Vincent Donnefort
2026-09-01 17:59 ` Fuad Tabba
2026-09-01 8:09 ` [PATCH v5 16/18] KVM: arm64: Reject hyp trace descriptors with fewer CPUs than hyp_nr_cpus Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 17/18] KVM: arm64: Reject hyp trace descriptors with fewer than 3 pages Vincent Donnefort
2026-09-01 8:09 ` [PATCH v5 18/18] KVM: arm64: Alloc simple_buffer_page using pKVM hyp allocator Vincent Donnefort
2026-09-01 8:35 ` sashiko-bot
2026-09-30 14:50 ` Vincent Donnefort [this message]
2026-10-01 9:22 ` [PATCH v5 00/18] KVM: arm64: Introduce pKVM hypervisor heap allocator Marc Zyngier
2026-10-01 9:54 ` Marc Zyngier
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=ar0htZydVZdB9zVk@google.com \
--to=vdonnefort@google.com \
--cc=catalin.marinas@arm.com \
--cc=fuad.tabba@linux.dev \
--cc=joey.gouly@arm.com \
--cc=kernel-team@android.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--cc=qperret@google.com \
--cc=seiden@linux.ibm.com \
--cc=suzuki.poulose@arm.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.