Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1571839

[RFC v3 08/10] KVM: arm/arm64: Set up a background timer for the physical timer emulation

From Jintack Lim <jintack@cs.columbia.edu>
Newsgroups linux.kernel
Subject [RFC v3 08/10] KVM: arm/arm64: Set up a background timer for the physical timer emulation
Date 2017-02-01 18:50 +0100
Message-ID <t67cB-tm-13@gated-at.bofh.it> (permalink)
References <t67cB-tm-3@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Set a background timer for the EL1 physical timer emulation while VMs
are running, so that VMs get the physical timer interrupts in a timely
manner.

Schedule the background timer on entry to the VM and cancel it on exit.
This would not have any performance impact to the guest OSes that
currently use the virtual timer since the physical timer is always not
enabled.

Signed-off-by: Jintack Lim <jintack@cs.columbia.edu>
---
 virt/kvm/arm/arch_timer.c | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c
index 89bdb79..1806e5e 100644
--- a/virt/kvm/arm/arch_timer.c
+++ b/virt/kvm/arm/arch_timer.c
@@ -229,6 +229,22 @@ static int kvm_timer_update_state(struct kvm_vcpu *vcpu)
 	return 0;
 }
 
+/* Schedule the background timer for the emulated timer. */
+static void kvm_timer_emulate(struct kvm_vcpu *vcpu,
+			      struct arch_timer_context *timer_ctx)
+{
+	struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu;
+
+	if (kvm_timer_should_fire(timer_ctx))
+		return;
+
+	if (!kvm_timer_irq_can_fire(timer_ctx))
+		return;
+
+	/*  The timer has not yet expired, schedule a background timer */
+	timer_arm(timer, kvm_timer_compute_delta(timer_ctx));
+}
+
 /*
  * Schedule the background timer before calling kvm_vcpu_block, so that this
  * thread is removed from its waitqueue and made runnable when there's a timer
@@ -286,6 +302,9 @@ void kvm_timer_flush_hwstate(struct kvm_vcpu *vcpu)
 	if (kvm_timer_update_state(vcpu))
 		return;
 
+	/* Set the background timer for the physical timer emulation. */
+	kvm_timer_emulate(vcpu, vcpu_ptimer(vcpu));
+
 	/*
 	* If we enter the guest with the virtual input level to the VGIC
 	* asserted, then we have already told the VGIC what we need to, and
@@ -348,7 +367,11 @@ void kvm_timer_sync_hwstate(struct kvm_vcpu *vcpu)
 {
 	struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu;
 
-	BUG_ON(timer_is_armed(timer));
+	/*
+	 * This is to cancel the background timer for the physical timer
+	 * emulation if it is set.
+	 */
+	timer_disarm(timer);
 
 	/*
 	 * The guest could have modified the timer registers or the timer
-- 
1.9.1

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[RFC v3 00/10] Provide the EL1 physical timer to the VM Jintack Lim <jintack@cs.columbia.edu> - 2017-02-01 18:50 +0100
  [RFC v3 04/10] KVM: arm/arm64: Add the EL1 physical timer context Jintack Lim <jintack@cs.columbia.edu> - 2017-02-01 18:50 +0100
    Re: [RFC v3 04/10] KVM: arm/arm64: Add the EL1 physical timer context Christoffer Dall <cdall@linaro.org> - 2017-02-02 11:20 +0100
  [RFC v3 08/10] KVM: arm/arm64: Set up a background timer for the physical timer emulation Jintack Lim <jintack@cs.columbia.edu> - 2017-02-01 18:50 +0100
    Re: [RFC v3 08/10] KVM: arm/arm64: Set up a background timer for the  physical timer emulation Christoffer Dall <cdall@linaro.org> - 2017-02-02 11:40 +0100
  [RFC v3 07/10] KVM: arm/arm64: Set a background timer to the earliest timer expiration Jintack Lim <jintack@cs.columbia.edu> - 2017-02-01 18:50 +0100
    Re: [RFC v3 07/10] KVM: arm/arm64: Set a background timer to the  earliest timer expiration Christoffer Dall <cdall@linaro.org> - 2017-02-02 11:40 +0100
  [RFC v3 03/10] KVM: arm/arm64: Decouple kvm timer functions from virtual timer Jintack Lim <jintack@cs.columbia.edu> - 2017-02-01 18:50 +0100
    Re: [RFC v3 03/10] KVM: arm/arm64: Decouple kvm timer functions from  virtual timer Christoffer Dall <cdall@linaro.org> - 2017-02-02 11:10 +0100
  [RFC v3 02/10] KVM: arm/arm64: Move cntvoff to each timer context Jintack Lim <jintack@cs.columbia.edu> - 2017-02-01 18:50 +0100
    Re: [RFC v3 02/10] KVM: arm/arm64: Move cntvoff to each timer context Christoffer Dall <cdall@linaro.org> - 2017-02-02 11:10 +0100
  [RFC v3 01/10] KVM: arm/arm64: Abstract virtual timer context into separate structure Jintack Lim <jintack@cs.columbia.edu> - 2017-02-01 18:50 +0100
  [RFC v3 06/10] KVM: arm/arm64: Update the physical timer interrupt level Jintack Lim <jintack@cs.columbia.edu> - 2017-02-01 18:50 +0100
    Re: [RFC v3 06/10] KVM: arm/arm64: Update the physical timer  interrupt level Christoffer Dall <cdall@linaro.org> - 2017-02-02 11:20 +0100
  Re: [RFC v3 00/10] Provide the EL1 physical timer to the VM Christoffer Dall <cdall@linaro.org> - 2017-02-02 13:40 +0100
    Re: [RFC v3 00/10] Provide the EL1 physical timer to the VM Jintack Lim <jintack@cs.columbia.edu> - 2017-02-02 16:00 +0100
      Re: [RFC v3 00/10] Provide the EL1 physical timer to the VM Christoffer Dall <cdall@linaro.org> - 2017-02-02 16:10 +0100
      Re: [RFC v3 00/10] Provide the EL1 physical timer to the VM Christoffer Dall <cdall@linaro.org> - 2017-02-03 13:40 +0100
        Re: [RFC v3 00/10] Provide the EL1 physical timer to the VM Jintack Lim <jintack@cs.columbia.edu> - 2017-02-03 14:20 +0100
          Re: [RFC v3 00/10] Provide the EL1 physical timer to the VM Christoffer Dall <cdall@linaro.org> - 2017-02-03 14:40 +0100

csiph-web