Re: [PATCH 2/2] LoongArch: KVM: Do not restart SW timer when it is expired

From: Huacai Chen
Date: Mon Feb 26 2024 - 08:00:38 EST


The code itself looks good to me, but could you please tell me what
does "LoongArch guest has separate hw timer" mean?

Huacai

On Tue, Jan 30, 2024 at 3:22 PM Bibo Mao <maobibo@xxxxxxxxxxx> wrote:
>
> LoongArch guest has separate hw timer, SW timer is to wake up
> blocked vcpu thread, rather than HW timer emulation. When blocking
> vcpu schedules out, SW timer is used to wakeup blocked vcpu thread
> and injects timer interrupt. It does not care about whether guest
> timer is in period mode or oneshot mode, and SW timer needs not be
> restarted since vcpu has been woken.
>
> This patch does not restart sw timer when it is expired.
>
> Signed-off-by: Bibo Mao <maobibo@xxxxxxxxxxx>
> ---
> arch/loongarch/kvm/timer.c | 20 +-------------------
> 1 file changed, 1 insertion(+), 19 deletions(-)
>
> diff --git a/arch/loongarch/kvm/timer.c b/arch/loongarch/kvm/timer.c
> index a9125f0a12d1..d3282f01d4d9 100644
> --- a/arch/loongarch/kvm/timer.c
> +++ b/arch/loongarch/kvm/timer.c
> @@ -23,24 +23,6 @@ static inline u64 tick_to_ns(struct kvm_vcpu *vcpu, u64 tick)
> return div_u64(tick * MNSEC_PER_SEC, vcpu->arch.timer_mhz);
> }
>
> -/*
> - * Push timer forward on timeout.
> - * Handle an hrtimer event by push the hrtimer forward a period.
> - */
> -static enum hrtimer_restart kvm_count_timeout(struct kvm_vcpu *vcpu)
> -{
> - unsigned long cfg, period;
> -
> - /* Add periodic tick to current expire time */
> - cfg = kvm_read_sw_gcsr(vcpu->arch.csr, LOONGARCH_CSR_TCFG);
> - if (cfg & CSR_TCFG_PERIOD) {
> - period = tick_to_ns(vcpu, cfg & CSR_TCFG_VAL);
> - hrtimer_add_expires_ns(&vcpu->arch.swtimer, period);
> - return HRTIMER_RESTART;
> - } else
> - return HRTIMER_NORESTART;
> -}
> -
> /* Low level hrtimer wake routine */
> enum hrtimer_restart kvm_swtimer_wakeup(struct hrtimer *timer)
> {
> @@ -50,7 +32,7 @@ enum hrtimer_restart kvm_swtimer_wakeup(struct hrtimer *timer)
> kvm_queue_irq(vcpu, INT_TI);
> rcuwait_wake_up(&vcpu->wait);
>
> - return kvm_count_timeout(vcpu);
> + return HRTIMER_NORESTART;
> }
>
> /*
> --
> 2.39.3
>