Skip to contentSkip to conversation

fix device suspend/resume handling

pm Pavel Machek 2 participants 3 messages Oct 22, 2003 – Oct 28, 2003

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

Hi!

swsusp was completely wrong at device handling. Wrong calls with interrupts disabled, where they should be enabled etc. And it forgot to suspend devices before copying memory snapshot back [please check your pmdisk code, you are likely to do the same mistake].

Pavel

[Oops, this one:

- if(drivers_suspend()==0)
+ if ((res = device_suspend(4))==0)

probably will reject. Sorry about that, should be easy to fix up].

kernel/power/swsusp.c renamed from linux/kernel/power/swsusp.c +9 -30
@@ -491,33 +491,6 @@
 	printk("|\n");
 }
 
-/* Make disk drivers accept operations, again */
-static void drivers_unsuspend(void)
-{
-	device_resume();
-}
-
-/* Called from process context */
-static int drivers_suspend(void)
-{
-	return device_suspend(4);
-}
-
-#define RESUME_PHASE1 1 /* Called from interrupts disabled */
-#define RESUME_PHASE2 2 /* Called with interrupts enabled */
-#define RESUME_ALL_PHASES (RESUME_PHASE1 | RESUME_PHASE2)
-static void drivers_resume(int flags)
-{
-	if (flags & RESUME_PHASE1) {
-		device_resume();
-	}
-  	if (flags & RESUME_PHASE2) {
-#ifdef SUSPEND_CONSOLE
-		update_screen(fg_console);	/* Hmm, is this the problem? */
-#endif
-	}
-}
-
 static int suspend_prepare_image(void)
 {
 	struct sysinfo i;
@@ -572,7 +545,7 @@
 
 static void suspend_save_image(void)
 {
-	drivers_unsuspend();
+	device_resume();
 
 	lock_swapdevices();
 	write_suspend_image();
@@ -618,6 +591,7 @@
 	mb();
 	spin_lock_irq(&suspend_pagedir_lock);	/* Done to disable interrupts */ 
 
+	device_power_down(4);
 	PRINTK( "Waiting for DMAs to settle down...\n");
 	mdelay(1000);	/* We do not want some readahead with DMA to corrupt our memory, right?
 			   Do it with disabled interrupts for best effect. That way, if some
@@ -633,8 +607,10 @@
 
 	PRINTK( "Freeing prev allocated pagedir\n" );
 	free_suspend_pagedir((unsigned long) pagedir_save);
+	device_power_up();
 	spin_unlock_irq(&suspend_pagedir_lock);
-	drivers_resume(RESUME_ALL_PHASES);
+	device_resume();
+	update_screen(fg_console);	/* Hmm, is this the problem? */
 
 	PRINTK( "Fixing swap signatures... " );
 	mark_swapfiles(((swp_entry_t) {0}), MARK_SWAP_RESUME);
@@ -675,7 +651,9 @@
 {
 	int is_problem;
 	read_swapfiles();
+	device_power_down(4);
 	is_problem = suspend_prepare_image();
+	device_power_up();
 	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() checks */
@@ -719,7 +708,7 @@
 		blk_run_queues();
 
 		/* Save state of all device drivers, and stop them. */		   
-		if(drivers_suspend()==0)
+		if ((res = device_suspend(4))==0)
 			/* If stopping device drivers worked, we proceed basically into
 			 * suspend_save_image.
 			 *
@@ -1094,6 +1071,7 @@
 	printk( "resuming from %s\n", resume_file);
 	if (read_suspend_image(resume_file, 0))
 		goto read_failure;
+	device_suspend(4);
 	do_magic(1);
 	panic("This never returns");
 

Pavel

Signature · 2 lines
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
#1 lore raw
Quoted 7 lines

[Oops, this one:

kernel/power/swsusp.c renamed from linux/kernel/power/swsusp.c +1 -1
-               if(drivers_suspend()==0)
+               if ((res = device_suspend(4))==0)

probably will reject. Sorry about that, should be easy to fix up].

Please send an applicable patch.

Thanks,

Pat

#2 lore raw

Hi!

Quoted 8 lines
Quoted 6 lines

[Oops, this one:

kernel/power/swsusp.c renamed from linux/kernel/power/swsusp.c +1 -1
-               if(drivers_suspend()==0)
+               if ((res = device_suspend(4))==0)

probably will reject. Sorry about that, should be easy to fix up].

Please send an applicable patch.

Can you send me patch or patch * to diff against? I do not think I can reproduce your tree just now...
Pavel

Signature · 2 lines
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]