|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] arm/irq: skip action avalability check for non-debug build
On Wed, 12 Dec 2018, Julien Grall wrote:
> Title: s/avalability/availability/
>
> On 12/12/2018 16:55, Andrii Anisov wrote:
> > From: Andrii Anisov <andrii_anisov@xxxxxxxx>
> >
> > An IRQ with _IRQ_GUEST flag set always has an action.
> > An IRQ with _IRQ_DISABLED flag cleared always have an action.
>
> s/have/has/
>
> Those conditions are not sufficient to ensure desc->action is not NULL. You
> also need to take the spinlock.
>
> While looking at the code, I noticed an interesting race with the release
> code. Guest IRQ are released using the function gic_remove_irq_to_guest. The
> sequence is roughly:
>
> 1) spin_lock(desc->lock);
> 2) writel(desc->irq, ICENABLER);
> 3) set_bit(_IRQ_DISABLED, &desc->status);
> 4) clear_bit(_IRQ_GUES, &desc->status);
> 5) desc->handler = &no_irq_type;
> 6) spin_unlock(desc->lock);
>
> Even if 2) will disable the interrupt in the hardware, the interrupt may have
> been received earlier on another CPU and waiting on the lock. As soon as the
> lock is taken, the code will notice the irq disabled (thanks to 3)) and will
> then end the interrupt. The callbak end for no_irq_type is a NOP, therefore
> the interrupt will stay active and the priority will not be dropped.
>
> Because of that, the CPU will never be able to receive interrupt for guest
> anymore. AFAICT, this can only happen if an interrupt is received while
> destroying the assigned domain.
>
> I think 5) should be replaced with
>
> desc->handler = gic_hw_ops->gic_host_irq_type;
>
> Or we potentially need to update no_irq_type and EOI "spurious interrupt".
>
> I am not entirely sure which way is the best to address the race. Any
> opinions?
I think that changing the .end function of no_irq_type to be the same as
the end function of the host_irq_type controller is the safest option:
yes no_irq_type means no irqs but if we receive an interrupt we should
still EOI it no matter what.
> > Those flags checks cover all accesses to desc->action in do_IRQ, > so we can
> > skip desc->action check.
>
> "in non-debug build".
>
> > Still keep it in place for debug build.
>
> "Keep in place for debug build to help diagnostics potential
> misconfiguration".
>
> >
> > Signed-off-by: Andrii Anisov <andrii_anisov@xxxxxxxx>
> > Reviewed-by: Julien Grall <julien.grall@xxxxxxx>
>
> Please don't add a reviewed-by tag until it was explicitly written by the
> reviewer.
>
> > ---
> > xen/arch/arm/irq.c | 2 ++
> > 1 file changed, 2 insertions(+)
> >
> > diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c
> > index d6a0273..4a02cc1 100644
> > --- a/xen/arch/arm/irq.c
> > +++ b/xen/arch/arm/irq.c
> > @@ -209,12 +209,14 @@ void do_IRQ(struct cpu_user_regs *regs, unsigned int
> > irq, int is_fiq)
> > spin_lock(&desc->lock);
> > desc->handler->ack(desc);
> > +#ifndef NDEBUG
> > if ( !desc->action )
> > {
> > printk("Unknown %s %#3.3x\n",
> > is_fiq ? "FIQ" : "IRQ", irq);
> > goto out;
> > }
> > +#endif
> > if ( test_bit(_IRQ_GUEST, &desc->status) )
> > {
> >
>
> Cheers,
>
> --
> Julien Grall
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |