From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: Alexandru Elisei <alexandru.elisei@arm.com>
Cc: maz@kernel.org, oupton@kernel.org, fuad.tabba@linux.dev,
joey.gouly@arm.com, seiden@linux.ibm.com,
suzuki.poulose@arm.com, yuzenghui@huawei.com,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
will@kernel.org, mark.rutland@arm.com,
linux-perf-users@vger.kernel.org, catalin.marinas@arm.com,
james.clark@linaro.org
Subject: Re: [RFC PATCH v7 21/28] KVM: arm64: Handle SPE maintenance interrupts
Date: Thu, 5 Nov 2026 16:05:13 +0000 [thread overview]
Message-ID: <auydDmyrP_3oY6MY@gremlin> (raw)
In-Reply-To: <20260903160623.315525-22-alexandru.elisei@arm.com>
On Thu, Sep 03, 2026 at 05:06:16PM +0100, Alexandru Elisei wrote:
> Inject the maintenance interrupt when the guest writes 1 to PMBSR_EL1.S,
> and deassert the interrupt when the service bit is cleared.
>
> Re-inject all maintenance interrupts raised by the SPE hardware while
> the guest was running.
I think this should talk about why you need to re-inject + how the physical
interrupt is handled, i.e. the guest experiences an IRQ exit -> host PMBSR_EL1
is restored (S cleared) -> host driver never sees it. So it needs to be
re-injected.
This seems key to the patch.
>
> Save the value of the hardware PMBSR_EL1 register in a separate
> variable, instead of updating the VCPU sysreg directly. That's to allow
> kvm_spe_sync_hwstate() to discern when the service bit was set by the
> hardware, and not by the guest.
>
> Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
> ---
> arch/arm64/include/asm/kvm_spe.h | 13 ++++++++++
> arch/arm64/kvm/arm.c | 2 ++
> arch/arm64/kvm/hyp/vhe/spe-sr.c | 4 +--
> arch/arm64/kvm/spe.c | 43 ++++++++++++++++++++++++++++++++
> arch/arm64/kvm/sys_regs.c | 7 +++++-
> 5 files changed, 66 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm64/include/asm/kvm_spe.h b/arch/arm64/include/asm/kvm_spe.h
> index 8a55ea0de4e5..385b1157e578 100644
> --- a/arch/arm64/include/asm/kvm_spe.h
> +++ b/arch/arm64/include/asm/kvm_spe.h
> @@ -19,8 +19,10 @@ struct kvm_spe {
> };
>
> struct kvm_vcpu_spe {
> + u64 hw_pmbsr_el1; /* Updated on hardware management event */
Not sure we need this.
In __kvm_spe_save_guest_state_vhe() You assign it like:
vcpu->arch.vcpu_spe.hw_pmbsr_el1 = read_sysreg_s(SYS_PMBSR_EL1);
And keep it separate, but then later reassign the HW register not from
hw_pmbsr_el1 but directly from the register:
ctxt_sys_reg(guest_ctxt, PMBPTR_EL1) = read_sysreg_s(SYS_PMBPTR_EL1);
So does it have to be kept aside at all?
__kvm_spe_profiling_buffer_enabled() asserts !PMBSR_EL1.S on guest entry. So it
is set on exit, a buffer management event occurred.
That'd let you simplify things significantly (also including dropping of
irq_level field, discussed below):
--- a/arch/arm64/include/asm/kvm_spe.h
+++ b/arch/arm64/include/asm/kvm_spe.h
@@ struct kvm_vcpu_spe {
- u64 hw_pmbsr_el1; /* Updated on hardware management event */
int irq_num; /* Buffer management interrupt number */
bool initialized; /* SPE initialized for the VCPU */
- bool irq_level; /* Virtual buffer management interrupt level */
};
--- a/arch/arm64/kvm/hyp/vhe/spe-sr.c
+++ b/arch/arm64/kvm/hyp/vhe/spe-sr.c
@@ void __kvm_spe_save_guest_state_vhe(struct kvm_vcpu *vcpu, struct kvm_cpu_context *guest_ctxt)
/* Advance PMBPTR_EL1 and PMBSR_EL1. */
isb();
- vcpu->arch.vcpu_spe.hw_pmbsr_el1 = read_sysreg_s(SYS_PMBSR_EL1);
+ ctxt_sys_reg(guest_ctxt, PMBSR_EL1) = read_sysreg_s(SYS_PMBSR_EL1);
ctxt_sys_reg(guest_ctxt, PMBPTR_EL1) = read_sysreg_s(SYS_PMBPTR_EL1);
--- a/arch/arm64/kvm/spe.c
+++ b/arch/arm64/kvm/spe.c
@@ static void kvm_spe_update_irq_level(struct kvm_vcpu *vcpu, bool level)
{
struct kvm_vcpu_spe *vcpu_spe = &vcpu->arch.vcpu_spe;
- int ret;
-
- if (vcpu_spe->irq_level == level)
- return;
- ret = kvm_vgic_inject_irq(vcpu->kvm, vcpu, vcpu_spe->irq_num, level, vcpu_spe);
- if (!WARN_ON_ONCE(ret))
- vcpu_spe->irq_level = level;
+ WARN_ON_ONCE(kvm_vgic_inject_irq(vcpu->kvm, vcpu, vcpu_spe->irq_num,
+ level, vcpu_spe));
}
void kvm_spe_sync_hwstate(struct kvm_vcpu *vcpu)
{
- struct kvm_vcpu_spe *vcpu_spe = &vcpu->arch.vcpu_spe;
+ u64 pmbsr;
if (!vcpu_has_spe(vcpu))
return;
- if (!FIELD_GET(PMBSR_EL1_S, vcpu_spe->hw_pmbsr_el1))
- return;
-
- __vcpu_assign_sys_reg(vcpu, PMBSR_EL1, vcpu_spe->hw_pmbsr_el1);
- vcpu_spe->hw_pmbsr_el1 = 0;
- kvm_spe_update_irq_level(vcpu, true);
+ pmbsr = __vcpu_sys_reg(vcpu, PMBSR_EL1);
+ kvm_spe_update_irq_level(vcpu, FIELD_GET(PMBSR_EL1_S, pmbsr));
}
> int irq_num; /* Buffer management interrupt number */
> bool initialized; /* SPE initialized for the VCPU */
> + bool irq_level; /* Virtual buffer management interrupt level */
See comment below, I also think we don't need to add this.
> };
>
> bool kvm_supports_spe(void);
> @@ -43,11 +45,15 @@ int kvm_spe_has_attr(struct kvm_vcpu *vcpu, struct kvm_device_attr *attr);
> bool kvm_spe_pmu_set(struct kvm *kvm);
> u8 kvm_spe_get_pmsver(struct kvm *kvm);
>
> +u64 kvm_spe_reset_sysreg(struct kvm_vcpu *vcpu, int reg);
> +
> bool kvm_spe_write_sysreg(struct kvm_vcpu *vcpu, int reg, u64 val);
> u64 kvm_spe_read_sysreg(struct kvm_vcpu *vcpu, int reg);
>
> bool kvm_spe_has_feat_spe_fne(struct kvm *kvm);
> bool kvm_spe_has_feat_spe_fds(struct kvm *kvm);
> +
> +void kvm_spe_sync_hwstate(struct kvm_vcpu *vcpu);
> #else
> struct kvm_spe {
> };
> @@ -99,6 +105,10 @@ static inline u8 kvm_spe_get_pmsver(struct kvm *kvm)
> {
> return 0;
> }
> +static inline u64 kvm_spe_reset_sysreg(struct kvm_vcpu *vcpu, int reg)
> +{
> + return 0;
> +}
> static inline bool kvm_spe_write_sysreg(struct kvm_vcpu *vcpu, int reg, u64 val)
> {
> return true;
> @@ -115,6 +125,9 @@ static inline bool kvm_spe_has_feat_spe_fds(struct kvm *kvm)
> {
> return false;
> }
> +static inline void kvm_spe_sync_hwstate(struct kvm_vcpu *vcpu)
> +{
> +}
> #endif /* CONFIG_KVM_ARM_SPE */
>
> #endif /* __ARM64_KVM_SPE_H__ */
> diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
> index 5992efc4f94b..689fa175f5f4 100644
> --- a/arch/arm64/kvm/arm.c
> +++ b/arch/arm64/kvm/arm.c
> @@ -1421,6 +1421,8 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu)
> if (kvm_vcpu_has_pmu(vcpu))
> kvm_pmu_sync_hwstate(vcpu);
>
> + kvm_spe_sync_hwstate(vcpu);
In the PMU case above, kvm_vcpu_has_pmu() is checked here, but
kvm_spe_sync_hwstate() does its vcpu_has_spe() in the function. I think, for
consistency, this should check here instead.
> + if (!))
> + return;
> +
> /*
> * Sync the vgic state before syncing the timer state because
> * the timer code needs to know if the virtual timer
> diff --git a/arch/arm64/kvm/hyp/vhe/spe-sr.c b/arch/arm64/kvm/hyp/vhe/spe-sr.c
> index 3c32a1338cc8..df35025db19a 100644
> --- a/arch/arm64/kvm/hyp/vhe/spe-sr.c
> +++ b/arch/arm64/kvm/hyp/vhe/spe-sr.c
> @@ -154,10 +154,10 @@ void __kvm_spe_save_guest_state_vhe(struct kvm_vcpu *vcpu, struct kvm_cpu_contex
> psb_csync();
> dsb(nsh);
> write_sysreg_s(0, SYS_PMBLIMITR_EL1);
> - /* Advance PMBPTR_EL1. */
> + /* Advance PMBPTR_EL1 and PMBSR_EL1. */
> isb();
>
> - /* Hardware updates to PMBSR_EL1 are not handled, yet. */
> + vcpu->arch.vcpu_spe.hw_pmbsr_el1 = read_sysreg_s(SYS_PMBSR_EL1);
On this one, agree with your response to sashiko re: PMBSR_EL1 write order
__kvm_spe_restore_guest_state_vhe(), nothing to fix here.
> ctxt_sys_reg(guest_ctxt, PMBPTR_EL1) = read_sysreg_s(SYS_PMBPTR_EL1);
> }
>
> diff --git a/arch/arm64/kvm/spe.c b/arch/arm64/kvm/spe.c
> index 68b751bdb384..89ebeef1c223 100644
> --- a/arch/arm64/kvm/spe.c
> +++ b/arch/arm64/kvm/spe.c
> @@ -21,6 +21,8 @@ struct spe_pmu_entry {
> struct arm_spe_pmu *spe_pmu;
> };
>
> +static void kvm_spe_update_irq_level(struct kvm_vcpu *vcpu, bool level);
> +
> void kvm_spe_add_instance(struct arm_spe_pmu *spe_pmu)
> {
> struct spe_pmu_entry *entry;
> @@ -152,6 +154,14 @@ bool kvm_spe_has_feat_spe_fne(struct kvm *kvm)
> FIELD_GET(PMSIDR_EL1_FnE, spe_pmu->pmsidr_el1);
> }
>
> +u64 kvm_spe_reset_sysreg(struct kvm_vcpu *vcpu, int reg)
> +{
> + if (reg == PMBSR_EL1 && kvm_vcpu_spe_initialized(vcpu))
> + kvm_spe_update_irq_level(vcpu, false);
> +
> + return 0;
> +}
(I know you are going to fix on respin, just to note :) as per sashiko - other
reset callbacks assign, so registers keep their old values across a reset.
> +
> bool kvm_spe_write_sysreg(struct kvm_vcpu *vcpu, int reg, u64 val)
> {
> struct kvm_spe *kvm_spe = &vcpu->kvm->arch.kvm_spe;
> @@ -168,6 +178,11 @@ bool kvm_spe_write_sysreg(struct kvm_vcpu *vcpu, int reg, u64 val)
> WARN_ON_ONCE("unexpected trap");
> }
>
> + if (reg == PMBSR_EL1) {
> + val = __vcpu_sys_reg(vcpu, PMBSR_EL1);
Why are you re-reading this? As you simply assign in the switch above via
__vcpu_assign_sys_reg() so it should be the same value?
> + kvm_spe_update_irq_level(vcpu, FIELD_GET(PMBSR_EL1_S, val));
> + }
> +
Assuming the -EBUSY check is removed from set_user_spe_sysreg() (as discussed in
review of patch 17), userspace can get here with a KVM_SET_ONE_REG.
This allows a WARN_ON_ONCE() to be trivially triggered from userspace in the
switch statement above:
switch (reg) {
...
default:
WARN_ON_ONCE("unexpected trap");
}
But now also trigger kvm_spe_update_irq_level() arbitrarily before the vGIC is
initialised.
I think we should leave the IRQ bit to first-run and let this just be a raw
register write.
Maybe something like the below?
--- a/arch/arm64/kvm/spe.c
+++ b/arch/arm64/kvm/spe.c
@@ bool kvm_spe_write_sysreg(struct kvm_vcpu *vcpu, int reg, u64 val)
default:
WARN_ON_ONCE("unexpected trap");
}
- if (reg == PMBSR_EL1) {
- val = __vcpu_sys_reg(vcpu, PMBSR_EL1);
- kvm_spe_update_irq_level(vcpu, FIELD_GET(PMBSR_EL1_S, val));
- }
-
return true;
}
+/* Guest-trap only: the vGIC is necessarily initialised at this point. */
+bool kvm_spe_handle_sysreg_write(struct kvm_vcpu *vcpu, int reg, u64 val)
+{
+ kvm_spe_write_sysreg(vcpu, reg, val);
+
+ if (reg == PMBSR_EL1)
+ kvm_spe_update_irq_level(vcpu, FIELD_GET(PMBSR_EL1_S, val));
+
+ return true;
+}
+
@@ int kvm_spe_vcpu_first_run_init(struct kvm_vcpu *vcpu)
if (!kvm_spe->pmblimitr_el1_res0_mask)
kvm_spe_compute_pmblimitr_el1_res0_mask(kvm);
+ /* Pick up anything userspace wrote via KVM_SET_ONE_REG. */
+ kvm_spe_update_irq_level(vcpu,
+ FIELD_GET(PMBSR_EL1_S, __vcpu_sys_reg(vcpu, PMBSR_EL1)));
+
if (kvm_vm_has_ran_once(kvm))
return 0;
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ static bool access_spe_reg(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
if (p->is_write)
- return kvm_spe_write_sysreg(vcpu, reg, val);
+ return kvm_spe_handle_sysreg_write(vcpu, reg, val);
> return true;
> }
>
> @@ -184,6 +199,34 @@ u64 kvm_spe_read_sysreg(struct kvm_vcpu *vcpu, int reg)
> }
> }
>
> +static void kvm_spe_update_irq_level(struct kvm_vcpu *vcpu, bool level)
> +{
> + struct kvm_vcpu_spe *vcpu_spe = &vcpu->arch.vcpu_spe;
> + int ret;
> +
> + if (vcpu_spe->irq_level == level)
> + return;
This seems redundant, as vgic_validate_injection() called by
kvm_vgic_inject_irq() checks for this already:
static bool vgic_validate_injection(struct vgic_irq *irq, bool level, void *owner)
{
...
switch (irq->config) {
case VGIC_CONFIG_LEVEL:
return irq->line_level != level;
...
}
...
}
> +
> + ret = kvm_vgic_inject_irq(vcpu->kvm, vcpu, vcpu_spe->irq_num, level, vcpu_spe);
> + if (!WARN_ON_ONCE(ret))
> + vcpu_spe->irq_level = level;
> +}
> +
> +void kvm_spe_sync_hwstate(struct kvm_vcpu *vcpu)
> +{
> + struct kvm_vcpu_spe *vcpu_spe = &vcpu->arch.vcpu_spe;
> +
> + if (!vcpu_has_spe(vcpu))
> + return;
As above, should put this outside the function. It's also weird to see this
check here (you'd hope that you'd know it was SPE if calling this function :)
> +
> + if (!FIELD_GET(PMBSR_EL1_S, vcpu_spe->hw_pmbsr_el1))
> + return;
> +
> + __vcpu_assign_sys_reg(vcpu, PMBSR_EL1, vcpu_spe->hw_pmbsr_el1);
> + vcpu_spe->hw_pmbsr_el1 = 0;
> + kvm_spe_update_irq_level(vcpu, true);
> +}
> +
> bool kvm_spe_pmu_set(struct kvm *kvm)
> {
> return !!kvm->arch.kvm_spe.spe_pmu;
> diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> index 4c4bf88c9aa5..ebe1c933f8d5 100644
> --- a/arch/arm64/kvm/sys_regs.c
> +++ b/arch/arm64/kvm/sys_regs.c
> @@ -1595,6 +1595,11 @@ static int get_user_spe_sysreg(struct kvm_vcpu *vcpu, const struct sys_reg_desc
> return 0;
> }
>
> +static u64 reset_spe_sysreg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *r)
> +{
> + return kvm_spe_reset_sysreg(vcpu, r->reg);
> +}
> +
> static bool access_spe_reg(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
> const struct sys_reg_desc *r)
> {
> @@ -1642,7 +1647,7 @@ static bool access_spe_reg(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
>
> #define SPE_SYS_REG(name) \
> SYS_DESC(SYS_##name), .reg = name, .access = access_spe_reg, \
> - .reset = reset_val, .val = 0, .visibility = spe_visibility, \
> + .reset = reset_spe_sysreg, .visibility = spe_visibility, \
> .set_user = set_user_spe_sysreg, .get_user = get_user_spe_sysreg
>
> #define SPE_UNTRAPPED_REG(name) \
> --
> 2.43.0
>
>
--
Cheers, Lorenzo
next prev parent reply other threads:[~2026-11-05 16:05 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 16:05 [RFC PATCH v7 00/28] KVM: arm64: Add Statistical Profiling Extension (SPE) support Alexandru Elisei
2026-09-03 16:05 ` [RFC PATCH v7 01/28] arm64/sysreg: Add the nVM field to PMBLIMITR_EL1 Alexandru Elisei
2026-10-15 13:23 ` Lorenzo Stoakes (ARM)
2026-09-03 16:05 ` [RFC PATCH v7 02/28] arm64/sysreg: Define MDCR_EL2.E2PB values Alexandru Elisei
2026-10-15 13:52 ` Lorenzo Stoakes (ARM)
2026-09-03 16:05 ` [RFC PATCH v7 03/28] KVM: arm64: Add CONFIG_KVM_ARM_SPE Kconfig option Alexandru Elisei
2026-10-15 14:15 ` Lorenzo Stoakes (ARM)
2026-09-03 16:05 ` [RFC PATCH v7 04/28] perf: arm_spe_pmu: Move struct arm_spe_pmu to a separate header file Alexandru Elisei
2026-10-15 14:40 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 05/28] perf: arm_spe_pmu: Add PMBIDR_EL1 and PMSIDR_EL1 to struct arm_spe_pmu Alexandru Elisei
2026-10-15 15:12 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 06/28] KVM: arm64: Add KVM_CAP_ARM_SPE capability Alexandru Elisei
2026-10-15 16:51 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 07/28] KVM: arm64: Add KVM_ARM_VCPU_SPE VCPU feature Alexandru Elisei
2026-10-16 14:23 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 08/28] HACK! KVM: arm64: Disable SPE virtualization if protected KVM is enabled Alexandru Elisei
2026-10-16 14:30 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 09/28] HACK! KVM: arm64: Enable SPE virtualization only in VHE mode Alexandru Elisei
2026-09-03 16:06 ` [RFC PATCH v7 10/28] HACK! KVM: arm64: Disable SPE virtualization if nested virt is enabled Alexandru Elisei
2026-09-03 16:06 ` [RFC PATCH v7 11/28] KVM: arm64: Add a new VCPU device control group for SPE Alexandru Elisei
2026-10-16 14:44 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 12/28] KVM: arm64: Add SPE VCPU device attribute to set the interrupt number Alexandru Elisei
2026-10-20 17:20 ` Lorenzo Stoakes (ARM)
2026-10-28 16:52 ` Suzuki K Poulose
2026-09-03 16:06 ` [RFC PATCH v7 13/28] KVM: arm64: Add SPE VCPU device attribute to set the SPE device Alexandru Elisei
2026-10-28 13:11 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 14/28] KVM: arm64: Add SPE VCPU device attribute to initialize SPE Alexandru Elisei
2026-10-28 13:45 ` Lorenzo Stoakes (ARM)
2026-10-29 18:03 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 15/28] KVM: arm64: Use PMSVer from the assigned SPE instance Alexandru Elisei
2026-10-28 16:41 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 16/28] KVM: arm64: Add SPE system registers to VCPU context Alexandru Elisei
2026-10-29 15:42 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 17/28] KVM: arm64: Apply a RES0 mask to PMBLIMITR_EL1 writes Alexandru Elisei
2026-10-29 17:23 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 18/28] KVM: arm64: config: Use functions from spe.c to test FEAT_SPE_{FnE,FDS} Alexandru Elisei
2026-10-29 17:47 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 19/28] KVM: arm64: VHE: Context switch SPE state Alexandru Elisei
2026-11-03 16:00 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 20/28] KVM: arm64: Allow guest SPE physical timestamps only if kernel allows it Alexandru Elisei
2026-11-03 17:04 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 21/28] KVM: arm64: Handle SPE maintenance interrupts Alexandru Elisei
2026-11-05 16:05 ` Lorenzo Stoakes (ARM) [this message]
2026-09-03 16:06 ` [RFC PATCH v7 22/28] arm64: errata: Disable SPE in KVM Alexandru Elisei
2026-11-03 20:12 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 23/28] KVM: arm64: Add kvm-arm.ignore_spe_errata kernel parameter Alexandru Elisei
2026-11-03 19:37 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 24/28] arm64: errata: Don't enable guest buffer if misprogrammed Alexandru Elisei
2026-11-05 16:51 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 25/28] KVM: arm64: at: Use callback for reading descriptor Alexandru Elisei
2026-11-03 19:55 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 26/28] KVM: arm64: Map memory on a SPE stage 2 fault Alexandru Elisei
2026-11-05 17:10 ` Lorenzo Stoakes (ARM)
2026-09-03 16:06 ` [RFC PATCH v7 27/28] KVM: arm64: Handle dirty page logging when SPE feature is set Alexandru Elisei
2026-09-03 16:06 ` [RFC PATCH v7 28/28] KVM: arm64: Allow the creation of a SPE enabled VM Alexandru Elisei
2026-11-03 19:49 ` Lorenzo Stoakes (ARM)
2026-10-15 10:25 ` [RFC PATCH v7 00/28] KVM: arm64: Add Statistical Profiling Extension (SPE) support Alexandru Elisei
2026-10-15 12:50 ` Lorenzo Stoakes (ARM)
2026-10-15 13:22 ` Alexandru Elisei
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=auydDmyrP_3oY6MY@gremlin \
--to=ljs@kernel.org \
--cc=alexandru.elisei@arm.com \
--cc=catalin.marinas@arm.com \
--cc=fuad.tabba@linux.dev \
--cc=james.clark@linaro.org \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=maz@kernel.org \
--cc=oupton@kernel.org \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox