← Back to team overview

kernel-packages team mailing list archive

[Bug 1508593] Re: [Hyper-V] x86/ioapic: Disable interrupts when re-routing legacy IRQs

 

After working on the backport to Vivid, I'm not sure if the patch(Commit
c0ff971) requested in this bug is applicable to Vivid and Trusty.

Commit c0ff971 disables interrupts when re-routing legacy IRQs.  However, the functions affected by commit c0ff971 were not added until v4.2-rc1 by commit:
'49c7e60 x86/irq: Implement callbacks to enable hierarchical irqdomains on IOAPICs'

Heirarchical irqdomains were not added until v4.2-rc1 as well, by commit:
'b5dc8e6 x86/irq: Use hierarchical irqdomain to manage CPU interrupt vectors'


The reproducer listed in the description cannot be attempted since
mp_setup_entry() and mp_register_handler() dont exist in the 3.19 or
3.13 kernels since they were added in 4.2-rc1 by commit 49c7e60.

Is there a way to confirm and test that commit c0ff971 is needed in
Vivid and Trusty?

-- 
You received this bug notification because you are a member of Kernel
Packages, which is subscribed to linux in Ubuntu.
https://bugs.launchpad.net/bugs/1508593

Title:
  [Hyper-V] x86/ioapic: Disable interrupts when re-routing legacy IRQs

Status in linux package in Ubuntu:
  In Progress
Status in linux source package in Trusty:
  In Progress
Status in linux source package in Vivid:
  In Progress
Status in linux source package in Wily:
  Fix Committed

Bug description:
  A sporadic hang with consequent crash is observed when booting Hyper-V
  Gen1 guests...

  Sauce request for upstream submission:

  https://lkml.org/lkml/2015/10/15/673

  From Vitaly Kuznetsov <> 
  Subject [PATCH] x86/ioapic: Disable interrupts when re-routing legacy IRQs 
  Date Thu, 15 Oct 2015 19:42:23 +0200 

  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. Decorate manipulations with legacy IRQs with local_irq_save()/
  local_irq_restore().

  Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
  Cc: Ingo Molnar <mingo@xxxxxxxxxx>
  Cc: "H. Peter Anvin" <hpa@xxxxxxxxx>
  Cc: Jiang Liu <jiang.liu@xxxxxxxxxxxxxxx>
  Cc: Yinghai Lu <yinghai@xxxxxxxxxx>
  Cc: K. Y. Srinivasan <kys@xxxxxxxxxxxxx>
  Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx>
  ---
  It may make sense to have interrupts disabled for non-legacy IRQs as well
  but I'm unaware of any bugs with them at this moment.
  ---
   arch/x86/kernel/apic/io_apic.c | 8 +++++++-
   1 file changed, 7 insertions(+), 1 deletion(-)
  diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
  index 5c60bb1..9aac777 100644
  --- a/arch/x86/kernel/apic/io_apic.c
  +++ b/arch/x86/kernel/apic/io_apic.c
  @@ -2907,6 +2907,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 = 0;
   
   	if (!info || nr_irqs > 1)
   		return -EINVAL;
  @@ -2939,11 +2940,16 @@ 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);
  +
  +	if (virq < nr_legacy_irqs())
  +		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())
  +	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",
  -- 
  2.4.3

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1508593/+subscriptions