All of lore.kernel.org
 help / color / mirror / Atom feed
From: Suzuki K Poulose <suzuki.poulose@arm.com>
To: Gavin Shan <gshan@redhat.com>,
	kvm@vger.kernel.org, kvmarm@lists.linux.dev
Cc: maz@kernel.org, will@kernel.org, catalin.marinas@arm.com,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, steven.price@arm.com,
	aneesh.kumar@kernel.org, oupton@kernel.org, joey.gouly@arm.com,
	tabba@google.com, yuzenghui@huawei.com,
	linux-coco@lists.linux.dev, gankulkarni@os.amperecomputing.com,
	sdonthineni@nvidia.com, alpergun@google.com,
	fj0570is@fujitsu.com, WeiLin.Chang@arm.com,
	lpieralisi@kernel.org, enju.kohei@fujitsu.com
Subject: Re: [PATCH v17 05/20] KVM: arm64: Add vcpu load/put call backs for flavors
Date: Thu, 10 Sep 2026 09:40:55 +0100	[thread overview]
Message-ID: <665c6498-f215-4acc-8e2c-6a7064e787fc@arm.com> (raw)
In-Reply-To: <09f1d245-2104-4ca2-93af-a004c44b4161@redhat.com>

Hi Gavin

On 10/09/2026 06:33, Gavin Shan wrote:
> Hi Suzuki,
> 
> On 9/9/26 2:22 AM, Suzuki K Poulose wrote:
>> Add VM flavor specific handlers for VCPU load/put, in an effort to 
>> make it
>> easier to follow the code.
>>
>> Based on a patch by Marc Zyngier
>>
>> Suggested-by: Marc Zyngier <maz@kernel.org>
>> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
>> ---
>>   arch/arm64/include/asm/kvm_host.h |   6 ++
>>   arch/arm64/kvm/arm.c              | 156 ++++++++++++++++++++++--------
>>   2 files changed, 123 insertions(+), 39 deletions(-)
>>
>> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/ 
>> asm/kvm_host.h
>> index d0dccc9ad6aa8..b2e99c5cb1cd3 100644
>> --- a/arch/arm64/include/asm/kvm_host.h
>> +++ b/arch/arm64/include/asm/kvm_host.h
>> @@ -150,6 +150,11 @@ struct kvm_vmid {
>>       atomic64_t id;
>>   };
>> +struct kvm_vcpu_ops {
>> +    void (*vcpu_load)(struct kvm_vcpu *vcpu, int cpu);
>> +    void (*vcpu_put)(struct kvm_vcpu *vcpu);
>> +};
>> +
> 
> struct kvm_vcpu::cpu has been set to 'cpu' before vcpu_load() is called in
> kvm_arch_vcpu_load(), so we needn't explicitly pass @cpu to vcpu_load()?

Ack

> 
>>   struct kvm_s2_mmu {
>>       struct kvm_vmid vmid;
>> @@ -854,6 +859,7 @@ struct vncr_tlb;
>>   struct kvm_vcpu_arch {
>>       struct kvm_cpu_context ctxt;
>> +    const struct kvm_vcpu_ops *vcpu_ops;
> 
> I think this would be a field of 'struct kvm_arch' if all vCPUs inside a VM
> have same vCPU operations.

This was done to avoid the long list of pointer chasing :

vcpu->kvm->arch.vcpu_ops->

Given this is vcpu specific ops and a single pointer per vcpu, we can 
make that easier to read.


> 
>>       /*
>>        * Guest floating point state
>> diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c
>> index 51fc651267157..9af3bbb2f8c24 100644
>> --- a/arch/arm64/kvm/arm.c
>> +++ b/arch/arm64/kvm/arm.c
>> @@ -74,6 +74,8 @@ struct kvm_ioctl_cap_map {
>>       long ext;
>>   };
>> +static const struct kvm_vcpu_ops *arm64_vcpu_ops[VM_FLAVOR_MAX];
>> +
>>   /* Make KVM_CAP_NR_VCPUS the reference for features we always 
>> supported */
>>   #define KVM_CAP_ARM_BASIC    KVM_CAP_NR_VCPUS
>> @@ -569,6 +571,8 @@ int kvm_arch_vcpu_create(struct kvm_vcpu *vcpu)
>>       mutex_unlock(&vcpu->mutex);
>>   #endif
>> +    vcpu->arch.vcpu_ops = arm64_vcpu_ops[vcpu->kvm->arch.vm_flavor];
>> +
>>       /* Force users to call KVM_ARM_VCPU_INIT */
>>       vcpu_clear_flag(vcpu, VCPU_INITIALIZED);
>> @@ -738,36 +742,72 @@ static void vcpu_load_pvtime(struct kvm_vcpu *vcpu)
>>           kvm_make_request(KVM_REQ_RECORD_STEAL, vcpu);
>>   }
>> +static void vhe_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
>> +{
>> +    vcpu_prepare_mmu(vcpu);
>> +    /*
>> +     * The timer must be loaded before the vgic to correctly set up 
>> physical
>> +     * interrupt deactivation in nested state (e.g. timer interrupt).
>> +     */
>> +    kvm_timer_vcpu_load(vcpu);
>> +    kvm_vgic_load(vcpu);
>> +    kvm_vcpu_load_debug(vcpu);
>> +    kvm_vcpu_load_fgt(vcpu);
>> +    kvm_vcpu_load_vhe(vcpu);
>> +    kvm_arch_vcpu_load_fp(vcpu);
>> +    kvm_vcpu_pmu_restore_guest(vcpu);
>> +
>> +    vcpu_load_pvtime(vcpu);
>> +    vcpu_set_wfx_traps(vcpu);
>> +    vcpu_set_pauth_traps(vcpu);
>> +}
>> +
>> +static void nvhe_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
>> +{
>> +    vcpu_prepare_mmu(vcpu);
>> +    /*
>> +     * The timer must be loaded before the vgic to correctly set up 
>> physical
>> +     * interrupt deactivation in nested state (e.g. timer interrupt).
>> +     */
>> +    kvm_timer_vcpu_load(vcpu);
>> +    kvm_vgic_load(vcpu);
>> +    kvm_vcpu_load_debug(vcpu);
>> +    kvm_vcpu_load_fgt(vcpu);
>> +    kvm_arch_vcpu_load_fp(vcpu);
>> +    kvm_vcpu_pmu_restore_guest(vcpu);
>> +
>> +    vcpu_load_pvtime(vcpu);
>> +    vcpu_set_wfx_traps(vcpu);
>> +    vcpu_set_pauth_traps(vcpu);
>> +}
>> +
>> +static void pkvm_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
>> +{
>> +    /*
>> +     * The timer must be loaded before the vgic to correctly set up 
>> physical
>> +     * interrupt deactivation in nested state (e.g. timer interrupt).
>> +     */
>> +    kvm_timer_vcpu_load(vcpu);
>> +    kvm_vgic_load(vcpu);
>> +    kvm_vcpu_load_debug(vcpu);
>> +    kvm_vcpu_load_fgt(vcpu);
>> +    kvm_arch_vcpu_load_fp(vcpu);
>> +    kvm_vcpu_pmu_restore_guest(vcpu);
>> +
>> +    vcpu_load_pvtime(vcpu);
>> +    vcpu_set_wfx_traps(vcpu);
> 
> It seems vcpu_set_pauth_traps(vcpu) has been missed here?

No, if you see the vcpu_set_pauth_traps(), we do nothing for 
is_protected_kvm_enabled(). So skipped that explicitly here.
I didn't remove that condition from vcpu_set_pauth_traps()
just to keep it safer.

> 
>> +
>> +    kvm_call_hyp_nvhe(__pkvm_vcpu_load,
>> +              vcpu->kvm->arch.pkvm.handle,
>> +              vcpu->vcpu_idx, vcpu->arch.hcr_el2);
>> +    kvm_call_hyp(__vgic_v3_restore_vmcr_aprs,
>> +             &vcpu->arch.vgic_cpu.vgic_v3);
>> +}
>> +

...

>> +static const struct kvm_vcpu_ops vhe_vcpu_ops = {
>> +    .vcpu_load = vhe_vcpu_load,
>> +    .vcpu_put = vhe_vcpu_put,
>> +};
>> +
>> +static const struct kvm_vcpu_ops nvhe_vcpu_ops = {
>> +    .vcpu_load = nvhe_vcpu_load,
>> +    .vcpu_put = nvhe_vcpu_put,
>> +};
>> +
>> +static const struct kvm_vcpu_ops pkvm_vcpu_ops = {
>> +    .vcpu_load = pkvm_vcpu_load,
>> +    .vcpu_put = pkvm_vcpu_put,
>> +};
>> +
>> +static const struct kvm_vcpu_ops *arm64_vcpu_ops[] = {
>> +    [VM_VHE] = &vhe_vcpu_ops,
>> +    [VM_NVHE] = &nvhe_vcpu_ops,
>> +    [VM_PKVM] = &pkvm_vcpu_ops,
>> +    [VM_PROTECTED_PKVM] = &pkvm_vcpu_ops,
>> +};
>> +
> 
> We may avoid the variables {vhe, nvhe, pkvm}_vcpu_ops which are used for 
> once:
> 
> static const struct kvm_vcpu_ops kvm_vcpu_ops[] = {
>      [VM_VHE]            = { vhe_vcpu_load,  vhe_vcpu_put  },
>      [VM_NVHE]           = { nvhe_vcpu_load, nvhe_vcpu_put },
>      [VM_PKVM]           = { pkvm_vcpu_load, pkvm_vcpu_put },
>      [VM_PROTECTED_PKVM] = { pkvm_vcpu_load, pkvm_vcpu_put },
> };

The structure might grow in the future (I have a vcpu_run callback in 
testing). So it does make sense to use the variables to keep it tidy.

I will add checks to make sure that the fields are initialised properly.


Cheers
Suzuki

> 
>>   static unsigned long nvhe_percpu_size(void)
>>   {
>>       return (unsigned long)CHOOSE_NVHE_SYM(__per_cpu_end) -
> 
> Thanks,
> Gavin
> 


  reply	other threads:[~2026-09-10  8:41 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-08 16:22 [PATCH v17 00/20] KVM: arm64: CCA: Add basic plumbing for Realms Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 01/20] KVM: arm64: Include kvm_emulate.h in kvm/arm_psci.h Suzuki K Poulose
2026-09-09 11:20   ` Fuad Tabba
2026-09-08 16:22 ` [PATCH v17 02/20] KVM: arm64: Avoid including linux/kvm_host.h in kvm_pgtable.h Suzuki K Poulose
2026-09-09 11:22   ` Fuad Tabba
2026-09-09 11:24     ` Suzuki K Poulose
2026-09-10  3:40   ` Gavin Shan
2026-09-08 16:22 ` [PATCH v17 03/20] KVM: arm64: Track the type of VM in kvm_arch Suzuki K Poulose
2026-09-09 11:28   ` Fuad Tabba
2026-09-09 11:30     ` Suzuki K Poulose
2026-09-10  3:39   ` Gavin Shan
2026-09-10  6:35     ` Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 04/20] KVM: arm64: Refactor the vcpu_load to allow for VM specific callbacks Suzuki K Poulose
2026-09-10  4:00   ` Gavin Shan
2026-09-10 10:21     ` Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 05/20] KVM: arm64: Add vcpu load/put call backs for flavors Suzuki K Poulose
2026-09-10  5:33   ` Gavin Shan
2026-09-10  8:40     ` Suzuki K Poulose [this message]
2026-09-08 16:22 ` [PATCH v17 06/20] KVM: arm64: CCA: Add a new mode for supporting Realm guests Suzuki K Poulose
2026-09-09  3:26   ` Kohei Enju
2026-09-09 10:48     ` Marc Zyngier
2026-09-10  4:49       ` Kohei Enju
2026-09-10  5:53   ` Gavin Shan
2026-09-10  8:43     ` Suzuki K Poulose
2026-09-10  9:40       ` Gavin Shan
2026-09-08 16:22 ` [PATCH v17 07/20] KVM: arm64: CCA: Introduce Realms Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 08/20] KVM: arm64: coco: Add a helper to check if a VM is confidential compute guest Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 09/20] KVM: arm64: coco: arch_timer: Prevent timer offset configuration Suzuki K Poulose
2026-09-08 16:46   ` sashiko-bot
2026-09-10 12:19     ` Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 10/20] KVM: arm64: coco: Disable Steal time accounting for coco guests Suzuki K Poulose
2026-09-09 11:45   ` Fuad Tabba
2026-09-09 11:52     ` Suzuki K Poulose
2026-09-09 12:23       ` Fuad Tabba
2026-09-10 10:27         ` Suzuki K Poulose
2026-09-10 12:42           ` Fuad Tabba
2026-09-10 12:44             ` Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 11/20] KVM: arm64: coco: Don't handle MMIO with no ISV Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 12/20] KVM: arm64: CCA: Support timers in realm RECs Suzuki K Poulose
2026-09-08 16:56   ` sashiko-bot
2026-09-08 18:58     ` Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 13/20] KVM: arm64: CCA: Add VCPU load/put for Realms Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 14/20] KVM: arm64: CCA: Don't expose unsupported capabilities for realm guests Suzuki K Poulose
2026-09-08 16:52   ` sashiko-bot
2026-09-10 12:18     ` Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 15/20] KVM: arm64: CCA: WARN on injected undef exceptions Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 16/20] KVM: arm64: CCA: Provide register list for unfinalized RECs Suzuki K Poulose
2026-09-08 16:57   ` sashiko-bot
2026-09-10 12:15     ` Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 17/20] KVM: arm64: CCA: Provide an accurate register list Suzuki K Poulose
2026-09-08 17:00   ` sashiko-bot
2026-09-10 12:17     ` Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 18/20] KVM: arm64: Reuse kvm_stage2_unmap_range in kvm_unmap_gfn_range Suzuki K Poulose
2026-09-09 11:50   ` Fuad Tabba
2026-09-08 16:22 ` [PATCH v17 19/20] KVM: arm64: Add VM specific callback for S2 MMU operations Suzuki K Poulose
2026-09-08 16:59   ` sashiko-bot
2026-09-08 18:59     ` Suzuki K Poulose
2026-09-08 16:22 ` [PATCH v17 20/20] KVM: arm64: Abstract out memory abort handling Suzuki K Poulose
2026-09-09 13:18 ` [PATCH v17 00/20] KVM: arm64: CCA: Add basic plumbing for Realms Fuad Tabba
2026-09-09 13:52   ` Suzuki K Poulose

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=665c6498-f215-4acc-8e2c-6a7064e787fc@arm.com \
    --to=suzuki.poulose@arm.com \
    --cc=WeiLin.Chang@arm.com \
    --cc=alpergun@google.com \
    --cc=aneesh.kumar@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=enju.kohei@fujitsu.com \
    --cc=fj0570is@fujitsu.com \
    --cc=gankulkarni@os.amperecomputing.com \
    --cc=gshan@redhat.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=lpieralisi@kernel.org \
    --cc=maz@kernel.org \
    --cc=oupton@kernel.org \
    --cc=sdonthineni@nvidia.com \
    --cc=steven.price@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 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.