From: Eric Auger <eric.auger@linaro.org>
To: Christoffer Dall <christoffer.dall@linaro.org>,
kvmarm@lists.cs.columbia.edu,
linux-arm-kernel@lists.infradead.org
Cc: Marc Zyngier <marc.zyngier@arm.com>, kvm@vger.kernel.org
Subject: Re: [PATCH 1/2] arm/arm64: KVM: vgic: Move active state handling to flush_hwstate
Date: Mon, 7 Sep 2015 16:44:04 +0200 [thread overview]
Message-ID: <55EDA2B4.5000903@linaro.org> (raw)
In-Reply-To: <1441376679-8341-2-git-send-email-christoffer.dall@linaro.org>
Hi,
On 09/04/2015 04:24 PM, Christoffer Dall wrote:
> We currently set the physical active state only when we *inject* a new
> pending virtual interrupt, but this is actually not correct, because we
> could have been preempted and run something else on the system that
> resets the active state to clear. This causes us to run the VM with the
> timer set to fire, but without setting the physical active state.
>
> The solution is to always check the LR configurations, and we if have a
> mapped interrupt in the LR in either the pending or active state
> (virtual), then set the physical active state.
>
> Acked-by: Marc Zyngier <marc.zyngier@arm.com>
> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
> ---
> virt/kvm/arm/vgic.c | 42 ++++++++++++++++++++++++++----------------
> 1 file changed, 26 insertions(+), 16 deletions(-)
>
> diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
> index 9eb489a..6bd1c9b 100644
> --- a/virt/kvm/arm/vgic.c
> +++ b/virt/kvm/arm/vgic.c
> @@ -1144,26 +1144,11 @@ static void vgic_queue_irq_to_lr(struct kvm_vcpu *vcpu, int irq,
> struct irq_phys_map *map;
> map = vgic_irq_map_search(vcpu, irq);
>
> - /*
> - * If we have a mapping, and the virtual interrupt is
> - * being injected, then we must set the state to
> - * active in the physical world. Otherwise the
> - * physical interrupt will fire and the guest will
> - * exit before processing the virtual interrupt.
> - */
> if (map) {
> - int ret;
> -
> - BUG_ON(!map->active);
I have a question about this map->active. I did not find any user of
kvm_vgic_set_phys_irq_active anymore. The flag is directly updated in
vgic_sync_hwirq through the irq_get_irqchip_state query. In the same
function, before there is a "BUG_ON(!map || !map->active);"
Can't we have this BUG_ON firing?
> vlr.hwirq = map->phys_irq;
> vlr.state |= LR_HW;
> vlr.state &= ~LR_EOI_INT;
>
> - ret = irq_set_irqchip_state(map->irq,
> - IRQCHIP_STATE_ACTIVE,
> - true);
> - WARN_ON(ret);
> -
> /*
> * Make sure we're not going to sample this
> * again, as a HW-backed interrupt cannot be
> @@ -1255,7 +1240,7 @@ static void __kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
> struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
> struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
> unsigned long *pa_percpu, *pa_shared;
> - int i, vcpu_id;
> + int i, vcpu_id, lr, ret;
> int overflow = 0;
> int nr_shared = vgic_nr_shared_irqs(dist);
>
> @@ -1310,6 +1295,31 @@ epilog:
> */
> clear_bit(vcpu_id, dist->irq_pending_on_cpu);
> }
> +
> + for (lr = 0; lr < vgic->nr_lr; lr++) {
> + struct vgic_lr vlr;
> +
> + if (!test_bit(lr, vgic_cpu->lr_used))
> + continue;
> +
> + vlr = vgic_get_lr(vcpu, lr);
> +
> + /*
> + * If we have a mapping, and the virtual interrupt is
> + * presented to the guest (as pending or active), then we must
> + * set the state to active in the physical world. See
> + * Documentation/virtual/kvm/arm/vgic-mapped-irqs.txt.
if upstreamed in 4.3 whereas the other series is not there,
vgic-mapped-irqs.txt won't be available.
> + */
> + if (vlr.state & LR_HW) {
> + struct irq_phys_map *map;
> + map = vgic_irq_map_search(vcpu, vlr.irq);
> +
> + ret = irq_set_irqchip_state(map->irq,
> + IRQCHIP_STATE_ACTIVE,
> + true);
I understand the need for manually setting the phys dist state in case
of timer however for non shared IRQs, GIC does the job directly. But I
guess it does not harm.
Eric
> + WARN_ON(ret);
> + }
> + }
> }
>
> static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
>
WARNING: multiple messages have this Message-ID (diff)
From: eric.auger@linaro.org (Eric Auger)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/2] arm/arm64: KVM: vgic: Move active state handling to flush_hwstate
Date: Mon, 7 Sep 2015 16:44:04 +0200 [thread overview]
Message-ID: <55EDA2B4.5000903@linaro.org> (raw)
In-Reply-To: <1441376679-8341-2-git-send-email-christoffer.dall@linaro.org>
Hi,
On 09/04/2015 04:24 PM, Christoffer Dall wrote:
> We currently set the physical active state only when we *inject* a new
> pending virtual interrupt, but this is actually not correct, because we
> could have been preempted and run something else on the system that
> resets the active state to clear. This causes us to run the VM with the
> timer set to fire, but without setting the physical active state.
>
> The solution is to always check the LR configurations, and we if have a
> mapped interrupt in the LR in either the pending or active state
> (virtual), then set the physical active state.
>
> Acked-by: Marc Zyngier <marc.zyngier@arm.com>
> Signed-off-by: Christoffer Dall <christoffer.dall@linaro.org>
> ---
> virt/kvm/arm/vgic.c | 42 ++++++++++++++++++++++++++----------------
> 1 file changed, 26 insertions(+), 16 deletions(-)
>
> diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
> index 9eb489a..6bd1c9b 100644
> --- a/virt/kvm/arm/vgic.c
> +++ b/virt/kvm/arm/vgic.c
> @@ -1144,26 +1144,11 @@ static void vgic_queue_irq_to_lr(struct kvm_vcpu *vcpu, int irq,
> struct irq_phys_map *map;
> map = vgic_irq_map_search(vcpu, irq);
>
> - /*
> - * If we have a mapping, and the virtual interrupt is
> - * being injected, then we must set the state to
> - * active in the physical world. Otherwise the
> - * physical interrupt will fire and the guest will
> - * exit before processing the virtual interrupt.
> - */
> if (map) {
> - int ret;
> -
> - BUG_ON(!map->active);
I have a question about this map->active. I did not find any user of
kvm_vgic_set_phys_irq_active anymore. The flag is directly updated in
vgic_sync_hwirq through the irq_get_irqchip_state query. In the same
function, before there is a "BUG_ON(!map || !map->active);"
Can't we have this BUG_ON firing?
> vlr.hwirq = map->phys_irq;
> vlr.state |= LR_HW;
> vlr.state &= ~LR_EOI_INT;
>
> - ret = irq_set_irqchip_state(map->irq,
> - IRQCHIP_STATE_ACTIVE,
> - true);
> - WARN_ON(ret);
> -
> /*
> * Make sure we're not going to sample this
> * again, as a HW-backed interrupt cannot be
> @@ -1255,7 +1240,7 @@ static void __kvm_vgic_flush_hwstate(struct kvm_vcpu *vcpu)
> struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
> struct vgic_dist *dist = &vcpu->kvm->arch.vgic;
> unsigned long *pa_percpu, *pa_shared;
> - int i, vcpu_id;
> + int i, vcpu_id, lr, ret;
> int overflow = 0;
> int nr_shared = vgic_nr_shared_irqs(dist);
>
> @@ -1310,6 +1295,31 @@ epilog:
> */
> clear_bit(vcpu_id, dist->irq_pending_on_cpu);
> }
> +
> + for (lr = 0; lr < vgic->nr_lr; lr++) {
> + struct vgic_lr vlr;
> +
> + if (!test_bit(lr, vgic_cpu->lr_used))
> + continue;
> +
> + vlr = vgic_get_lr(vcpu, lr);
> +
> + /*
> + * If we have a mapping, and the virtual interrupt is
> + * presented to the guest (as pending or active), then we must
> + * set the state to active in the physical world. See
> + * Documentation/virtual/kvm/arm/vgic-mapped-irqs.txt.
if upstreamed in 4.3 whereas the other series is not there,
vgic-mapped-irqs.txt won't be available.
> + */
> + if (vlr.state & LR_HW) {
> + struct irq_phys_map *map;
> + map = vgic_irq_map_search(vcpu, vlr.irq);
> +
> + ret = irq_set_irqchip_state(map->irq,
> + IRQCHIP_STATE_ACTIVE,
> + true);
I understand the need for manually setting the phys dist state in case
of timer however for non shared IRQs, GIC does the job directly. But I
guess it does not harm.
Eric
> + WARN_ON(ret);
> + }
> + }
> }
>
> static bool vgic_process_maintenance(struct kvm_vcpu *vcpu)
>
next prev parent reply other threads:[~2015-09-07 14:44 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-04 14:24 [PATCH 0/2] arm/arm64: KVM: Fix arthictected timer issues Christoffer Dall
2015-09-04 14:24 ` Christoffer Dall
2015-09-04 14:24 ` [PATCH 1/2] arm/arm64: KVM: vgic: Move active state handling to flush_hwstate Christoffer Dall
2015-09-04 14:24 ` Christoffer Dall
2015-09-07 14:44 ` Eric Auger [this message]
2015-09-07 14:44 ` Eric Auger
2015-09-07 15:46 ` Eric Auger
2015-09-07 15:46 ` Eric Auger
2015-09-07 15:54 ` Marc Zyngier
2015-09-07 15:54 ` Marc Zyngier
2015-09-04 14:24 ` [PATCH 2/2] arm/arm64: KVM: arch timer: Reset CNTV_CTL to 0 Christoffer Dall
2015-09-04 14:24 ` Christoffer Dall
2015-09-04 14:47 ` Christoffer Dall
2015-09-04 14:47 ` Christoffer Dall
2015-09-04 14:51 ` Marc Zyngier
2015-09-04 14:51 ` Marc Zyngier
2015-09-04 15:35 ` [PATCH 0/2] arm/arm64: KVM: Fix arthictected timer issues Marc Zyngier
2015-09-04 15:35 ` Marc Zyngier
2015-09-04 15:53 ` Christoffer Dall
2015-09-04 15:53 ` Christoffer Dall
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=55EDA2B4.5000903@linaro.org \
--to=eric.auger@linaro.org \
--cc=christoffer.dall@linaro.org \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=marc.zyngier@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.