From: Christoffer Dall <christoffer.dall@linaro.org>
To: Jintack Lim <jintack@cs.columbia.edu>
Cc: kvm@vger.kernel.org, marc.zyngier@arm.com,
catalin.marinas@arm.com, will.deacon@arm.com,
linux@armlinux.org.uk, linux-kernel@vger.kernel.org,
andre.przywara@arm.com, pbonzini@redhat.com,
kvmarm@lists.cs.columbia.edu,
linux-arm-kernel@lists.infradead.org
Subject: Re: [RFC v2 03/10] KVM: arm/arm64: Decouple kvm timer functions from virtual timer
Date: Mon, 30 Jan 2017 15:49:04 +0100 [thread overview]
Message-ID: <20170130144904.GB16459@cbox> (raw)
In-Reply-To: <1485479100-4966-4-git-send-email-jintack@cs.columbia.edu>
On Thu, Jan 26, 2017 at 08:04:53PM -0500, Jintack Lim wrote:
> Now that we have a separate structure for timer context, make functions
> general so that they can work with any timer context, not just the
> virtual timer context. This does not change the virtual timer
> functionality.
>
> Signed-off-by: Jintack Lim <jintack@cs.columbia.edu>
> ---
> arch/arm/kvm/arm.c | 2 +-
> include/kvm/arm_arch_timer.h | 3 ++-
> virt/kvm/arm/arch_timer.c | 55 ++++++++++++++++++++++----------------------
> 3 files changed, 30 insertions(+), 30 deletions(-)
>
> diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
> index 9d74464..9a34a3c 100644
> --- a/arch/arm/kvm/arm.c
> +++ b/arch/arm/kvm/arm.c
> @@ -301,7 +301,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
>
> int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
> {
> - return kvm_timer_should_fire(vcpu);
> + return kvm_timer_should_fire(vcpu, vcpu_vtimer(vcpu));
> }
>
> void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu)
> diff --git a/include/kvm/arm_arch_timer.h b/include/kvm/arm_arch_timer.h
> index 1b9c988..d921d20 100644
> --- a/include/kvm/arm_arch_timer.h
> +++ b/include/kvm/arm_arch_timer.h
> @@ -67,7 +67,8 @@ int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu,
> u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid);
> int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value);
>
> -bool kvm_timer_should_fire(struct kvm_vcpu *vcpu);
> +bool kvm_timer_should_fire(struct kvm_vcpu *vcpu,
> + struct arch_timer_context *timer_ctx);
> void kvm_timer_schedule(struct kvm_vcpu *vcpu);
> void kvm_timer_unschedule(struct kvm_vcpu *vcpu);
>
> diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c
> index fa4c042..f72005a 100644
> --- a/virt/kvm/arm/arch_timer.c
> +++ b/virt/kvm/arm/arch_timer.c
> @@ -98,13 +98,13 @@ static void kvm_timer_inject_irq_work(struct work_struct *work)
> kvm_vcpu_kick(vcpu);
> }
>
> -static u64 kvm_timer_compute_delta(struct kvm_vcpu *vcpu)
> +static u64 kvm_timer_compute_delta(struct kvm_vcpu *vcpu,
> + struct arch_timer_context *timer_ctx)
do you need the vcpu parameter here?
> {
> u64 cval, now;
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
>
> - cval = vtimer->cnt_cval;
> - now = kvm_phys_timer_read() - vtimer->cntvoff;
> + cval = timer_ctx->cnt_cval;
> + now = kvm_phys_timer_read() - timer_ctx->cntvoff;
>
> if (now < cval) {
> u64 ns;
> @@ -133,7 +133,7 @@ static enum hrtimer_restart kvm_timer_expire(struct hrtimer *hrt)
> * PoV (NTP on the host may have forced it to expire
> * early). If we should have slept longer, restart it.
> */
> - ns = kvm_timer_compute_delta(vcpu);
> + ns = kvm_timer_compute_delta(vcpu, vcpu_vtimer(vcpu));
> if (unlikely(ns)) {
> hrtimer_forward_now(hrt, ns_to_ktime(ns));
> return HRTIMER_RESTART;
> @@ -143,42 +143,40 @@ static enum hrtimer_restart kvm_timer_expire(struct hrtimer *hrt)
> return HRTIMER_NORESTART;
> }
>
> -static bool kvm_timer_irq_can_fire(struct kvm_vcpu *vcpu)
> +static bool kvm_timer_irq_can_fire(struct arch_timer_context *timer_ctx)
> {
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
> -
> - return !(vtimer->cnt_ctl & ARCH_TIMER_CTRL_IT_MASK) &&
> - (vtimer->cnt_ctl & ARCH_TIMER_CTRL_ENABLE);
> + return !(timer_ctx->cnt_ctl & ARCH_TIMER_CTRL_IT_MASK) &&
> + (timer_ctx->cnt_ctl & ARCH_TIMER_CTRL_ENABLE);
> }
>
> -bool kvm_timer_should_fire(struct kvm_vcpu *vcpu)
> +bool kvm_timer_should_fire(struct kvm_vcpu *vcpu,
> + struct arch_timer_context *timer_ctx)
do you need the vcpu parameter here?
> {
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
> u64 cval, now;
>
> - if (!kvm_timer_irq_can_fire(vcpu))
> + if (!kvm_timer_irq_can_fire(timer_ctx))
> return false;
>
> - cval = vtimer->cnt_cval;
> - now = kvm_phys_timer_read() - vtimer->cntvoff;
> + cval = timer_ctx->cnt_cval;
> + now = kvm_phys_timer_read() - timer_ctx->cntvoff;
>
> return cval <= now;
> }
>
> -static void kvm_timer_update_irq(struct kvm_vcpu *vcpu, bool new_level)
> +static void kvm_timer_update_mapped_irq(struct kvm_vcpu *vcpu, bool new_level,
> + struct arch_timer_context *timer_ctx)
> {
> int ret;
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
>
> BUG_ON(!vgic_initialized(vcpu->kvm));
>
> - vtimer->active_cleared_last = false;
> - vtimer->irq.level = new_level;
> - trace_kvm_timer_update_irq(vcpu->vcpu_id, vtimer->irq.irq,
> - vtimer->irq.level);
> + timer_ctx->active_cleared_last = false;
> + timer_ctx->irq.level = new_level;
> + trace_kvm_timer_update_irq(vcpu->vcpu_id, timer_ctx->irq.irq,
> + timer_ctx->irq.level);
> ret = kvm_vgic_inject_mapped_irq(vcpu->kvm, vcpu->vcpu_id,
> - vtimer->irq.irq,
> - vtimer->irq.level);
> + timer_ctx->irq.irq,
> + timer_ctx->irq.level);
> WARN_ON(ret);
> }
>
> @@ -200,8 +198,8 @@ static int kvm_timer_update_state(struct kvm_vcpu *vcpu)
> if (!vgic_initialized(vcpu->kvm) || !timer->enabled)
> return -ENODEV;
>
> - if (kvm_timer_should_fire(vcpu) != vtimer->irq.level)
> - kvm_timer_update_irq(vcpu, !vtimer->irq.level);
> + if (kvm_timer_should_fire(vcpu, vtimer) != vtimer->irq.level)
> + kvm_timer_update_mapped_irq(vcpu, !vtimer->irq.level, vtimer);
>
> return 0;
> }
> @@ -214,6 +212,7 @@ static int kvm_timer_update_state(struct kvm_vcpu *vcpu)
> void kvm_timer_schedule(struct kvm_vcpu *vcpu)
> {
> struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu;
> + struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
>
> BUG_ON(timer_is_armed(timer));
>
> @@ -222,18 +221,18 @@ void kvm_timer_schedule(struct kvm_vcpu *vcpu)
> * already expired, because kvm_vcpu_block will return before putting
> * the thread to sleep.
> */
> - if (kvm_timer_should_fire(vcpu))
> + if (kvm_timer_should_fire(vcpu, vtimer))
> return;
>
> /*
> * If the timer is not capable of raising interrupts (disabled or
> * masked), then there's no more work for us to do.
> */
> - if (!kvm_timer_irq_can_fire(vcpu))
> + if (!kvm_timer_irq_can_fire(vtimer))
> return;
>
> /* The timer has not yet expired, schedule a background timer */
> - timer_arm(timer, kvm_timer_compute_delta(vcpu));
> + timer_arm(timer, kvm_timer_compute_delta(vcpu, vtimer));
> }
>
> void kvm_timer_unschedule(struct kvm_vcpu *vcpu)
> --
> 1.9.1
>
>
WARNING: multiple messages have this Message-ID (diff)
From: christoffer.dall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC v2 03/10] KVM: arm/arm64: Decouple kvm timer functions from virtual timer
Date: Mon, 30 Jan 2017 15:49:04 +0100 [thread overview]
Message-ID: <20170130144904.GB16459@cbox> (raw)
In-Reply-To: <1485479100-4966-4-git-send-email-jintack@cs.columbia.edu>
On Thu, Jan 26, 2017 at 08:04:53PM -0500, Jintack Lim wrote:
> Now that we have a separate structure for timer context, make functions
> general so that they can work with any timer context, not just the
> virtual timer context. This does not change the virtual timer
> functionality.
>
> Signed-off-by: Jintack Lim <jintack@cs.columbia.edu>
> ---
> arch/arm/kvm/arm.c | 2 +-
> include/kvm/arm_arch_timer.h | 3 ++-
> virt/kvm/arm/arch_timer.c | 55 ++++++++++++++++++++++----------------------
> 3 files changed, 30 insertions(+), 30 deletions(-)
>
> diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
> index 9d74464..9a34a3c 100644
> --- a/arch/arm/kvm/arm.c
> +++ b/arch/arm/kvm/arm.c
> @@ -301,7 +301,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
>
> int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
> {
> - return kvm_timer_should_fire(vcpu);
> + return kvm_timer_should_fire(vcpu, vcpu_vtimer(vcpu));
> }
>
> void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu)
> diff --git a/include/kvm/arm_arch_timer.h b/include/kvm/arm_arch_timer.h
> index 1b9c988..d921d20 100644
> --- a/include/kvm/arm_arch_timer.h
> +++ b/include/kvm/arm_arch_timer.h
> @@ -67,7 +67,8 @@ int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu,
> u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid);
> int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value);
>
> -bool kvm_timer_should_fire(struct kvm_vcpu *vcpu);
> +bool kvm_timer_should_fire(struct kvm_vcpu *vcpu,
> + struct arch_timer_context *timer_ctx);
> void kvm_timer_schedule(struct kvm_vcpu *vcpu);
> void kvm_timer_unschedule(struct kvm_vcpu *vcpu);
>
> diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c
> index fa4c042..f72005a 100644
> --- a/virt/kvm/arm/arch_timer.c
> +++ b/virt/kvm/arm/arch_timer.c
> @@ -98,13 +98,13 @@ static void kvm_timer_inject_irq_work(struct work_struct *work)
> kvm_vcpu_kick(vcpu);
> }
>
> -static u64 kvm_timer_compute_delta(struct kvm_vcpu *vcpu)
> +static u64 kvm_timer_compute_delta(struct kvm_vcpu *vcpu,
> + struct arch_timer_context *timer_ctx)
do you need the vcpu parameter here?
> {
> u64 cval, now;
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
>
> - cval = vtimer->cnt_cval;
> - now = kvm_phys_timer_read() - vtimer->cntvoff;
> + cval = timer_ctx->cnt_cval;
> + now = kvm_phys_timer_read() - timer_ctx->cntvoff;
>
> if (now < cval) {
> u64 ns;
> @@ -133,7 +133,7 @@ static enum hrtimer_restart kvm_timer_expire(struct hrtimer *hrt)
> * PoV (NTP on the host may have forced it to expire
> * early). If we should have slept longer, restart it.
> */
> - ns = kvm_timer_compute_delta(vcpu);
> + ns = kvm_timer_compute_delta(vcpu, vcpu_vtimer(vcpu));
> if (unlikely(ns)) {
> hrtimer_forward_now(hrt, ns_to_ktime(ns));
> return HRTIMER_RESTART;
> @@ -143,42 +143,40 @@ static enum hrtimer_restart kvm_timer_expire(struct hrtimer *hrt)
> return HRTIMER_NORESTART;
> }
>
> -static bool kvm_timer_irq_can_fire(struct kvm_vcpu *vcpu)
> +static bool kvm_timer_irq_can_fire(struct arch_timer_context *timer_ctx)
> {
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
> -
> - return !(vtimer->cnt_ctl & ARCH_TIMER_CTRL_IT_MASK) &&
> - (vtimer->cnt_ctl & ARCH_TIMER_CTRL_ENABLE);
> + return !(timer_ctx->cnt_ctl & ARCH_TIMER_CTRL_IT_MASK) &&
> + (timer_ctx->cnt_ctl & ARCH_TIMER_CTRL_ENABLE);
> }
>
> -bool kvm_timer_should_fire(struct kvm_vcpu *vcpu)
> +bool kvm_timer_should_fire(struct kvm_vcpu *vcpu,
> + struct arch_timer_context *timer_ctx)
do you need the vcpu parameter here?
> {
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
> u64 cval, now;
>
> - if (!kvm_timer_irq_can_fire(vcpu))
> + if (!kvm_timer_irq_can_fire(timer_ctx))
> return false;
>
> - cval = vtimer->cnt_cval;
> - now = kvm_phys_timer_read() - vtimer->cntvoff;
> + cval = timer_ctx->cnt_cval;
> + now = kvm_phys_timer_read() - timer_ctx->cntvoff;
>
> return cval <= now;
> }
>
> -static void kvm_timer_update_irq(struct kvm_vcpu *vcpu, bool new_level)
> +static void kvm_timer_update_mapped_irq(struct kvm_vcpu *vcpu, bool new_level,
> + struct arch_timer_context *timer_ctx)
> {
> int ret;
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
>
> BUG_ON(!vgic_initialized(vcpu->kvm));
>
> - vtimer->active_cleared_last = false;
> - vtimer->irq.level = new_level;
> - trace_kvm_timer_update_irq(vcpu->vcpu_id, vtimer->irq.irq,
> - vtimer->irq.level);
> + timer_ctx->active_cleared_last = false;
> + timer_ctx->irq.level = new_level;
> + trace_kvm_timer_update_irq(vcpu->vcpu_id, timer_ctx->irq.irq,
> + timer_ctx->irq.level);
> ret = kvm_vgic_inject_mapped_irq(vcpu->kvm, vcpu->vcpu_id,
> - vtimer->irq.irq,
> - vtimer->irq.level);
> + timer_ctx->irq.irq,
> + timer_ctx->irq.level);
> WARN_ON(ret);
> }
>
> @@ -200,8 +198,8 @@ static int kvm_timer_update_state(struct kvm_vcpu *vcpu)
> if (!vgic_initialized(vcpu->kvm) || !timer->enabled)
> return -ENODEV;
>
> - if (kvm_timer_should_fire(vcpu) != vtimer->irq.level)
> - kvm_timer_update_irq(vcpu, !vtimer->irq.level);
> + if (kvm_timer_should_fire(vcpu, vtimer) != vtimer->irq.level)
> + kvm_timer_update_mapped_irq(vcpu, !vtimer->irq.level, vtimer);
>
> return 0;
> }
> @@ -214,6 +212,7 @@ static int kvm_timer_update_state(struct kvm_vcpu *vcpu)
> void kvm_timer_schedule(struct kvm_vcpu *vcpu)
> {
> struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu;
> + struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
>
> BUG_ON(timer_is_armed(timer));
>
> @@ -222,18 +221,18 @@ void kvm_timer_schedule(struct kvm_vcpu *vcpu)
> * already expired, because kvm_vcpu_block will return before putting
> * the thread to sleep.
> */
> - if (kvm_timer_should_fire(vcpu))
> + if (kvm_timer_should_fire(vcpu, vtimer))
> return;
>
> /*
> * If the timer is not capable of raising interrupts (disabled or
> * masked), then there's no more work for us to do.
> */
> - if (!kvm_timer_irq_can_fire(vcpu))
> + if (!kvm_timer_irq_can_fire(vtimer))
> return;
>
> /* The timer has not yet expired, schedule a background timer */
> - timer_arm(timer, kvm_timer_compute_delta(vcpu));
> + timer_arm(timer, kvm_timer_compute_delta(vcpu, vtimer));
> }
>
> void kvm_timer_unschedule(struct kvm_vcpu *vcpu)
> --
> 1.9.1
>
>
WARNING: multiple messages have this Message-ID (diff)
From: Christoffer Dall <christoffer.dall@linaro.org>
To: Jintack Lim <jintack@cs.columbia.edu>
Cc: pbonzini@redhat.com, rkrcmar@redhat.com, marc.zyngier@arm.com,
linux@armlinux.org.uk, catalin.marinas@arm.com,
will.deacon@arm.com, andre.przywara@arm.com, kvm@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org
Subject: Re: [RFC v2 03/10] KVM: arm/arm64: Decouple kvm timer functions from virtual timer
Date: Mon, 30 Jan 2017 15:49:04 +0100 [thread overview]
Message-ID: <20170130144904.GB16459@cbox> (raw)
In-Reply-To: <1485479100-4966-4-git-send-email-jintack@cs.columbia.edu>
On Thu, Jan 26, 2017 at 08:04:53PM -0500, Jintack Lim wrote:
> Now that we have a separate structure for timer context, make functions
> general so that they can work with any timer context, not just the
> virtual timer context. This does not change the virtual timer
> functionality.
>
> Signed-off-by: Jintack Lim <jintack@cs.columbia.edu>
> ---
> arch/arm/kvm/arm.c | 2 +-
> include/kvm/arm_arch_timer.h | 3 ++-
> virt/kvm/arm/arch_timer.c | 55 ++++++++++++++++++++++----------------------
> 3 files changed, 30 insertions(+), 30 deletions(-)
>
> diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
> index 9d74464..9a34a3c 100644
> --- a/arch/arm/kvm/arm.c
> +++ b/arch/arm/kvm/arm.c
> @@ -301,7 +301,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
>
> int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
> {
> - return kvm_timer_should_fire(vcpu);
> + return kvm_timer_should_fire(vcpu, vcpu_vtimer(vcpu));
> }
>
> void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu)
> diff --git a/include/kvm/arm_arch_timer.h b/include/kvm/arm_arch_timer.h
> index 1b9c988..d921d20 100644
> --- a/include/kvm/arm_arch_timer.h
> +++ b/include/kvm/arm_arch_timer.h
> @@ -67,7 +67,8 @@ int kvm_timer_vcpu_reset(struct kvm_vcpu *vcpu,
> u64 kvm_arm_timer_get_reg(struct kvm_vcpu *, u64 regid);
> int kvm_arm_timer_set_reg(struct kvm_vcpu *, u64 regid, u64 value);
>
> -bool kvm_timer_should_fire(struct kvm_vcpu *vcpu);
> +bool kvm_timer_should_fire(struct kvm_vcpu *vcpu,
> + struct arch_timer_context *timer_ctx);
> void kvm_timer_schedule(struct kvm_vcpu *vcpu);
> void kvm_timer_unschedule(struct kvm_vcpu *vcpu);
>
> diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c
> index fa4c042..f72005a 100644
> --- a/virt/kvm/arm/arch_timer.c
> +++ b/virt/kvm/arm/arch_timer.c
> @@ -98,13 +98,13 @@ static void kvm_timer_inject_irq_work(struct work_struct *work)
> kvm_vcpu_kick(vcpu);
> }
>
> -static u64 kvm_timer_compute_delta(struct kvm_vcpu *vcpu)
> +static u64 kvm_timer_compute_delta(struct kvm_vcpu *vcpu,
> + struct arch_timer_context *timer_ctx)
do you need the vcpu parameter here?
> {
> u64 cval, now;
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
>
> - cval = vtimer->cnt_cval;
> - now = kvm_phys_timer_read() - vtimer->cntvoff;
> + cval = timer_ctx->cnt_cval;
> + now = kvm_phys_timer_read() - timer_ctx->cntvoff;
>
> if (now < cval) {
> u64 ns;
> @@ -133,7 +133,7 @@ static enum hrtimer_restart kvm_timer_expire(struct hrtimer *hrt)
> * PoV (NTP on the host may have forced it to expire
> * early). If we should have slept longer, restart it.
> */
> - ns = kvm_timer_compute_delta(vcpu);
> + ns = kvm_timer_compute_delta(vcpu, vcpu_vtimer(vcpu));
> if (unlikely(ns)) {
> hrtimer_forward_now(hrt, ns_to_ktime(ns));
> return HRTIMER_RESTART;
> @@ -143,42 +143,40 @@ static enum hrtimer_restart kvm_timer_expire(struct hrtimer *hrt)
> return HRTIMER_NORESTART;
> }
>
> -static bool kvm_timer_irq_can_fire(struct kvm_vcpu *vcpu)
> +static bool kvm_timer_irq_can_fire(struct arch_timer_context *timer_ctx)
> {
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
> -
> - return !(vtimer->cnt_ctl & ARCH_TIMER_CTRL_IT_MASK) &&
> - (vtimer->cnt_ctl & ARCH_TIMER_CTRL_ENABLE);
> + return !(timer_ctx->cnt_ctl & ARCH_TIMER_CTRL_IT_MASK) &&
> + (timer_ctx->cnt_ctl & ARCH_TIMER_CTRL_ENABLE);
> }
>
> -bool kvm_timer_should_fire(struct kvm_vcpu *vcpu)
> +bool kvm_timer_should_fire(struct kvm_vcpu *vcpu,
> + struct arch_timer_context *timer_ctx)
do you need the vcpu parameter here?
> {
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
> u64 cval, now;
>
> - if (!kvm_timer_irq_can_fire(vcpu))
> + if (!kvm_timer_irq_can_fire(timer_ctx))
> return false;
>
> - cval = vtimer->cnt_cval;
> - now = kvm_phys_timer_read() - vtimer->cntvoff;
> + cval = timer_ctx->cnt_cval;
> + now = kvm_phys_timer_read() - timer_ctx->cntvoff;
>
> return cval <= now;
> }
>
> -static void kvm_timer_update_irq(struct kvm_vcpu *vcpu, bool new_level)
> +static void kvm_timer_update_mapped_irq(struct kvm_vcpu *vcpu, bool new_level,
> + struct arch_timer_context *timer_ctx)
> {
> int ret;
> - struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
>
> BUG_ON(!vgic_initialized(vcpu->kvm));
>
> - vtimer->active_cleared_last = false;
> - vtimer->irq.level = new_level;
> - trace_kvm_timer_update_irq(vcpu->vcpu_id, vtimer->irq.irq,
> - vtimer->irq.level);
> + timer_ctx->active_cleared_last = false;
> + timer_ctx->irq.level = new_level;
> + trace_kvm_timer_update_irq(vcpu->vcpu_id, timer_ctx->irq.irq,
> + timer_ctx->irq.level);
> ret = kvm_vgic_inject_mapped_irq(vcpu->kvm, vcpu->vcpu_id,
> - vtimer->irq.irq,
> - vtimer->irq.level);
> + timer_ctx->irq.irq,
> + timer_ctx->irq.level);
> WARN_ON(ret);
> }
>
> @@ -200,8 +198,8 @@ static int kvm_timer_update_state(struct kvm_vcpu *vcpu)
> if (!vgic_initialized(vcpu->kvm) || !timer->enabled)
> return -ENODEV;
>
> - if (kvm_timer_should_fire(vcpu) != vtimer->irq.level)
> - kvm_timer_update_irq(vcpu, !vtimer->irq.level);
> + if (kvm_timer_should_fire(vcpu, vtimer) != vtimer->irq.level)
> + kvm_timer_update_mapped_irq(vcpu, !vtimer->irq.level, vtimer);
>
> return 0;
> }
> @@ -214,6 +212,7 @@ static int kvm_timer_update_state(struct kvm_vcpu *vcpu)
> void kvm_timer_schedule(struct kvm_vcpu *vcpu)
> {
> struct arch_timer_cpu *timer = &vcpu->arch.timer_cpu;
> + struct arch_timer_context *vtimer = vcpu_vtimer(vcpu);
>
> BUG_ON(timer_is_armed(timer));
>
> @@ -222,18 +221,18 @@ void kvm_timer_schedule(struct kvm_vcpu *vcpu)
> * already expired, because kvm_vcpu_block will return before putting
> * the thread to sleep.
> */
> - if (kvm_timer_should_fire(vcpu))
> + if (kvm_timer_should_fire(vcpu, vtimer))
> return;
>
> /*
> * If the timer is not capable of raising interrupts (disabled or
> * masked), then there's no more work for us to do.
> */
> - if (!kvm_timer_irq_can_fire(vcpu))
> + if (!kvm_timer_irq_can_fire(vtimer))
> return;
>
> /* The timer has not yet expired, schedule a background timer */
> - timer_arm(timer, kvm_timer_compute_delta(vcpu));
> + timer_arm(timer, kvm_timer_compute_delta(vcpu, vtimer));
> }
>
> void kvm_timer_unschedule(struct kvm_vcpu *vcpu)
> --
> 1.9.1
>
>
next prev parent reply other threads:[~2017-01-30 14:48 UTC|newest]
Thread overview: 127+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-27 1:04 [RFC v2 00/10] Provide the EL1 physical timer to the VM Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-27 1:04 ` [RFC v2 01/10] KVM: arm/arm64: Abstract virtual timer context into separate structure Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-29 11:44 ` Marc Zyngier
2017-01-29 11:44 ` Marc Zyngier
2017-01-29 11:44 ` Marc Zyngier
2017-01-27 1:04 ` [RFC v2 02/10] KVM: arm/arm64: Move cntvoff to each timer context Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-29 11:54 ` Marc Zyngier
2017-01-29 11:54 ` Marc Zyngier
2017-01-29 11:54 ` Marc Zyngier
2017-01-30 14:45 ` Christoffer Dall
2017-01-30 14:45 ` Christoffer Dall
2017-01-30 14:45 ` Christoffer Dall
2017-01-30 14:51 ` Marc Zyngier
2017-01-30 14:51 ` Marc Zyngier
2017-01-30 14:51 ` Marc Zyngier
2017-01-30 17:40 ` Jintack Lim
2017-01-30 17:40 ` Jintack Lim
2017-01-30 17:40 ` Jintack Lim
2017-01-30 17:58 ` Jintack Lim
2017-01-30 17:58 ` Jintack Lim
2017-01-30 17:58 ` Jintack Lim
2017-01-30 18:05 ` Marc Zyngier
2017-01-30 18:05 ` Marc Zyngier
2017-01-30 18:05 ` Marc Zyngier
2017-01-30 18:45 ` Jintack Lim
2017-01-30 18:45 ` Jintack Lim
2017-01-27 1:04 ` [RFC v2 03/10] KVM: arm/arm64: Decouple kvm timer functions from virtual timer Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-29 12:01 ` Marc Zyngier
2017-01-29 12:01 ` Marc Zyngier
2017-01-29 12:01 ` Marc Zyngier
2017-01-30 17:17 ` Jintack Lim
2017-01-30 17:17 ` Jintack Lim
2017-01-30 14:49 ` Christoffer Dall [this message]
2017-01-30 14:49 ` Christoffer Dall
2017-01-30 14:49 ` Christoffer Dall
2017-01-30 17:18 ` Jintack Lim
2017-01-30 17:18 ` Jintack Lim
2017-01-30 17:18 ` Jintack Lim
2017-01-27 1:04 ` [RFC v2 04/10] KVM: arm/arm64: Add the EL1 physical timer context Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-27 1:04 ` [RFC v2 05/10] KVM: arm/arm64: Initialize the emulated EL1 physical timer Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-29 12:07 ` Marc Zyngier
2017-01-29 12:07 ` Marc Zyngier
2017-01-29 12:07 ` Marc Zyngier
2017-01-30 14:58 ` Christoffer Dall
2017-01-30 14:58 ` Christoffer Dall
2017-01-30 14:58 ` Christoffer Dall
2017-01-30 17:44 ` Marc Zyngier
2017-01-30 17:44 ` Marc Zyngier
2017-01-30 19:04 ` Christoffer Dall
2017-01-30 19:04 ` Christoffer Dall
2017-01-30 19:04 ` Christoffer Dall
2017-02-01 10:08 ` Marc Zyngier
2017-02-01 10:08 ` Marc Zyngier
2017-02-01 10:08 ` Marc Zyngier
2017-01-27 1:04 ` [RFC v2 06/10] KVM: arm/arm64: Update the physical timer interrupt level Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-29 15:21 ` Marc Zyngier
2017-01-29 15:21 ` Marc Zyngier
2017-01-29 15:21 ` Marc Zyngier
2017-01-30 15:02 ` Christoffer Dall
2017-01-30 15:02 ` Christoffer Dall
2017-01-30 17:50 ` Marc Zyngier
2017-01-30 17:50 ` Marc Zyngier
2017-01-30 17:50 ` Marc Zyngier
2017-01-30 18:41 ` Christoffer Dall
2017-01-30 18:41 ` Christoffer Dall
2017-01-30 18:48 ` Marc Zyngier
2017-01-30 18:48 ` Marc Zyngier
2017-01-30 18:48 ` Marc Zyngier
2017-01-30 19:06 ` Christoffer Dall
2017-01-30 19:06 ` Christoffer Dall
2017-01-30 19:06 ` Christoffer Dall
2017-01-31 17:00 ` Marc Zyngier
2017-01-31 17:00 ` Marc Zyngier
2017-01-31 17:00 ` Marc Zyngier
2017-02-01 8:02 ` Christoffer Dall
2017-02-01 8:02 ` Christoffer Dall
2017-02-01 8:02 ` Christoffer Dall
2017-02-01 8:04 ` Christoffer Dall
2017-02-01 8:04 ` Christoffer Dall
2017-02-01 8:04 ` Christoffer Dall
2017-02-01 8:40 ` Jintack Lim
2017-02-01 8:40 ` Jintack Lim
2017-02-01 8:40 ` Jintack Lim
2017-02-01 10:07 ` Christoffer Dall
2017-02-01 10:07 ` Christoffer Dall
2017-02-01 10:07 ` Christoffer Dall
2017-02-01 10:17 ` Marc Zyngier
2017-02-01 10:17 ` Marc Zyngier
2017-02-01 10:17 ` Marc Zyngier
2017-02-01 10:01 ` Marc Zyngier
2017-02-01 10:01 ` Marc Zyngier
2017-01-27 1:04 ` [RFC v2 07/10] KVM: arm/arm64: Set a background timer to the earliest timer expiration Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-27 1:04 ` [RFC v2 08/10] KVM: arm/arm64: Set up a background timer for the physical timer emulation Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-27 1:04 ` [RFC v2 09/10] KVM: arm64: Add the EL1 physical timer access handler Jintack Lim
2017-01-27 1:04 ` Jintack Lim
2017-01-27 1:05 ` [RFC v2 10/10] KVM: arm/arm64: Emulate the EL1 phys timer register access Jintack Lim
2017-01-27 1:05 ` Jintack Lim
2017-01-29 15:44 ` Marc Zyngier
2017-01-29 15:44 ` Marc Zyngier
2017-01-29 15:44 ` Marc Zyngier
2017-01-30 17:08 ` Jintack Lim
2017-01-30 17:08 ` Jintack Lim
2017-01-30 17:08 ` Jintack Lim
2017-01-30 17:26 ` Peter Maydell
2017-01-30 17:26 ` Peter Maydell
2017-01-30 17:26 ` Peter Maydell
2017-01-30 17:35 ` Marc Zyngier
2017-01-30 17:35 ` Marc Zyngier
2017-01-30 17:35 ` Marc Zyngier
2017-01-30 17:38 ` Jintack Lim
2017-01-30 17:38 ` Jintack Lim
2017-01-30 17:38 ` Jintack Lim
2017-01-29 15:55 ` [RFC v2 00/10] Provide the EL1 physical timer to the VM Marc Zyngier
2017-01-29 15:55 ` Marc Zyngier
2017-01-29 15:55 ` Marc Zyngier
2017-01-30 19:02 ` Jintack Lim
2017-01-30 19:02 ` Jintack Lim
2017-01-30 19:02 ` Jintack Lim
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=20170130144904.GB16459@cbox \
--to=christoffer.dall@linaro.org \
--cc=andre.przywara@arm.com \
--cc=catalin.marinas@arm.com \
--cc=jintack@cs.columbia.edu \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=marc.zyngier@arm.com \
--cc=pbonzini@redhat.com \
--cc=will.deacon@arm.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.