xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
* [PATCH][PVOPS] preserve chip_data when initializing irq in xen_allocate_pirq
@ 2010-09-29  1:49 Ronny Hegewald
  2010-09-29  9:41 ` Ian Campbell
  0 siblings, 1 reply; 4+ messages in thread
From: Ronny Hegewald @ 2010-09-29  1:49 UTC (permalink / raw)
  To: xen-devel

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@online.de

--- 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@online.de

--- 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();

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-09-29 21:08 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-29  1:49 [PATCH][PVOPS] preserve chip_data when initializing irq in xen_allocate_pirq Ronny Hegewald
2010-09-29  9:41 ` Ian Campbell
2010-09-29 18:51   ` Ronny Hegewald
2010-09-29 21:08     ` Ian Campbell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).