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

Message ID 20240130072238.2829831-3-maobibo@loongson.cn
State New
Headers
Series LoongArch: KVM: Start SW timer only when vcpu is blocking |

Commit Message

maobibo Jan. 30, 2024, 7:22 a.m. UTC
  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@loongson.cn>
---
 arch/loongarch/kvm/timer.c | 20 +-------------------
 1 file changed, 1 insertion(+), 19 deletions(-)
  

Comments

Huacai Chen Feb. 26, 2024, 12:59 p.m. UTC | #1
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@loongson.cn> 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@loongson.cn>
> ---
>  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
>
  

Patch

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;
 }
 
 /*