[Acked] [SRU][Wily][PATCH 1/1] x86/ioapic: Disable interrupts when re-routing legacy IRQs

Andy Whitcroft apw at canonical.com
Sat Nov 21 11:13:19 UTC 2015


On Fri, Nov 20, 2015 at 03:32:18PM -0500, Joseph Salisbury wrote:
> From: Vitaly Kuznetsov <vkuznets at redhat.com>
> 
> BugLink: http://bugs.launchpad.net/bugs/1508593
> 
> A sporadic hang with consequent crash is observed when booting Hyper-V Gen1
> guests:
> 
>  Call Trace:
>   <IRQ>
>   [<ffffffff810ab68d>] ? trace_hardirqs_off+0xd/0x10
>   [<ffffffff8107b616>] queue_work_on+0x46/0x90
>   [<ffffffff81365696>] ? add_interrupt_randomness+0x176/0x1d0
>   ...
>   <EOI>
>   [<ffffffff81471ddb>] ? _raw_spin_unlock_irqrestore+0x3b/0x60
>   [<ffffffff810c295e>] __irq_put_desc_unlock+0x1e/0x40
>   [<ffffffff810c5c35>] irq_modify_status+0xb5/0xd0
>   [<ffffffff8104adbb>] mp_register_handler+0x4b/0x70
>   [<ffffffff8104c55a>] mp_irqdomain_alloc+0x1ea/0x2a0
>   [<ffffffff810c7f10>] irq_domain_alloc_irqs_recursive+0x40/0xa0
>   [<ffffffff810c860c>] __irq_domain_alloc_irqs+0x13c/0x2b0
>   [<ffffffff8104b070>] alloc_isa_irq_from_domain.isra.1+0xc0/0xe0
>   [<ffffffff8104bfa5>] mp_map_pin_to_irq+0x165/0x2d0
>   [<ffffffff8104c157>] pin_2_irq+0x47/0x80
>   [<ffffffff81744253>] setup_IO_APIC+0xfe/0x802
>   ...
>   [<ffffffff814631c0>] ? rest_init+0x140/0x140
> 
> The issue is easily reproducible with a simple instrumentation: if
> mdelay(10) is put between mp_setup_entry() and mp_register_handler() calls
> in mp_irqdomain_alloc() Hyper-V guest always fails to boot when re-routing
> IRQ0. The issue seems to be caused by the fact that we don't disable
> interrupts while doing IOPIC programming for legacy IRQs and IRQ0 actually
> happens.
> 
> Protect the setup sequence against concurrent interrupts.
> 
> [ tglx: Make the protection unconditional and not only for legacy
>   	interrupts ]
> 
> Signed-off-by: Vitaly Kuznetsov <vkuznets at redhat.com>
> Cc: Jiang Liu <jiang.liu at linux.intel.com>
> Cc: Yinghai Lu <yinghai at kernel.org>
> Cc: K. Y. Srinivasan <kys at microsoft.com>
> Link: http://lkml.kernel.org/r/1444930943-19336-1-git-send-email-vkuznets@redhat.com
> Signed-off-by: Thomas Gleixner <tglx at linutronix.de>
> (cherry picked from commit c0ff971ef9acacd4d2caa508e444edad958dead9)
> Signed-off-by: Joseph Salisbury <joseph.salisbury at canonical.com>
> ---
>  arch/x86/kernel/apic/io_apic.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
> index 206052e..b15b924 100644
> --- a/arch/x86/kernel/apic/io_apic.c
> +++ b/arch/x86/kernel/apic/io_apic.c
> @@ -2906,6 +2906,7 @@ int mp_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,
>  	struct irq_data *irq_data;
>  	struct mp_chip_data *data;
>  	struct irq_alloc_info *info = arg;
> +	unsigned long flags;
>  
>  	if (!info || nr_irqs > 1)
>  		return -EINVAL;
> @@ -2938,11 +2939,14 @@ int mp_irqdomain_alloc(struct irq_domain *domain, unsigned int virq,
>  
>  	cfg = irqd_cfg(irq_data);
>  	add_pin_to_irq_node(data, ioapic_alloc_attr_node(info), ioapic, pin);
> +
> +	local_irq_save(flags);
>  	if (info->ioapic_entry)
>  		mp_setup_entry(cfg, data, info->ioapic_entry);
>  	mp_register_handler(virq, data->trigger);
>  	if (virq < nr_legacy_irqs())
>  		legacy_pic->mask(virq);
> +	local_irq_restore(flags);
>  
>  	apic_printk(APIC_VERBOSE, KERN_DEBUG
>  		    "IOAPIC[%d]: Set routing entry (%d-%d -> 0x%x -> IRQ %d Mode:%i Active:%i Dest:%d)\n",

Look to do what is claimed, clean cherry pick.

Acked-by: Andy Whitcroft <apw at canonical.com>

-apw




More information about the kernel-team mailing list