From: Marc Zyngier <maz@kernel.org>
To: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
Cc: Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Oliver Upton <oupton@kernel.org>,
Fuad Tabba <tabba@google.com>, Joey Gouly <joey.gouly@arm.com>,
Steffen Eiden <seiden@linux.ibm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Zenghui Yu <yuzenghui@huawei.com>,
Paolo Bonzini <pbonzini@redhat.com>,
Jonathan Corbet <corbet@lwn.net>,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org, kvmarm@lists.linux.dev,
kvm@vger.kernel.org, linux-doc@vger.kernel.org,
linux-kselftest@vger.kernel.org,
Jack Thomson <jackabt@amazon.com>,
Jack Thomson <jackabt.amazon@gmail.com>,
Alexandru Elisei <alexandru.elisei@arm.com>,
Vincent Donnefort <vdonnefort@google.com>,
"Aneesh Kumar K.V" <aneesh.kumar@kernel.org>,
Sean Christopherson <seanjc@google.com>,
Claudio Imbrenda <imbrenda@linux.ibm.com>,
Leo Soares Passos <Leo.Bras@arm.com>
Subject: Re: [PATCH 5/8] KVM: arm64: Implement KVM_PRE_FAULT_MEMORY
Date: Thu, 10 Sep 2026 11:02:06 +0100 [thread overview]
Message-ID: <86tsnx77c1.wl-maz@kernel.org> (raw)
In-Reply-To: <20260825-kvm-arm-prefault-v1-5-befe8947702e@kernel.org>
On Tue, 25 Aug 2026 17:00:39 +0100,
"Lorenzo Stoakes (ARM)" <ljs@kernel.org> wrote:
>
> Implement KVM stage 2 page table pre-faulting for the arm64 architecture.
>
> Do the trivial plumbing by selecting CONFIG_KVM_GENERIC_PRE_FAULT_MEMORY in
> Kconfig, returning 1 in kvm_vm_ioctl_check_extension() for
> KVM_CAP_PRE_FAULT_MEMORY but false in kvm_pkvm_ext_allowed() to disallow
> its use for pKVM.
>
> Add kvm_arch_vcpu_pre_fault_memory() to actually implement the feature by
> pre-faulting stage 2 page tables for a specific GPA.
>
> Previous commits added the required foundations - gmem_abort() and
> user_mem_abort() determine esr and mmu from s2fd->esr and s2fd->mmu
> respectively, the granule size is returned by them in kvm_s2_fault_result
> and kvm_pgtable_get_leaf() accepts a walk flags parameter.
>
> Additionally, kvm_pgtable_get_leaf() now accepts a walk flag, meaning its
> page table walk can be performed with KVM_PGTABLE_WALK_SHARED set and thus
> can be performed under a read mmu_lock.
We really don't need a recap of the previous episodes... ;-)
>
> With these changes in place, implement pre-faulting by first trying a page
> table walk under the MMU read lock then, if it fails, injecting a
> synthetic data abort at the page table level at which the page table walk
> failed.
>
> This is necessarily racey as reclaim might happen at any time. Successfully
> pre-faulting can therefore only guarantee that each GPA was observed to be
> mapped at least once.
>
> Protected KVM (pKVM) is not supported at all because pKVM creates VMs and
> vCPUs when first run, meaning any attempt to pre-fault prior to this cannot
> succeed.
>
> Since the sensible use case for pre-faulting is doing so prior to vCPU run,
> and supporting only online pKVM vCPUs is confusing and inconsistent, simply
> don't support this at all.
>
> There is a subtlety when retrieving the hva: it seems natural to use
> gfn_to_hva_memslot(), but this errors out for read-only memslots.
>
> Since pre-faulting should fault in both read-only and read/write hvas, this
> isn't the correct API to use here.
>
> gfn_to_hva_memslot_prot() allows retrieval of read-only hvas, but has
> unclear semantics, so introduce gfn_to_hva_memslot_read() to wrap it.
>
> A retry mechanic is implemented when user_mem_abort() or gmem_abort() fail
> to map memory due to a benign failure where a hardware abort would not
> result in an error.
>
> These occur when the abort handler was raced by either an invalidation MMU
> notifier or a racing abort path.
>
> Since these faults are highly likely to succeed on immediate retry, retry
> up to MAX_PRE_FAULT_RETRIES times, after which -EAGAIN is ultimately
> returned to the caller.
>
> An invalid memslot (i.e. a memslot with the KVM_MEMSLOT_INVALID flag set)
> also results in the operation returning -EAGAIN without a retry mechanic.
>
> This is because an invalid memslot means the pre-fault operation raced with
> memslot reclaim, and since the SRCU lock is held, progress cannot be made.
>
> Therefore, when this happens, -EAGAIN indicates that userland should retry
> the ioctl, which will bounce the SRCU lock and permit forward progress.
>
> Finally, update the KVM API documentation to describe the changes,
> providing arm64-specific implementation details.
>
> This work is based with gratitude on Jack Thomson's original series, its
> previous revisions and the feedback they received.
Honestly, this whole commit message reads like a cover letter.
Consider writing something more succinct, which would be helped by
splitting the patch: if you have so much to say for a single patch,
that's probably that the patch is doing too many things.
>
> Link: https://patch.msgid.link/20260612162354.73378-1-jackabt.amazon@gmail.com/
> Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
> ---
> Documentation/virt/kvm/api.rst | 17 +++-
> arch/arm64/include/asm/kvm_pkvm.h | 2 +-
> arch/arm64/kvm/Kconfig | 1 +
> arch/arm64/kvm/arm.c | 1 +
> arch/arm64/kvm/mmu.c | 192 +++++++++++++++++++++++++++++++++++---
> 5 files changed, 198 insertions(+), 15 deletions(-)
>
> diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
> index 4988c32df4bf..6246f4a56bb9 100644
> --- a/Documentation/virt/kvm/api.rst
> +++ b/Documentation/virt/kvm/api.rst
> @@ -6485,7 +6485,7 @@ See KVM_SET_USER_MEMORY_REGION2 for additional details.
> ---------------------------
>
> :Capability: KVM_CAP_PRE_FAULT_MEMORY
> -:Architectures: none
> +:Architectures: x86, s390, arm64
> :Type: vcpu ioctl
> :Parameters: struct kvm_pre_fault_memory (in/out)
> :Returns: 0 if at least one page is processed, < 0 on error
> @@ -6493,12 +6493,14 @@ See KVM_SET_USER_MEMORY_REGION2 for additional details.
> Errors:
>
> ========== ===============================================================
> + EAGAIN A race occurred before progress was made, but a retry may succeed.
> EINVAL The specified `gpa` and `size` were invalid (e.g. not
> page aligned, causes an overflow, or size is zero), or the VM
> is UCONTROL (s390).
> ENOENT The specified `gpa` is outside defined memslots.
> EINTR An unmasked signal is pending and no page was processed.
> EFAULT The parameter address was invalid.
> + EHWPOISON A poisoned host page was encountered.
> EOPNOTSUPP Mapping memory for a GPA is unsupported by the
> hypervisor, and/or for the current vCPU state/mode.
> EIO unexpected error conditions (also causes a WARN)
> @@ -6518,7 +6520,16 @@ Errors:
> KVM_PRE_FAULT_MEMORY populates KVM's stage-2 page tables used to map memory
> for the current vCPU state. KVM maps memory as if the vCPU generated a
> stage-2 read page fault, e.g. faults in memory as needed, but doesn't break
> -CoW. On x86, KVM does not mark any newly created stage-2 PTE as Accessed.
> +CoW. On arm64, KVM marks both existing and newly created stage-2 PTEs as
> +Accessed, on x86 it does not and for s390 it is not applicable.
Meh. See below.
> +
> +On arm64, a GPA is interpreted as an IPA, and never interpreted as the IPA
> +of a nested guest. Pre-faulting only populates canonical stage 2 page
> +tables.
> +
> +The feature is not supported on arm64 if the protected KVM (pKVM) feature
> +is enabled, as that results in vCPUs being instantiated on first run, which
> +renders pre-faulting useless.
I don't think we need to justify why this is not available with pKVM.
I expect pKVM to eventually support this through a slightly different
mechanism anyway.
>
> In the case of confidential VM types where there is an initial set up of
> private guest memory before the guest is 'finalized'/measured, this ioctl
> @@ -6533,7 +6544,7 @@ When the ioctl returns, the input values are updated to point to the
> remaining range. If `size` > 0 on return, the caller can just issue
> the ioctl again with the same `struct kvm_map_memory` argument.
>
> -Shadow page tables cannot support this ioctl because they
> +On x86, Shadow page tables cannot support this ioctl because they
shadow
> are indexed by virtual address or nested guest physical address.
> Calling this ioctl when the guest is using shadow page tables (for
> example because it is running a nested guest with nested page tables)
Documentation updates in a separate patch, please.
> diff --git a/arch/arm64/include/asm/kvm_pkvm.h b/arch/arm64/include/asm/kvm_pkvm.h
> index beea00e693a0..4d6e5765e9e5 100644
> --- a/arch/arm64/include/asm/kvm_pkvm.h
> +++ b/arch/arm64/include/asm/kvm_pkvm.h
> @@ -44,9 +44,9 @@ static inline bool kvm_pkvm_ext_allowed(struct kvm *kvm, long ext)
> case KVM_CAP_ARM_PTRAUTH_GENERIC:
> return true;
> case KVM_CAP_ARM_MTE:
> - return false;
> case KVM_CAP_ARM_EAGER_SPLIT_CHUNK_SIZE:
> case KVM_CAP_ARM_SUPPORTED_BLOCK_SIZES:
> + case KVM_CAP_PRE_FAULT_MEMORY:
> return false;
> default:
> return !kvm || !kvm_vm_is_protected(kvm);
> diff --git a/arch/arm64/kvm/Kconfig b/arch/arm64/kvm/Kconfig
> index 449154f9a485..71233068b7cb 100644
> --- a/arch/arm64/kvm/Kconfig
> +++ b/arch/arm64/kvm/Kconfig
> @@ -37,6 +37,7 @@ menuconfig KVM
> select SCHED_INFO
> select GUEST_PERF_EVENTS if PERF_EVENTS
> select KVM_GUEST_MEMFD
> + select KVM_GENERIC_PRE_FAULT_MEMORY
> help
> Support hosting virtualized guest machines.
>
> diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> index ccae82c1242b..58ac70f31d84 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -393,6 +393,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
> case KVM_CAP_COUNTER_OFFSET:
> case KVM_CAP_ARM_WRITABLE_IMP_ID_REGS:
> case KVM_CAP_ARM_SEA_TO_USER:
> + case KVM_CAP_PRE_FAULT_MEMORY:
> r = 1;
> break;
> case KVM_CAP_SET_GUEST_DEBUG2:
> diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c
> index 16299004f229..401ae538ae75 100644
> --- a/arch/arm64/kvm/mmu.c
> +++ b/arch/arm64/kvm/mmu.c
> @@ -5,6 +5,7 @@
> */
>
> #include <linux/acpi.h>
> +#include <linux/cleanup.h>
> #include <linux/mman.h>
> #include <linux/kvm_host.h>
> #include <linux/io.h>
> @@ -1554,9 +1555,9 @@ static void *get_mmu_memcache(struct kvm_vcpu *vcpu)
> return &vcpu->arch.pkvm_memcache;
> }
>
> -static int topup_mmu_memcache(struct kvm_vcpu *vcpu, void *memcache)
> +static int topup_mmu_memcache(struct kvm_s2_mmu *mmu, void *memcache)
> {
> - int min_pages = kvm_mmu_cache_min_pages(vcpu->arch.hw_mmu);
> + const int min_pages = kvm_mmu_cache_min_pages(mmu);
Changes to the memcache interface in a separate patch, please.
>
> if (!is_protected_kvm_enabled())
> return kvm_mmu_topup_memory_cache(memcache, min_pages);
> @@ -1605,6 +1606,7 @@ struct kvm_s2_fault_desc {
> unsigned long hva;
> unsigned long esr;
> struct kvm_s2_mmu *mmu;
> + bool pre_fault;
No, please, that's horrible. See below.
> };
>
> struct kvm_s2_fault_result {
> @@ -1664,7 +1666,7 @@ static int gmem_abort(const struct kvm_s2_fault_desc *s2fd,
>
> if (!perm_fault) {
> memcache = get_mmu_memcache(s2fd->vcpu);
> - ret = topup_mmu_memcache(s2fd->vcpu, memcache);
> + ret = topup_mmu_memcache(s2fd->mmu, memcache);
> if (ret)
> return ret;
> }
> @@ -1761,7 +1763,7 @@ static int pkvm_mem_abort(const struct kvm_s2_fault_desc *s2fd)
> int ret;
>
> hyp_memcache = get_mmu_memcache(vcpu);
> - ret = topup_mmu_memcache(vcpu, hyp_memcache);
> + ret = topup_mmu_memcache(s2fd->mmu, hyp_memcache);
> if (ret)
> return -ENOMEM;
>
> @@ -1953,6 +1955,8 @@ static int kvm_s2_fault_pin_pfn(const struct kvm_s2_fault_desc *s2fd,
> &s2vi->map_writable, &s2vi->page);
> if (unlikely(is_error_noslot_pfn(s2vi->pfn))) {
> if (s2vi->pfn == KVM_PFN_ERR_HWPOISON) {
> + if (s2fd->pre_fault)
> + return -EHWPOISON;
I'd rather *always* return -EHWPOISON here, and move the signal
injection into the callers. That would much more consistent.
> kvm_send_hwpoison_signal(s2fd->hva, __ffs(s2vi->vma_pagesize));
> return 0;
> }
> @@ -2163,7 +2167,7 @@ static int user_mem_abort(const struct kvm_s2_fault_desc *s2fd,
> memcache = get_mmu_memcache(s2fd->vcpu);
> if (!perm_fault || memslot_is_logging(s2fd->memslot) ||
> is_protected_kvm_enabled()) {
> - ret = topup_mmu_memcache(s2fd->vcpu, memcache);
> + ret = topup_mmu_memcache(s2fd->mmu, memcache);
> if (ret)
> return ret;
> }
> @@ -2185,18 +2189,22 @@ static int user_mem_abort(const struct kvm_s2_fault_desc *s2fd,
> return kvm_s2_fault_map(s2fd, &s2vi, prot, memcache, result);
> }
>
> -/* Resolve the access fault by making the page young again. */
> -static void handle_access_fault(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa)
> +static void __handle_access_fault(struct kvm_pgtable *pgt, phys_addr_t fault_ipa)
> {
> enum kvm_pgtable_walk_flags flags = KVM_PGTABLE_WALK_SHARED;
> - struct kvm_s2_mmu *mmu;
>
> trace_kvm_access_fault(fault_ipa);
> + KVM_PGT_FN(kvm_pgtable_stage2_mkyoung)(pgt, fault_ipa, flags);
> +}
> +
> +/* Resolve the access fault by making the page young again. */
> +static void handle_access_fault(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa)
> +{
> + struct kvm_s2_mmu *mmu;
>
> - read_lock(&vcpu->kvm->mmu_lock);
> + guard(read_lock)(&vcpu->kvm->mmu_lock);
> mmu = vcpu->arch.hw_mmu;
> - KVM_PGT_FN(kvm_pgtable_stage2_mkyoung)(mmu->pgt, fault_ipa, flags);
> - read_unlock(&vcpu->kvm->mmu_lock);
> + __handle_access_fault(mmu->pgt, fault_ipa);
> }
>
> /*
> @@ -2834,3 +2842,165 @@ void kvm_toggle_cache(struct kvm_vcpu *vcpu, bool was_enabled)
>
> trace_kvm_toggle_cache(*vcpu_pc(vcpu), was_enabled, now_enabled);
> }
> +
> +static bool kvm_pte_young_s2(kvm_pte_t pte)
> +{
> + return pte & KVM_PTE_LEAF_ATTR_LO_S2_AF;
> +}
> +
> +static void kvm_pte_mkyoung_s2(struct kvm_pgtable *pgt, gpa_t gpa)
> +{
> + struct kvm *kvm = kvm_s2_mmu_to_kvm(pgt->mmu);
> +
> + lockdep_assert_held(&kvm->mmu_lock);
> + /* Despite its name, doesn't fault here. */
> + __handle_access_fault(pgt, gpa);
> +}
> +
> +/*
> + * Try to walk to the specified GPA in canonical mmu - if unmapped returns 0, if
> + * mapped returns the granule size, otherwise returns an error.
> + */
> +static long kvm_walk_s2(struct kvm_pgtable *pgt,
> + gpa_t gpa, s8 *level)
> +{
> + struct kvm *kvm = kvm_s2_mmu_to_kvm(pgt->mmu);
> + kvm_pte_t pte;
> + long ret;
> +
> + guard(read_lock)(&kvm->mmu_lock);
> +
> + ret = kvm_pgtable_get_leaf(pgt, gpa, &pte, level,
> + KVM_PGTABLE_WALK_SHARED);
> + if (ret)
> + return ret;
> + /* Unpopulated, must fault. */
> + if (!kvm_pte_valid(pte))
> + return 0;
> + /* Walked the entry so mark young. */
> + if (!kvm_pte_young_s2(pte))
> + kvm_pte_mkyoung_s2(pgt, gpa);
I'm not sold on this either. The contract with userspace is to map the
page at S2, not to pretend it has been accessed by the vcpu. I don't
see why we should do that, as this is a departure from an established
behaviour.
> + return kvm_granule_size(*level);
> +}
> +
> +/* Synthesised data abort at specified page table level. */
> +#define PRE_FAULT_ESR(level) \
> + ((ESR_ELx_EC_DABT_LOW << ESR_ELx_EC_SHIFT) | \
> + ESR_ELx_IL | ESR_ELx_FSC_FAULT_L(level))
> +
> +/* Retrieve either a read-only or a read/write hva. */
> +static hva_t gfn_to_hva_memslot_read(struct kvm_memory_slot *slot, gfn_t gfn)
> +{
> + return gfn_to_hva_memslot_prot(slot, gfn, /*writable=*/NULL);
> +}
> +
> +static long __pre_fault_s2(struct kvm_s2_mmu *mmu, struct kvm_vcpu *vcpu,
> + gpa_t gpa, struct kvm_memory_slot *memslot, s8 level)
> +{
> + const bool is_gmem = kvm_slot_has_gmem(memslot);
> + const gfn_t gfn = gpa_to_gfn(gpa);
> + const hva_t hva = is_gmem ? 0 : gfn_to_hva_memslot_read(memslot, gfn);
> + const struct kvm_s2_fault_desc s2fd = {
> + .vcpu = vcpu,
> + .fault_ipa = gpa,
> + .nested = NULL,
> + .memslot = memslot,
> + .hva = hva,
> + .esr = PRE_FAULT_ESR(level),
> + .mmu = mmu,
> + .pre_fault = true,
> + };
> + struct kvm_s2_fault_result result = {};
> + long ret;
> +
> + if (kvm_is_error_hva(hva))
> + return -EFAULT;
> +
> + if (is_gmem)
> + ret = gmem_abort(&s2fd, &result);
> + else
> + ret = user_mem_abort(&s2fd, &result);
> + if (IS_ERR_VALUE(ret))
> + return ret;
> + if (!result.mapped)
> + return -EAGAIN;
> + return result.mapping_size;
> +}
> +
> +static long pre_fault_s2(struct kvm_s2_mmu *mmu, struct kvm_vcpu *vcpu,
> + gpa_t gpa, struct kvm_memory_slot *memslot)
> +{
> + s8 level = KVM_PGTABLE_LAST_LEVEL;
level is the result of a successful walk. Why do we need to initialise
this to anything here? We don't seem to do that anywhere else.
> + long ret;
> +
> + /* Try a walk first. */
> + ret = kvm_walk_s2(mmu->pgt, gpa, &level);
> + if (ret)
> + return ret;
> + /* OK, have to fault page in. */
> + return __pre_fault_s2(mmu, vcpu, gpa, memslot, level);
> +}
> +
> +static unsigned long
> +pre_fault_bytes_consumed(gpa_t gpa, unsigned long granule_size,
> + unsigned long bytes_remaining)
> +{
> + /* Granules are always a power-of-2. */
> + const unsigned long granule_bytes_remaining =
> + granule_size - (gpa % granule_size);
> +
> + return min(granule_bytes_remaining, bytes_remaining);
> +}
> +
> +/* If you lose the race this many times, time to give up. */
> +#define MAX_PRE_FAULT_RETRIES 3
> +
> +/**
> + * kvm_arch_vcpu_pre_fault_memory - pre-fault stage-2 page tables for the
> + * specified GPA.
> + * @vcpu: The VCPU pointer
> + * @range: {gpa, size, flags} tuple
> + *
> + * The mapping performed is always best-effort - faulting in is necessarily
> + * racey. The ranges faulted in are canonical, nested page tables are ignored.
> + *
> + * If the GPA is already mapped, the page table entry is marked young.
> + *
> + * @range->gpa specifies the GPA to pre-fault, @range->size specifies how many
> + * bytes remain to be pre-faulted and @range->flags is reserved and must be 0.
> + *
> + * Returns: the number of bytes the pre-fault consumed, or an error.
> + */
> +long kvm_arch_vcpu_pre_fault_memory(struct kvm_vcpu *vcpu,
> + struct kvm_pre_fault_memory *range)
> +{
> + struct kvm *kvm = vcpu->kvm;
> + const u64 bytes_remaining = range->size;
> + struct kvm_s2_mmu *mmu = &kvm->arch.mmu; /* Canonical. */
> + struct kvm_memory_slot *memslot;
> + const gpa_t gpa = range->gpa;
> + int num_retries = 0;
> + long ret;
> +
> + /*
> + * pKVM is unsupported as their vCPUs are instantiated on first run and
> + * pre-faulting only running vCPUs would be inconsistent and confusing.
> + */
> + if (is_protected_kvm_enabled())
> + return -EOPNOTSUPP;
> +
> + memslot = gfn_to_memslot(kvm, gpa_to_gfn(gpa));
> + if (!memslot)
> + return -ENOENT;
> + /* SRCU must be released for progress and only userland can do that. */
> + if (memslot->flags & KVM_MEMSLOT_INVALID)
> + return -EAGAIN;
> +
> + do {
> + ret = pre_fault_s2(mmu, vcpu, gpa, memslot);
> + } while (ret == -EAGAIN && num_retries++ < MAX_PRE_FAULT_RETRIES);
> +
> + if (IS_ERR_VALUE(ret))
> + return ret;
> + return pre_fault_bytes_consumed(gpa, ret, bytes_remaining);
> +}
>
Thanks,
M.
--
Without deviation from the norm, progress is not possible.
next prev parent reply other threads:[~2026-09-10 10:02 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-25 16:00 [PATCH 0/8] KVM: arm64: Add KVM_PRE_FAULT_MEMORY support Lorenzo Stoakes (ARM)
2026-08-25 16:00 ` [PATCH 1/8] KVM: arm64: Propagate and use esr in s2fd when handling guest aborts Lorenzo Stoakes (ARM)
2026-09-10 8:39 ` Marc Zyngier
2026-09-10 9:04 ` Lorenzo Stoakes (ARM)
2026-08-25 16:00 ` [PATCH 2/8] KVM: arm64: Propagate and use mmu " Lorenzo Stoakes (ARM)
2026-08-25 16:00 ` [PATCH 3/8] KVM: arm64: Propagate and use kvm_s2_fault_result on S2 fault Lorenzo Stoakes (ARM)
2026-09-10 8:49 ` Marc Zyngier
2026-09-10 9:00 ` Lorenzo Stoakes (ARM)
2026-08-25 16:00 ` [PATCH 4/8] KVM: arm64: Pass walk flags to kvm_pgtable_get_leaf() Lorenzo Stoakes (ARM)
2026-08-25 16:00 ` [PATCH 5/8] KVM: arm64: Implement KVM_PRE_FAULT_MEMORY Lorenzo Stoakes (ARM)
2026-09-10 10:02 ` Marc Zyngier [this message]
2026-09-10 15:32 ` Lorenzo Stoakes (ARM)
2026-08-25 16:00 ` [PATCH 6/8] KVM: selftests: Enable pre_fault_memory_test for arm64 Lorenzo Stoakes (ARM)
2026-09-10 18:52 ` Fuad Tabba
2026-08-25 16:00 ` [PATCH 7/8] KVM: selftests: Add option for different backing in pre-fault tests Lorenzo Stoakes (ARM)
2026-08-25 16:00 ` [PATCH 8/8] KVM: selftests: Add nested pre-fault test for arm64 Lorenzo Stoakes (ARM)
2026-09-10 18:57 ` Fuad Tabba
2026-09-11 9:21 ` Lorenzo Stoakes (ARM)
2026-09-11 6:30 ` Itaru Kitayama
2026-09-11 9:32 ` Lorenzo Stoakes (ARM)
2026-09-11 12:42 ` Wei-Lin Chang
2026-09-11 15:44 ` Lorenzo Stoakes (ARM)
2026-09-10 18:44 ` [PATCH 0/8] KVM: arm64: Add KVM_PRE_FAULT_MEMORY support Fuad Tabba
2026-09-11 9:16 ` Lorenzo Stoakes (ARM)
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=86tsnx77c1.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=Leo.Bras@arm.com \
--cc=alexandru.elisei@arm.com \
--cc=aneesh.kumar@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=corbet@lwn.net \
--cc=imbrenda@linux.ibm.com \
--cc=jackabt.amazon@gmail.com \
--cc=jackabt@amazon.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-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=ljs@kernel.org \
--cc=oupton@kernel.org \
--cc=pbonzini@redhat.com \
--cc=seanjc@google.com \
--cc=seiden@linux.ibm.com \
--cc=suzuki.poulose@arm.com \
--cc=tabba@google.com \
--cc=vdonnefort@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®