WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH][PVOPS] preserve chip_data when initializing irq in x

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH][PVOPS] preserve chip_data when initializing irq in xen_allocate_pirq
From: Ronny Hegewald <ronny.hegewald@xxxxxxxxx>
Date: Wed, 29 Sep 2010 01:49:18 +0000
Delivery-date: Tue, 28 Sep 2010 17:47:23 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: KMail/1.11.4 (Linux/2.6.31.9; KDE/4.2.4; i686; ; )
When running latest xen/stable-2.6.31.x as dom0 it crashes during boot with a 
stacktrace that looks like this.

        do_page_fault
        add_pin_to_irq_node
        setup_IO_APIC_irq_extra
        sysfs_create_group
        acpi_ev_sci_xrupt_handler
        acpi_sci_to_irq
        acpi_os_install_interrupt_handler
        acpi_ev_install_sci_handler
        acpi_enable_subsystem
        acpi_init
        pci_slot_init
        acpi_init
        do_one_initcall
        kernel_init

This only happens when the kernel is configured with CONFIG_SPARSE_IRQ=n.
 
This crash appeared since the upstream patch 

        x86: Fix SCI on IOAPIC != 0 
(http://git.kernel.org/?p=linux/kernel/git/jeremy/xen.git;a=commitdiff;h=d539e5576605d048e6aeb21cbe3a8e71dc5eea81)

from the stable 2.6.31.13 series.

The crash happens in add_pin_to_irq_node because irq_cfg, that is taken from 
irq_desc.chip_data, is null.

In xen/stable-2.6.32.x this doesnt happen currently, because of the removement 
of the xen apic-code. This has the effect that the call to mp_find_ioapic in 
setup_IO_APIC_irq_extra returns -1 and the function aborts before the code is 
reached where the crash happens.

The root-problem is that in xen_allocate_pirq the chip_data is cleared by the 
call to dynamic_irq_init. The attached patch fixes this by reinserting 
chip_data after the call to dynamic_irq_init.

For 2.6.32 the code can be simplified so i attached a separate patch for 
xen/stable-2.6.32.x 

========== patch for xen/stable-2.6.31.x

Preserve irq_desc.chip_data when calling dynamic_irq_init, as its needed later 
in setup_IO_APIC_irq_extra.

Signed-off-by: Ronny.Hegewald@xxxxxxxxx

--- drivers/xen/events.c.org    2010-09-20 21:07:49.000000000 +0000
+++ drivers/xen/events.c        2010-09-29 01:11:20.000000000 +0000
@@ -559,6 +559,8 @@ int xen_allocate_pirq(unsigned gsi, int 
 {
        int irq;
        struct physdev_irq irq_op;
+       struct irq_desc* desc;
+       void* chip_data;
 
        spin_lock(&irq_mapping_update_lock);
 
@@ -573,8 +575,10 @@ int xen_allocate_pirq(unsigned gsi, int 
         * we are using the !xen_initial_domain() to drop in the function.*/
        if (identity_mapped_irq(gsi) || !xen_initial_domain()) {
                irq = gsi;
-               irq_to_desc_alloc_node(irq, 0);
+               desc = irq_to_desc_alloc_node(irq, 0);
+               chip_data = desc->chip_data; 
                dynamic_irq_init(irq);
+               desc->chip_data = chip_data; 
        } else
                irq = find_unbound_irq();


========== patch for xen/stable-2.6.32.x

Preserve irq_desc.chip_data when calling dynamic_irq_init, as its needed later 
in setup_IO_APIC_irq_extra.

Signed-off-by: Ronny.Hegewald@xxxxxxxxx

--- drivers/xen/events.c.org    2010-09-28 23:45:41.000000000 +0000
+++ drivers/xen/events.c        2010-09-28 23:46:11.000000000 +0000
@@ -602,7 +602,7 @@
        if (identity_mapped_irq(gsi) || !xen_initial_domain()) {
                irq = gsi;
                irq_to_desc_alloc_node(irq, 0);
-               dynamic_irq_init(irq);
+               dynamic_irq_init_keep_chip_data(irq);
        } else
                irq = find_unbound_irq();



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel