Re: New Software Suspend Patch for testing.

From: Pavel Machek (pavel@ucw.cz)
Date: Fri Apr 04 2003 - 08:30:37 EST


Hi!

> Hopefully I'll soon find time to start bombarding Pavel, Patrick and
> Linus with incremental patches for merging :>. In the meantime, please
> give it a go.

Okay, lets take a look.

diff -ruN linux-2.5.66-original/arch/i386/kernel/cpu/mtrr/main.c linux-2.5.66-04/arch/i386/kernel/cpu/mtrr/main.c
--- linux-2.5.66-original/arch/i386/kernel/cpu/mtrr/main.c 2003-01-15 17:00:38.000000000 +1300
+++ linux-2.5.66-04/arch/i386/kernel/cpu/mtrr/main.c 2003-03-26 09:00:29.000000000 +1200
@@ -35,6 +35,7 @@
 #include <linux/init.h>
 #include <linux/pci.h>
 #include <linux/smp.h>
+#include <linux/suspend.h>
 
 #include <asm/mtrr.h>
 
@@ -644,6 +645,65 @@
     "write-protect", /* 5 */
     "write-back", /* 6 */
 };
-
+
+#ifdef SOFTWARE_SUSPEND_MTRR
+struct mtrr_suspend_state
+{
+ mtrr_type ltype;
+ unsigned long lbase;
+ unsigned int lsize;
+};
...

Please convert this to driver model and submit to mtrr maintainer.

diff -ruN linux-2.5.66-original/drivers/base/power.c linux-2.5.66-04/drivers/base/power.c
--- linux-2.5.66-original/drivers/base/power.c 2003-01-15 17:01:06.000000000 +1300
+++ linux-2.5.66-04/drivers/base/power.c 2003-04-04 20:51:40.000000000 +1200
@@ -35,8 +35,6 @@
         struct list_head * node;
         int error = 0;
 
- printk(KERN_EMERG "Suspending devices\n");
-
         down_write(&devices_subsys.rwsem);
         list_for_each(node,&devices_subsys.kset.list) {
                 struct device * dev = to_dev(node);
@@ -73,7 +71,7 @@
         }
         up_write(&devices_subsys.rwsem);
 
- printk(KERN_EMERG "Devices Resumed\n");
+ printk(KERN_INFO "Devices Resumed\n");
 }
 
 /**
@@ -83,7 +81,7 @@
 {
         struct list_head * entry;
         
- printk(KERN_EMERG "Shutting down devices\n");
+ printk(KERN_INFO "Shutting down devices\n");
 
         down_write(&devices_subsys.rwsem);
         list_for_each(entry,&devices_subsys.kset.list) {

I guess that submitting this as trivial is okay.

diff -ruN linux-2.5.66-original/drivers/char/vt.c linux-2.5.66-04/drivers/char/vt.c
--- linux-2.5.66-original/drivers/char/vt.c 2003-03-26 08:56:47.000000000 +1200
+++ linux-2.5.66-04/drivers/char/vt.c 2003-03-26 09:00:29.000000000 +1200
@@ -149,13 +149,13 @@
 static void vc_init(unsigned int console, unsigned int rows,
                     unsigned int cols, int do_clear);
 static void blank_screen(unsigned long dummy);
-static void gotoxy(int currcons, int new_x, int new_y);
+void gotoxy(int currcons, int new_x, int new_y);
 static void save_cur(int currcons);
-static void reset_terminal(int currcons, int do_clear);
+void reset_terminal(int currcons, int do_clear);
 static void con_flush_chars(struct tty_struct *tty);
 static void set_vesa_blanking(unsigned long arg);
 static void set_cursor(int currcons);
-static void hide_cursor(int currcons);
+void hide_cursor(int currcons);
 static void unblank_screen_t(unsigned long dummy);
 static void console_callback(void *ignored);
 static void __init con_init_devfs (void);

This is ugly as night. Is not there any public function (sys_write?)
you could use instead?

diff -ruN linux-2.5.66-original/drivers/ide/ide-disk.c linux-2.5.66-04/drivers/ide/ide-disk.c
--- linux-2.5.66-original/drivers/ide/ide-disk.c 2003-03-26 08:56:49.000000000 +1200
+++ linux-2.5.66-04/drivers/ide/ide-disk.c 2003-04-04 20:22:09.000000000 +1200
@@ -1515,8 +1515,6 @@
 {
         ide_drive_t *drive = dev->driver_data;
 
- printk("Suspending device %p\n", dev->driver_data);
-
         /* I hope that every freeze operation from the upper levels have
          * already been done...
          */
@@ -1525,7 +1523,6 @@
                 return 0;
 
         /* set the drive to standby */
- printk(KERN_INFO "suspending: %s ", drive->name);
         do_idedisk_standby(drive);
         drive->blocked = 1;
 
@@ -1539,8 +1536,8 @@
 
         if (level != RESUME_RESTORE_STATE)
                 return 0;
- BUG_ON(!drive->blocked);
- drive->blocked = 0;
+ if (drive->blocked)
+ drive->blocked--;
         return 0;
 }
 

Please submitt this to alan, as soon as possible.

@@ -1804,7 +1801,8 @@
         if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
                 printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n",
                         drive->name, drive->head);
- if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache)
+ if (((drive->id->cfs_enable_2 & 0x3000) && drive->wcache) ||
+ ((drive->id->command_set_1 & 0x20) && drive->id->cfs_enable_1 & 0x20))
                         if (do_idedisk_flushcache(drive))
                                 printk (KERN_INFO "%s: Write Cache FAILED Flushing!\n",
                                         drive->name);

Is this swsusp related?

diff -ruN linux-2.5.66-original/include/linux/pagemap.h linux-2.5.66-04/include/linux/pagemap.h
--- linux-2.5.66-original/include/linux/pagemap.h 2003-03-26 08:57:06.000000000 +1200
+++ linux-2.5.66-04/include/linux/pagemap.h 2003-03-26 09:00:29.000000000 +1200
@@ -8,6 +8,9 @@
 #include <linux/fs.h>
 #include <linux/list.h>
 #include <linux/highmem.h>
+#ifdef CONFIG_SOFTWARE_SUSPEND
+#include <linux/suspend.h>
+#endif
 #include <asm/uaccess.h>
 
 /*

Do not use #ifdefs around includes.

@@ -123,6 +126,8 @@
         page->mapping = mapping;
         page->index = index;
 
+ if (suspend_task)
+ last_suspend_cache_page = page;
         mapping->nrpages++;
         pagecache_acct(1);
 }
diff -ruN linux-2.5.66-original/include/linux/suspend-debug.h linux-2.5.66-04/include/linux/suspend-debug.h
--- linux-2.5.66-original/include/linux/suspend-debug.h 1970-01-01 12:00:00.000000000 +1200
+++ linux-2.5.66-04/include/linux/suspend-debug.h 2003-04-04 19:37:44.000000000 +1200
@@ -0,0 +1,61 @@
+
+#ifndef _LINUX_SWSUSP_DEBUG_H
+#define _LINUX_SWSUSP_DEBUG_H
+
+#include <linux/suspend.h>
+
+#define name_suspend "Suspend Machine: "
+#define name_resume "Resume Machine: "
+#define swsusp_version "beta 19-20"
+#define name_swsusp "Swsusp " swsusp_version ": "
+#define console_suspend "S U S P E N D T O D I S K"
+#define console_resume "R E S U M E F R O M D I S K"

This is ugly. Are you trying to make it hard to read on purpose?

diff -ruN linux-2.5.66-original/include/linux/sysctl.h linux-2.5.66-04/include/linux/sysctl.h
--- linux-2.5.66-original/include/linux/sysctl.h 2003-03-01 15:10:38.000000000 +1300
+++ linux-2.5.66-04/include/linux/sysctl.h 2003-03-26 09:00:29.000000000 +1200
@@ -129,6 +129,7 @@
         KERN_CADPID=54, /* int: PID of the process to notify on CAD */
         KERN_PIDMAX=55, /* int: PID # limit */
           KERN_CORE_PATTERN=56, /* string: pattern for core-file names */
+ KERN_SWSUSP=57, /* struct: interface to configure & activate software suspension */
 };
 
 

Is sysctl being used besides debugging?
 
 unsigned char software_suspend_enabled = 0;
+unsigned int suspend_task = 0;
+/*
+ * Poll the swsusp state every second
+ */
+#define SWSUSP_CHECK_TIMEOUT (HZ)

What is this?

 /*
  * XXX: We try to keep some more pages free so that I/O operations succeed
  * without paging. Might this be more?
  */
-#define PAGES_FOR_IO 512
+#define PAGES_FOR_IO 512
+
+#ifdef DEBUG_DEFAULT
+int currentstage = 0;
+int swsusp_state[5] = {0, /* when set to 1 swsusp_mainloop activates software_suspend (2.4 only)
+ bit 0: off = normal state, on = suspend required
+ bit 1: aborting suspend
+ */

Please kill 2.4 stuff from 2.5 patch.

- if (mode == MARK_SWAP_RESUME) {
- if (!memcmp("S1",cur->swh.magic.magic,2))
- memcpy(cur->swh.magic.magic,"SWAP-SPACE",10);
- else if (!memcmp("S2",cur->swh.magic.magic,2))
- memcpy(cur->swh.magic.magic,"SWAPSPACE2",10);
- else printk("%sUnable to find suspended-data signature (%.10s - misspelled?\n",
- name_resume, cur->swh.magic.magic);
- } else {
- if ((!memcmp("SWAP-SPACE",cur->swh.magic.magic,10)))
- memcpy(cur->swh.magic.magic,"S1SUSP....",10);
- else if ((!memcmp("SWAPSPACE2",cur->swh.magic.magic,10)))
- memcpy(cur->swh.magic.magic,"S2SUSP....",10);
- else panic("\nSwapspace is not swapspace (%.10s)\n", cur->swh.magic.magic);
- cur->link.next = prev; /* prev is the first/last swap page of the resume area */
- /* link.next lies *no more* in last 4/8 bytes of magic */
+ switch(mode) {
+ case MARK_SWAP_RESUME:
+ if (!memcmp("1R",cur.pointer->swh.magic.magic,2))
+ memcpy(cur.pointer->swh.magic.magic,"SWAP-SPACE",10);
+ else if (!memcmp("2R",cur.pointer->swh.magic.magic,2))
+ memcpy(cur.pointer->swh.magic.magic,"SWAPSPACE2",10);
+ else printk(name_resume "Unable to find suspended-data signature (%.10s - misspelled?\n",
+ cur.pointer->swh.magic.magic);
+ break;

I guess this is nicer than previous code, good.

Snip. Sorry, have to go.
                                                                        Pavel

-- 
When do you have heart between your knees?
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Apr 07 2003 - 22:00:22 EST