# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1235917028 0
# Node ID 9cad48ba52b0dd83dfeae014aaac7a16af0585dc
# Parent f8187a343ad2bdbfe3166d7ee7e3d55a9f157fdc
x86, ioapic: Fix S3 suspend error.
Invoke ioapic_pm_state_alloc() earlier,
thus avoiding check_lock() BUG_ON() in spin_lock().
Signed-off-by: Guanqun Lu <guanqun.lu@xxxxxxxxx>
---
xen/arch/x86/io_apic.c | 71 ++++++++++++++----------------------------
xen/include/asm-x86/io_apic.h | 8 ++--
2 files changed, 29 insertions(+), 50 deletions(-)
diff -r f8187a343ad2 -r 9cad48ba52b0 xen/arch/x86/io_apic.c
--- a/xen/arch/x86/io_apic.c Fri Feb 20 17:02:36 2009 +0000
+++ b/xen/arch/x86/io_apic.c Sun Mar 01 14:17:08 2009 +0000
@@ -1779,6 +1779,20 @@ static inline void check_timer(void)
*/
#define PIC_IRQS (1 << PIC_CASCADE_IR)
+static struct IO_APIC_route_entry *ioapic_pm_state;
+
+void ioapic_pm_state_alloc(void)
+{
+ int i, nr_entry = 0;
+
+ for (i = 0; i < nr_ioapics; i++)
+ nr_entry += nr_ioapic_registers[i];
+
+ ioapic_pm_state = _xmalloc(sizeof(struct IO_APIC_route_entry)*nr_entry,
+ sizeof(struct IO_APIC_route_entry));
+ BUG_ON(ioapic_pm_state == NULL);
+}
+
void __init setup_IO_APIC(void)
{
enable_IO_APIC();
@@ -1801,40 +1815,16 @@ void __init setup_IO_APIC(void)
init_IO_APIC_traps();
check_timer();
print_IO_APIC();
+ ioapic_pm_state_alloc();
register_keyhandler('z', print_IO_APIC_keyhandler, "print ioapic info");
}
-struct IO_APIC_route_entry *ioapic_pm_state=NULL;
-
-void ioapic_pm_state_alloc(void)
-{
- int i, nr_entry = 0;
-
- if (ioapic_pm_state != NULL)
- return;
-
- for (i = 0; i < nr_ioapics; i++)
- nr_entry += nr_ioapic_registers[i];
-
- ioapic_pm_state = _xmalloc(sizeof(struct IO_APIC_route_entry)*nr_entry,
- sizeof(struct IO_APIC_route_entry));
-}
-
-int ioapic_suspend(void)
-{
- struct IO_APIC_route_entry *entry;
+void ioapic_suspend(void)
+{
+ struct IO_APIC_route_entry *entry = ioapic_pm_state;
unsigned long flags;
- int apic,i;
-
- ioapic_pm_state_alloc();
-
- if (ioapic_pm_state == NULL) {
- printk("Cannot suspend ioapic due to lack of memory\n");
- return 1;
- }
-
- entry = ioapic_pm_state;
+ int apic, i;
spin_lock_irqsave(&ioapic_lock, flags);
for (apic = 0; apic < nr_ioapics; apic++) {
@@ -1844,23 +1834,14 @@ int ioapic_suspend(void)
}
}
spin_unlock_irqrestore(&ioapic_lock, flags);
-
- return 0;
-}
-
-int ioapic_resume(void)
-{
- struct IO_APIC_route_entry *entry;
+}
+
+void ioapic_resume(void)
+{
+ struct IO_APIC_route_entry *entry = ioapic_pm_state;
unsigned long flags;
union IO_APIC_reg_00 reg_00;
- int i,apic;
-
- if (ioapic_pm_state == NULL){
- printk("Cannot resume ioapic due to lack of memory\n");
- return 1;
- }
-
- entry = ioapic_pm_state;
+ int i, apic;
spin_lock_irqsave(&ioapic_lock, flags);
for (apic = 0; apic < nr_ioapics; apic++){
@@ -1875,8 +1856,6 @@ int ioapic_resume(void)
}
}
spin_unlock_irqrestore(&ioapic_lock, flags);
-
- return 0;
}
/* --------------------------------------------------------------------------
diff -r f8187a343ad2 -r 9cad48ba52b0 xen/include/asm-x86/io_apic.h
--- a/xen/include/asm-x86/io_apic.h Fri Feb 20 17:02:36 2009 +0000
+++ b/xen/include/asm-x86/io_apic.h Sun Mar 01 14:17:08 2009 +0000
@@ -182,13 +182,13 @@ extern int timer_uses_ioapic_pin_0;
#endif /*CONFIG_ACPI_BOOT*/
extern int (*ioapic_renumber_irq)(int ioapic, int irq);
-extern int ioapic_suspend(void);
-extern int ioapic_resume(void);
+extern void ioapic_suspend(void);
+extern void ioapic_resume(void);
#else /* !CONFIG_X86_IO_APIC */
#define io_apic_assign_pci_irqs 0
-static inline int ioapic_suspend(void) {return 0};
-static inline int ioapic_resume(void) {return 0};
+static inline void ioapic_suspend(void) {}
+static inline void ioapic_resume(void) {}
#endif
extern int assign_irq_vector(int irq);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|