|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.12] xen/arm: irq: End cleanly spurious interrupt
On Mon, 28 Jan 2019, Julien Grall wrote:
> no_irq_type handlers are used when an IRQ does not have action attached.
> This is useful to detect misconfiguration between the interrupt
> controller and the software.
>
> Currently, all the handlers will do nothing on spurious interrupt. This
> means if such interrupt is received, the priority of the interrupt will
> not be dropped and the processor will lose the ability to receive any
> interrupt lower or equal to the priority.
>
> Spurious interrupt can happen while releasing interrupt assigned to
> guest (happen during domain destruction). The interaction is roughly
>
> CPU0 CPU1
> release_guest_irq(A)
> spin_lock(&desc->lock)
> gic_remove_irq_from_guest
> receive IRQ A
> spin_lock(&desc->lock)
> desc->handler->shutdown()
> set_bit(IRQ_DISABLED)
> desc->handler = &no_irq_type
> spin_unlock(&desc->lock)
> desc->handler->end();
> spin_unlock(&desc->lock)
>
> Because the no_irq_type.end callback is implemented as a NOP, CPU1 will
> not drop the priority of the interrupt. So the CPU will not be able to
> receive any interrupt route to any guest afterwards.
>
> The problem can be prevented by dropping the priority and deactivating
> the interrupt via gic_hw_ops->gic_host_irq->end().
>
> Note that, for now, interrupt used by Xen are safe because it is not
> using no_irq_type on release.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
Hi Juergen,
Can I have your relese ack on this fix?
Cheers,
Stefano
> ---
> xen/arch/arm/irq.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/xen/arch/arm/irq.c b/xen/arch/arm/irq.c
> index 4a02cc1eba..c51cf333ce 100644
> --- a/xen/arch/arm/irq.c
> +++ b/xen/arch/arm/irq.c
> @@ -44,7 +44,14 @@ static void ack_none(struct irq_desc *irq)
> printk("unexpected IRQ trap at irq %02x\n", irq->irq);
> }
>
> -static void end_none(struct irq_desc *irq) { }
> +static void end_none(struct irq_desc *irq)
> +{
> + /*
> + * Still allow a CPU to end an interrupt if we receive a spurious
> + * interrupt. This will prevent the CPU to lose interrupt forever.
> + */
> + gic_hw_ops->gic_host_irq_type->end(irq);
> +}
>
> hw_irq_controller no_irq_type = {
> .typename = "none",
> --
> 2.11.0
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |