[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] x86, ioapic: Fix S3 suspend error.



# 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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.