Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.5.75 /kernel/suspend.c

Filename:/kernel/suspend.c
Lines Added:30
Lines Deleted:13
Also changed in: (Previous) 2.5.74-bk7  2.5.74-bk6  2.5.70  2.5.69  2.5.68-bk12  2.5.68-bk11 
(Following)

Location
[  2.5.75
  [  kernel
     o  suspend.c

Patch

diff -Nru a/kernel/suspend.c b/kernel/suspend.c
--- a/kernel/suspend.c   Thu Jul 10 13:16:26 2003
+++ b/kernel/suspend.c   Thu Jul 10 13:16:26 2003
@@ -692,7 +692,6 @@
       printk(KERN_CRIT "%sCouldn't get enough free pages, on %d pages short\n",
              name_suspend, nr_needed_pages-nr_free_pages());
       root_swap = 0xFFFF;
-      spin_unlock_irq(&suspend_pagedir_lock);
       return 1;
    }
    si_swapinfo(&i);   /* FIXME: si_swapinfo(&i) returns all swap devices information.
@@ -700,7 +699,6 @@
    if (i.freeswap < nr_needed_pages)  {
       printk(KERN_CRIT "%sThere's not enough swap space available, on %ld pages short\n",
              name_suspend, nr_needed_pages-i.freeswap);
-      spin_unlock_irq(&suspend_pagedir_lock);
       return 1;
    }
 
@@ -710,7 +708,6 @@
       /* Shouldn't happen */
       printk(KERN_CRIT "%sCouldn't allocate enough pages\n",name_suspend);
       panic("Really should not happen");
-      spin_unlock_irq(&suspend_pagedir_lock);
       return 1;
    }
    nr_copy_pages_check = nr_copy_pages;
@@ -724,12 +721,9 @@
     * End of critical section. From now on, we can write to memory,
     * but we should not touch disk. This specially means we must _not_
     * touch swap space! Except we must write out our image of course.
-    *
-    * Following line enforces not writing to disk until we choose.
     */
 
    printk( "critical section/: done (%d pages copied)\n", nr_copy_pages );
-   spin_unlock_irq(&suspend_pagedir_lock);
    return 0;
 }
 
@@ -808,6 +802,24 @@
 #endif
 }
 
+/* do_magic() is implemented in arch/?/kernel/suspend_asm.S, and basically does:
+
+   if (!resume) {
+      do_magic_suspend_1();
+      save_processor_state();
+      SAVE_REGISTERS
+      do_magic_suspend_2();
+      return;
+   }
+   GO_TO_SWAPPER_PAGE_TABLES
+   do_magic_resume_1();
+   COPY_PAGES_BACK
+   RESTORE_REGISTERS
+   restore_processor_state();
+   do_magic_resume_2();
+
+ */
+
 void do_magic_suspend_1(void)
 {
    mb();
@@ -818,8 +830,13 @@
 
 void do_magic_suspend_2(void)
 {
+   int is_problem;
    read_swapfiles();
-   if (!suspend_prepare_image()) {   /* suspend_save_image realeses suspend_pagedir_lock */
+   is_problem = suspend_prepare_image();
+   spin_unlock_irq(&suspend_pagedir_lock);
+   if (!is_problem) {
+      kernel_fpu_end();   /* save_processor_state() does kernel_fpu_begin, and we need to revert it in order to pass in_atomic() ch+
ecks */
+      BUG_ON(in_atomic());
       suspend_save_image();
       suspend_power_down();   /* FIXME: if suspend_power_down is commented out, console is lost after few suspends ?! */
    }
@@ -1203,12 +1220,12 @@
 
 void software_resume(void)
 {
-#ifdef CONFIG_SMP
-   printk(KERN_WARNING "Software Suspend has a malfunctioning SMP support. Disabled :(\n");
-#else
+   if (num_online_cpus() > 1) {
+      printk(KERN_WARNING "Software Suspend has malfunctioning SMP support. Disabled :(\n");   
+      return;
+   }
    /* We enable the possibility of machine suspend */
    software_suspend_enabled = 1;
-#endif
    if (!resume_status)
       return;
 
@@ -1224,13 +1241,13 @@
    orig_loglevel = console_loglevel;
    console_loglevel = new_loglevel;
 
-   if(!resume_file[0] && resume_status == RESUME_SPECIFIED) {
+   if (!resume_file[0] && resume_status == RESUME_SPECIFIED) {
       printk( "suspension device unspecified\n" );
       return;
    }
 
    printk( "resuming from %s\n", resume_file);
-   if(read_suspend_image(resume_file, 0))
+   if (read_suspend_image(resume_file, 0))
       goto read_failure;
    do_magic(1);
    panic("This never returns");


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.