Re: [PATCH] LoongArch: KVM: Reload guest CSR registers after S4

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, Bibo,

On Mon, Mar 3, 2025 at 5:11 PM Bibo Mao <maobibo@xxxxxxxxxxx> wrote:
>
> On host HW guest CSR registers are lost after suspend and resume
> operation. Since last_vcpu of boot CPU still records latest vCPU pointer
> so that guest CSR register skips to reload when boot CPU resumes and
> vCPU is scheduled.
>
> Here last_vcpu is cleared so that guest CSR register will reload from
> scheduled vCPU context after suspend and resume.
>
> Also there is another small fix for Loongson AVEC support, bit 14 is added
> in CSR ESTAT register. Macro CSR_ESTAT_IS is replaced with hardcoded value
> 0x1fff and AVEC interrupt status bit 14 is supported with macro
> CSR_ESTAT_IS.
>
> Signed-off-by: Bibo Mao <maobibo@xxxxxxxxxxx>
> ---
>  arch/loongarch/kvm/main.c | 8 ++++++++
>  arch/loongarch/kvm/vcpu.c | 2 +-
>  2 files changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/arch/loongarch/kvm/main.c b/arch/loongarch/kvm/main.c
> index f6d3242b9234..b177773f38f6 100644
> --- a/arch/loongarch/kvm/main.c
> +++ b/arch/loongarch/kvm/main.c
> @@ -284,6 +284,7 @@ long kvm_arch_dev_ioctl(struct file *filp,
>  int kvm_arch_enable_virtualization_cpu(void)
>  {
>         unsigned long env, gcfg = 0;
> +       struct kvm_context *context;
>
>         env = read_csr_gcfg();
>
> @@ -317,6 +318,13 @@ int kvm_arch_enable_virtualization_cpu(void)
>         kvm_debug("GCFG:%lx GSTAT:%lx GINTC:%lx GTLBC:%lx",
>                   read_csr_gcfg(), read_csr_gstat(), read_csr_gintc(), read_csr_gtlbc());
>
> +       /*
> +        * HW Guest CSR registers are lost after CPU suspend and resume
> +        * Clear last_vcpu so that Guest CSR register forced to reload
> +        * from vCPU SW state
> +        */
> +       context = this_cpu_ptr(vmcs);
> +       context->last_vcpu = NULL;
This can be simplified as this_cpu_ptr(vmcs)->last_vcpu = NULL;

>         return 0;
>  }
>
> diff --git a/arch/loongarch/kvm/vcpu.c b/arch/loongarch/kvm/vcpu.c
> index 20f941af3e9e..9e1a9b4aa4c6 100644
> --- a/arch/loongarch/kvm/vcpu.c
> +++ b/arch/loongarch/kvm/vcpu.c
> @@ -311,7 +311,7 @@ static int kvm_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu)
>  {
>         int ret = RESUME_GUEST;
>         unsigned long estat = vcpu->arch.host_estat;
> -       u32 intr = estat & 0x1fff; /* Ignore NMI */
> +       u32 intr = estat & CSR_ESTAT_IS;
This part has nothing to do with S4, please split to another patch.

Huacai

>         u32 ecode = (estat & CSR_ESTAT_EXC) >> CSR_ESTAT_EXC_SHIFT;
>
>         vcpu->mode = OUTSIDE_GUEST_MODE;
>
> base-commit: 1e15510b71c99c6e49134d756df91069f7d18141
> --
> 2.39.3
>
>





[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux