From: Julien Grall <julien.grall@arm.com>
To: Stefano Stabellini <sstabellini@kernel.org>,
xen-devel@lists.xenproject.org
Cc: nd@arm.com
Subject: Re: [PATCH v4 2/2] arm: proper ordering for correct execution of gic_update_one_lr and vgic_store_itargetsr
Date: Thu, 16 Feb 2017 19:36:59 +0000 [thread overview]
Message-ID: <ad1123eb-ff01-ba7d-e7fa-810d8f6f41cc@arm.com> (raw)
In-Reply-To: <1486778723-25586-2-git-send-email-sstabellini@kernel.org>
Hi Stefano,
On 11/02/17 02:05, Stefano Stabellini wrote:
> Concurrent execution of gic_update_one_lr and vgic_store_itargetsr can
> result in the wrong pcpu being set as irq target, see
> http://marc.info/?l=xen-devel&m=148218667104072.
>
> To solve the issue, add barriers, remove an irq from the inflight
> queue, only after the affinity has been set. On the other end, write the
> new vcpu target, before checking GIC_IRQ_GUEST_MIGRATING and inflight.
>
> Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
> ---
> xen/arch/arm/gic.c | 3 ++-
> xen/arch/arm/vgic-v2.c | 4 ++--
> xen/arch/arm/vgic-v3.c | 4 +++-
> 3 files changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index a5348f2..bb52959 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> @@ -503,12 +503,13 @@ static void gic_update_one_lr(struct vcpu *v, int i)
> !test_bit(GIC_IRQ_GUEST_MIGRATING, &p->status) )
> gic_raise_guest_irq(v, irq, p->priority);
> else {
> - list_del_init(&p->inflight);
> if ( test_and_clear_bit(GIC_IRQ_GUEST_MIGRATING, &p->status) )
> {
> struct vcpu *v_target = vgic_get_target_vcpu(v, irq);
> irq_set_affinity(p->desc, cpumask_of(v_target->processor));
> }
> + smp_mb();
> + list_del_init(&p->inflight);
I don't understand why you remove from the inflight list afterwards. If
you do that you introduce that same problem as discussed in
<7a78c859-fa6f-ba10-b574-d8edd46ea934@arm.com>
As long as the interrupt is routed to the pCPU running
gic_update_one_lr, the interrupt cannot fired because the interrupts are
masked. However, as soon as irq_set_affinity is called the interrupt may
fire on the other pCPU.
However, list_del_init is not atomic and not protected by any lock. So
vgic_vcpu_inject_irq may see a corrupted version of {p,n}->inflight.
Did I miss anything?
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-02-16 19:37 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-11 2:05 [PATCH v4 1/2] arm: read/write rank->vcpu atomically Stefano Stabellini
2017-02-11 2:05 ` [PATCH v4 2/2] arm: proper ordering for correct execution of gic_update_one_lr and vgic_store_itargetsr Stefano Stabellini
2017-02-14 0:29 ` Stefano Stabellini
2017-02-16 19:36 ` Julien Grall [this message]
2017-02-16 22:10 ` Stefano Stabellini
2017-02-16 23:12 ` Julien Grall
2017-02-16 23:39 ` Stefano Stabellini
2017-02-16 18:55 ` [PATCH v4 1/2] arm: read/write rank->vcpu atomically Julien Grall
2017-02-16 19:59 ` Stefano Stabellini
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=ad1123eb-ff01-ba7d-e7fa-810d8f6f41cc@arm.com \
--to=julien.grall@arm.com \
--cc=nd@arm.com \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.org \
/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.