* swsusp updates
@ 2003-07-26 20:45 Pavel Machek
2003-07-26 21:05 ` Patrick Mochel
0 siblings, 1 reply; 15+ messages in thread
From: Pavel Machek @ 2003-07-26 20:45 UTC (permalink / raw)
To: Linus Torvalds, kernel list
Hi!
This updates swsusp: CONFIG_SOFTWARE_SUSPEND and CONFIG_ACPI_SLEEP are
separated (it was getting users *badly* confused), remove too noisy
printk's, correctly restore console after S3, fixes suspend on
machines using yenta_socket.c, fixes some comments, cleans up
"interesting" macro mess in suspend.c, no longer eats filesystems when
process is ^Z-ed before suspend. Please apply,
Pavel
Index: linux/drivers/acpi/sleep/main.c
===================================================================
--- linux.orig/drivers/acpi/sleep/main.c 2003-07-22 13:39:42.000000000 +0200
+++ linux/drivers/acpi/sleep/main.c 2003-07-22 12:53:27.000000000 +0200
@@ -69,10 +81,6 @@
* First, we call to the device driver layer to save device state.
* Once we have that, we save whatevery processor and kernel state we
* need to memory.
- * If we're entering S4, we then write the memory image to disk.
- *
- * Only then is it safe for us to power down devices, since we may need
- * the disks and upstream buses to write to.
*/
acpi_status
acpi_system_save_state(
@@ -197,7 +205,7 @@
break;
}
local_irq_restore(flags);
- printk(KERN_CRIT "Back to C!\n");
+ printk(KERN_DEBUG "Back to C!\n");
return status;
}
@@ -226,6 +234,7 @@
if (state == ACPI_STATE_S4 && !acpi_gbl_FACS->S4bios_f)
return AE_ERROR;
+ prepare_suspend_console();
/*
* TBD: S1 can be done without device_suspend. Make a CONFIG_XX
* to handle however when S1 failed without device_suspend.
@@ -270,6 +279,7 @@
/* reset firmware waking vector */
acpi_set_firmware_waking_vector((acpi_physical_address) 0);
thaw_processes();
+ restore_console();
return status;
}
Index: linux/arch/i386/kernel/Makefile
===================================================================
--- linux.orig/arch/i386/kernel/Makefile 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/Makefile 2003-07-17 22:22:58.000000000 +0200
@@ -24,7 +24,8 @@
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o suspend_asm.o
+obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
+obj-$(CONFIG_PM) += suspend_asm.o
obj-$(CONFIG_X86_NUMAQ) += numaq.o
obj-$(CONFIG_X86_SUMMIT) += summit.o
obj-$(CONFIG_EDD) += edd.o
Index: linux/arch/i386/kernel/suspend_asm.S
===================================================================
--- linux.orig/arch/i386/kernel/suspend_asm.S 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/suspend_asm.S 2003-07-20 15:02:12.000000000 +0200
@@ -32,6 +32,7 @@
saved_context_eflags:
.long 0
+#ifdef CONFIG_SOFTWARE_SUSPEND
.text
ENTRY(do_magic)
@@ -117,4 +118,4 @@
loop2:
.quad 0
.previous
-
\ No newline at end of file
+#endif
Index: linux/arch/i386/kernel/sysenter.c
===================================================================
--- linux.orig/arch/i386/kernel/sysenter.c 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/sysenter.c 2003-07-17 22:22:58.000000000 +0200
@@ -31,8 +31,6 @@
wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
wrmsr(MSR_IA32_SYSENTER_ESP, tss->esp1, 0);
wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long) sysenter_entry, 0);
-
- printk("Enabling SEP on CPU %d\n", cpu);
put_cpu();
}
Index: linux/drivers/acpi/Kconfig
===================================================================
--- linux.orig/drivers/acpi/Kconfig 2003-07-22 13:39:42.000000000 +0200
+++ linux/drivers/acpi/Kconfig 2003-07-17 22:22:58.000000000 +0200
@@ -58,8 +58,8 @@
default y
config ACPI_SLEEP
- bool "Sleep States"
- depends on X86 && ACPI && !ACPI_HT_ONLY && SOFTWARE_SUSPEND
+ bool "Sleep States (EXPERIMENTAL)"
+ depends on X86 && ACPI && !ACPI_HT_ONLY && EXPERIMENTAL
---help---
This option adds support for ACPI suspend states.
Index: linux/drivers/base/power.c
===================================================================
--- linux.orig/drivers/base/power.c 2003-07-22 13:39:42.000000000 +0200
+++ linux/drivers/base/power.c 2003-07-17 22:22:58.000000000 +0200
@@ -52,8 +52,6 @@
struct device * dev;
int error = 0;
- printk(KERN_EMERG "Suspending devices\n");
-
down_write(&devices_subsys.rwsem);
list_for_each_entry_reverse(dev,&devices_subsys.kset.list,kobj.entry) {
if (dev->driver && dev->driver->suspend) {
@@ -114,8 +112,6 @@
}
}
up_write(&devices_subsys.rwsem);
-
- printk(KERN_EMERG "Devices Resumed\n");
}
/**
@@ -125,8 +121,6 @@
{
struct device * dev;
- printk(KERN_EMERG "Shutting down devices\n");
-
down_write(&devices_subsys.rwsem);
list_for_each_entry_reverse(dev,&devices_subsys.kset.list,kobj.entry) {
pr_debug("shutting down %s: ",dev->name);
Index: linux/drivers/pcmcia/yenta_socket.c
===================================================================
--- linux.orig/drivers/pcmcia/yenta_socket.c 2003-07-22 13:39:42.000000000 +0200
+++ linux/drivers/pcmcia/yenta_socket.c 2003-07-17 22:22:58.000000000 +0200
@@ -899,7 +899,10 @@
static int yenta_dev_suspend (struct pci_dev *dev, u32 state)
{
- return pcmcia_socket_dev_suspend(&dev->dev, state, 0);
+ /* FIXME: We should really let devices to act on *all* levels :-(.
+ If you put something else than SUSPEND_SAVE_STATE,
+ pcmcia_socket_dev_suspend() will simply do nothing due to its check. */
+ return pcmcia_socket_dev_suspend(&dev->dev, state, SUSPEND_SAVE_STATE);
}
Index: linux/include/linux/reboot.h
===================================================================
--- linux.orig/include/linux/reboot.h 2003-07-22 13:39:42.000000000 +0200
+++ linux/include/linux/reboot.h 2003-07-17 22:22:58.000000000 +0200
@@ -21,7 +21,7 @@
* CAD_OFF Ctrl-Alt-Del sequence sends SIGINT to init task.
* POWER_OFF Stop OS and remove all power from system, if possible.
* RESTART2 Restart system using given command string.
- * SW_SUSPEND Suspend system using Software Suspend if compiled in
+ * SW_SUSPEND Suspend system using software suspend if compiled in.
*/
#define LINUX_REBOOT_CMD_RESTART 0x01234567
Index: linux/include/linux/suspend.h
===================================================================
--- linux.orig/include/linux/suspend.h 2003-07-22 13:39:42.000000000 +0200
+++ linux/include/linux/suspend.h 2003-07-22 12:54:08.000000000 +0200
@@ -55,10 +55,6 @@
extern int register_suspend_notifier(struct notifier_block *);
extern int unregister_suspend_notifier(struct notifier_block *);
-extern void refrigerator(unsigned long);
-
-extern int freeze_processes(void);
-extern void thaw_processes(void);
extern unsigned int nr_copy_pages __nosavedata;
extern suspend_pagedir_t *pagedir_nosave __nosavedata;
@@ -76,15 +72,23 @@
extern void do_suspend_lowlevel_s4bios(int resume);
#else
-static inline void software_suspend(void)
-{
-}
+static inline void software_suspend(void) { }
#define software_resume() do { } while(0)
#define register_suspend_notifier(a) do { } while(0)
#define unregister_suspend_notifier(a) do { } while(0)
+#endif
+
+#ifdef CONFIG_PM
+extern void refrigerator(unsigned long);
+extern int freeze_processes(void);
+extern void thaw_processes(void);
+#else
#define refrigerator(a) do { BUG(); } while(0)
#define freeze_processes() do { panic("You need CONFIG_SOFTWARE_SUSPEND to do sleeps."); } while(0)
#define thaw_processes() do { } while(0)
#endif
+extern int prepare_suspend_console(void);
+extern void restore_console(void);
+
#endif /* _LINUX_SWSUSP_H */
Index: linux/kernel/Makefile
===================================================================
--- linux.orig/kernel/Makefile 2003-07-22 13:39:43.000000000 +0200
+++ linux/kernel/Makefile 2003-07-17 22:22:58.000000000 +0200
@@ -17,7 +17,7 @@
obj-$(CONFIG_PM) += pm.o
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
+obj-$(CONFIG_PM) += suspend.o
obj-$(CONFIG_COMPAT) += compat.o
ifneq ($(CONFIG_IA64),y)
Index: linux/kernel/suspend.c
===================================================================
--- linux.orig/kernel/suspend.c 2003-07-22 13:39:43.000000000 +0200
+++ linux/kernel/suspend.c 2003-07-22 13:46:26.000000000 +0200
@@ -5,7 +5,7 @@
* machine suspend feature using pretty near only high-level routines
*
* Copyright (C) 1998-2001 Gabor Kuti <seasons@fornax.hu>
- * Copyright (C) 1998,2001,2002 Pavel Machek <pavel@suse.cz>
+ * Copyright (C) 1998,2001-2003 Pavel Machek <pavel@suse.cz>
*
* I'd like to thank the following people for their work:
*
@@ -65,6 +65,7 @@
#include <asm/pgtable.h>
#include <asm/io.h>
+#ifdef CONFIG_SOFTWARE_SUSPEND
extern long sys_sync(void);
unsigned char software_suspend_enabled = 0;
@@ -78,7 +79,6 @@
#undef SUSPEND_CONSOLE
#endif
-#define TIMEOUT (6 * HZ) /* Timeout for stopping processes */
#define __ADDRESS(x) ((unsigned long) phys_to_virt(x))
#define ADDRESS(x) __ADDRESS((x) << PAGE_SHIFT)
#define ADDRESS2(x) __ADDRESS(__pa(x)) /* Needed for x86-64 where some pages are in memory twice */
@@ -139,39 +139,45 @@
static const char name_suspend[] = "Suspend Machine: ";
static const char name_resume[] = "Resume Machine: ";
+#endif
/*
* Debug
*/
-#define DEBUG_DEFAULT
-#undef DEBUG_PROCESS
+#undef DEBUG_DEFAULT
#undef DEBUG_SLOW
-#define TEST_SWSUSP 0 /* Set to 1 to reboot instead of halt machine after suspension */
+#define TEST_SWSUSP 0 /* Set to 1 to reboot instead of halt machine after suspension */
#ifdef DEBUG_DEFAULT
-# define PRINTK(f, a...) printk(f, ## a)
+# define PRINTK(f, a...) printk(f, ## a)
#else
-# define PRINTK(f, a...)
+# define PRINTK(f, a...) do {} while (0)
#endif
#ifdef DEBUG_SLOW
#define MDELAY(a) mdelay(a)
#else
-#define MDELAY(a)
+#define MDELAY(a) do {} while (0)
#endif
/*
* Refrigerator and related stuff
*/
-#define INTERESTING(p) \
- /* We don't want to touch kernel_threads..*/ \
- if (p->flags & PF_IOTHREAD) \
- continue; \
- if (p == current) \
- continue; \
- if (p->state == TASK_ZOMBIE) \
- continue;
+/* 0 = Ignore this process when freezing/thawing, 1 = freeze/thaw this process */
+static inline int interesting_process(struct task_struct *p)
+{
+ if (p->flags & PF_IOTHREAD)
+ return 0;
+ if (p == current)
+ return 0;
+ if ((p->state == TASK_ZOMBIE) || (p->state == TASK_DEAD))
+ return 0;
+
+ return 1;
+}
+
+#define TIMEOUT (6 * HZ) /* Timeout for stopping processes */
/* Refrigerator is place where frozen processes are stored :-). */
void refrigerator(unsigned long flag)
@@ -212,9 +218,12 @@
read_lock(&tasklist_lock);
do_each_thread(g, p) {
unsigned long flags;
- INTERESTING(p);
+ if (!interesting_process(p))
+ continue;
if (p->flags & PF_FROZEN)
continue;
+ if (p->state == TASK_STOPPED)
+ continue;
/* FIXME: smp problem here: we may not access other process' flags
without locking */
@@ -245,19 +254,56 @@
printk( "Restarting tasks..." );
read_lock(&tasklist_lock);
do_each_thread(g, p) {
- INTERESTING(p);
-
- if (p->flags & PF_FROZEN) p->flags &= ~PF_FROZEN;
- else
- printk(KERN_INFO " Strange, %s not stopped\n", p->comm );
- wake_up_process(p);
+ if (!interesting_process(p))
+ continue;
+ if (p->flags & PF_FROZEN) {
+ p->flags &= ~PF_FROZEN;
+ wake_up_process(p);
+ } else
+ PRINTK(KERN_INFO " Strange, %s not frozen\n", p->comm );
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
+ schedule();
printk( " done\n" );
MDELAY(500);
}
+int prepare_suspend_console(void)
+{
+ orig_loglevel = console_loglevel;
+ console_loglevel = new_loglevel;
+
+#ifdef CONFIG_VT
+ orig_fgconsole = fg_console;
+#ifdef SUSPEND_CONSOLE
+ if(vc_allocate(SUSPEND_CONSOLE))
+ /* we can't have a free VC for now. Too bad,
+ * we don't want to mess the screen for now. */
+ return 1;
+
+ set_console (SUSPEND_CONSOLE);
+ if (vt_waitactive(SUSPEND_CONSOLE)) {
+ printk(KERN_ERR "Bummer. Can't switch VCs.\n");
+ return 1;
+ }
+ orig_kmsg = kmsg_redirect;
+ kmsg_redirect = SUSPEND_CONSOLE;
+#endif
+#endif
+ return 0;
+}
+
+void restore_console(void)
+{
+ console_loglevel = orig_loglevel;
+#ifdef SUSPEND_CONSOLE
+ set_console (orig_fgconsole);
+#endif
+ return;
+}
+
+#ifdef CONFIG_SOFTWARE_SUSPEND
/*
* Saving part...
*/
@@ -283,17 +329,6 @@
return 0;
}
-/*
- * This is our sync function. With this solution we probably won't sleep
- * but that should not be a problem since tasks are stopped..
- */
-
-static inline void do_suspend_sync(void)
-{
- blk_run_queues();
-#warning This might be broken. We need to somehow wait for data to reach the disk
-}
-
/* We memorize in swapfile_used what swap devices are used for suspension */
#define SWAPFILE_UNUSED 0
#define SWAPFILE_SUSPEND 1 /* This is the suspending device */
@@ -561,7 +596,6 @@
free_suspend_pagedir((unsigned long) pagedir);
return NULL;
}
- printk(".");
SetPageNosave(virt_to_page(p->address));
p->orig_address = 0;
p++;
@@ -569,39 +603,6 @@
return pagedir;
}
-static int prepare_suspend_console(void)
-{
- orig_loglevel = console_loglevel;
- console_loglevel = new_loglevel;
-
-#ifdef CONFIG_VT
- orig_fgconsole = fg_console;
-#ifdef SUSPEND_CONSOLE
- if(vc_allocate(SUSPEND_CONSOLE))
- /* we can't have a free VC for now. Too bad,
- * we don't want to mess the screen for now. */
- return 1;
-
- set_console (SUSPEND_CONSOLE);
- if(vt_waitactive(SUSPEND_CONSOLE)) {
- PRINTK("Bummer. Can't switch VCs.");
- return 1;
- }
- orig_kmsg = kmsg_redirect;
- kmsg_redirect = SUSPEND_CONSOLE;
-#endif
-#endif
- return 0;
-}
-
-static void restore_console(void)
-{
- console_loglevel = orig_loglevel;
-#ifdef SUSPEND_CONSOLE
- set_console (orig_fgconsole);
-#endif
- return;
-}
static int prepare_suspend_processes(void)
{
@@ -852,7 +853,6 @@
free_pages((unsigned long) pagedir_nosave, pagedir_order);
spin_unlock_irq(&suspend_pagedir_lock);
mark_swapfiles(((swp_entry_t) {0}), MARK_SWAP_RESUME);
- PRINTK(KERN_WARNING "%sLeaving do_magic_suspend_2...\n", name_suspend);
}
static void do_software_suspend(void)
@@ -861,20 +861,13 @@
if (prepare_suspend_console())
printk( "%sCan't allocate a console... proceeding\n", name_suspend);
if (!prepare_suspend_processes()) {
-
/* At this point, all user processes and "dangerous"
kernel threads are stopped. Free some memory, as we
need half of memory free. */
-
free_some_memory();
- /* No need to invalidate any vfsmnt list -- they will be valid after resume, anyway.
- *
- * We sync here -- so you have consistent filesystem state when things go wrong.
- * -- so that noone writes to disk after we do atomic copy of data.
- */
- PRINTK("Syncing disks before copy\n");
- do_suspend_sync();
+ /* No need to invalidate any vfsmnt list -- they will be valid after resume, anyway. */
+ blk_run_queues();
/* Save state of all device drivers, and stop them. */
if(drivers_suspend()==0)
@@ -888,12 +881,11 @@
* using normal kernel mechanism.
*/
do_magic(0);
- PRINTK("Restarting processes...\n");
thaw_processes();
}
software_suspend_enabled = 1;
MDELAY(1000);
- restore_console ();
+ restore_console();
}
/*
@@ -906,7 +898,7 @@
return;
software_suspend_enabled = 0;
- BUG_ON(in_interrupt());
+ BUG_ON(in_atomic());
do_software_suspend();
}
@@ -1279,4 +1271,5 @@
EXPORT_SYMBOL(software_suspend);
EXPORT_SYMBOL(software_suspend_enabled);
+#endif
EXPORT_SYMBOL(refrigerator);
Index: linux/arch/i386/kernel/acpi/wakeup.S
===================================================================
--- linux.orig/arch/i386/kernel/acpi/wakeup.S 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/acpi/wakeup.S 2003-07-22 13:26:01.000000000 +0200
@@ -43,6 +43,11 @@
testl $1, video_flags - wakeup_code
jz 1f
+ /* It is miracle that this works:
+ * PCI may or may not be initialized at this point
+ * I'm told we should pass device ID to video bios
+ However it works on some real machines...
+ */
lcall $0xc000,$3
movw %cs, %ax
movw %ax, %ds # Bios might have played with that
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-07-26 21:05 ` Patrick Mochel
@ 2003-07-26 21:03 ` Pavel Machek
2003-07-26 21:09 ` Patrick Mochel
0 siblings, 1 reply; 15+ messages in thread
From: Pavel Machek @ 2003-07-26 21:03 UTC (permalink / raw)
To: Patrick Mochel; +Cc: Pavel Machek, Linus Torvalds, kernel list
Hi!
> > This updates swsusp: CONFIG_SOFTWARE_SUSPEND and CONFIG_ACPI_SLEEP are
> > separated (it was getting users *badly* confused), remove too noisy
> > printk's, correctly restore console after S3, fixes suspend on
> > machines using yenta_socket.c, fixes some comments, cleans up
> > "interesting" macro mess in suspend.c, no longer eats filesystems when
> > process is ^Z-ed before suspend. Please apply,
>
> Could you please split these patches up into different functional patches,
> and submit them to the appropriate maintainers?
SOFTWARE SUSPEND:
P: Pavel Machek
M: pavel@suse.cz
M: pavel@ucw.cz
L: http://lister.fornax.hu/mailman/listinfo/swsusp
W: http://swsusp.sf.net/
S: Maintained
Other parts are trivial (ACPI and yenta), and pretty obvious.
Pavel
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-07-26 20:45 swsusp updates Pavel Machek
@ 2003-07-26 21:05 ` Patrick Mochel
2003-07-26 21:03 ` Pavel Machek
0 siblings, 1 reply; 15+ messages in thread
From: Patrick Mochel @ 2003-07-26 21:05 UTC (permalink / raw)
To: Pavel Machek; +Cc: Linus Torvalds, kernel list
> This updates swsusp: CONFIG_SOFTWARE_SUSPEND and CONFIG_ACPI_SLEEP are
> separated (it was getting users *badly* confused), remove too noisy
> printk's, correctly restore console after S3, fixes suspend on
> machines using yenta_socket.c, fixes some comments, cleans up
> "interesting" macro mess in suspend.c, no longer eats filesystems when
> process is ^Z-ed before suspend. Please apply,
Could you please split these patches up into different functional patches,
and submit them to the appropriate maintainers?
-pat
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-07-26 21:03 ` Pavel Machek
@ 2003-07-26 21:09 ` Patrick Mochel
2003-07-26 21:13 ` Pavel Machek
0 siblings, 1 reply; 15+ messages in thread
From: Patrick Mochel @ 2003-07-26 21:09 UTC (permalink / raw)
To: Pavel Machek; +Cc: Linus Torvalds, kernel list
> > > This updates swsusp: CONFIG_SOFTWARE_SUSPEND and CONFIG_ACPI_SLEEP are
> > > separated (it was getting users *badly* confused), remove too noisy
> > > printk's, correctly restore console after S3, fixes suspend on
> > > machines using yenta_socket.c, fixes some comments, cleans up
> > > "interesting" macro mess in suspend.c, no longer eats filesystems when
> > > process is ^Z-ed before suspend. Please apply,
> >
> > Could you please split these patches up into different functional patches,
> > and submit them to the appropriate maintainers?
>
> SOFTWARE SUSPEND:
> P: Pavel Machek
> M: pavel@suse.cz
> M: pavel@ucw.cz
> L: http://lister.fornax.hu/mailman/listinfo/swsusp
> W: http://swsusp.sf.net/
> S: Maintained
>
> Other parts are trivial (ACPI and yenta), and pretty obvious.
Could you please split these patches up into different functional patches
and submit the relevant bits to the appropriate maintainers?
Thanks,
-pat
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-07-26 21:09 ` Patrick Mochel
@ 2003-07-26 21:13 ` Pavel Machek
2003-07-26 21:31 ` Patrick Mochel
0 siblings, 1 reply; 15+ messages in thread
From: Pavel Machek @ 2003-07-26 21:13 UTC (permalink / raw)
To: Patrick Mochel; +Cc: Linus Torvalds, kernel list
Hi!
> > > > This updates swsusp: CONFIG_SOFTWARE_SUSPEND and CONFIG_ACPI_SLEEP are
> > > > separated (it was getting users *badly* confused), remove too noisy
> > > > printk's, correctly restore console after S3, fixes suspend on
> > > > machines using yenta_socket.c, fixes some comments, cleans up
> > > > "interesting" macro mess in suspend.c, no longer eats filesystems when
> > > > process is ^Z-ed before suspend. Please apply,
> > >
> > > Could you please split these patches up into different functional patches,
> > > and submit them to the appropriate maintainers?
> >
> > SOFTWARE SUSPEND:
> > P: Pavel Machek
> > M: pavel@suse.cz
> > M: pavel@ucw.cz
> > L: http://lister.fornax.hu/mailman/listinfo/swsusp
> > W: http://swsusp.sf.net/
> > S: Maintained
> >
> > Other parts are trivial (ACPI and yenta), and pretty obvious.
>
> Could you please split these patches up into different functional patches
> and submit the relevant bits to the appropriate maintainers?
Okay, I killed few trivial hunks, will submit them through trivial
patch monkey. Are you happy now, patrick?
Pavel
Index: linux/arch/i386/kernel/Makefile
===================================================================
--- linux.orig/arch/i386/kernel/Makefile 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/Makefile 2003-07-17 22:22:58.000000000 +0200
@@ -24,7 +24,8 @@
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o suspend_asm.o
+obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
+obj-$(CONFIG_PM) += suspend_asm.o
obj-$(CONFIG_X86_NUMAQ) += numaq.o
obj-$(CONFIG_X86_SUMMIT) += summit.o
obj-$(CONFIG_EDD) += edd.o
Index: linux/arch/i386/kernel/suspend_asm.S
===================================================================
--- linux.orig/arch/i386/kernel/suspend_asm.S 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/suspend_asm.S 2003-07-20 15:02:12.000000000 +0200
@@ -32,6 +32,7 @@
saved_context_eflags:
.long 0
+#ifdef CONFIG_SOFTWARE_SUSPEND
.text
ENTRY(do_magic)
@@ -117,4 +118,4 @@
loop2:
.quad 0
.previous
-
\ No newline at end of file
+#endif
Index: linux/arch/i386/kernel/sysenter.c
===================================================================
--- linux.orig/arch/i386/kernel/sysenter.c 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/sysenter.c 2003-07-17 22:22:58.000000000 +0200
@@ -31,8 +31,6 @@
wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
wrmsr(MSR_IA32_SYSENTER_ESP, tss->esp1, 0);
wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long) sysenter_entry, 0);
-
- printk("Enabling SEP on CPU %d\n", cpu);
put_cpu();
}
Index: linux/drivers/acpi/Kconfig
===================================================================
--- linux.orig/drivers/acpi/Kconfig 2003-07-22 13:39:42.000000000 +0200
+++ linux/drivers/acpi/Kconfig 2003-07-17 22:22:58.000000000 +0200
@@ -58,8 +58,8 @@
default y
config ACPI_SLEEP
- bool "Sleep States"
- depends on X86 && ACPI && !ACPI_HT_ONLY && SOFTWARE_SUSPEND
+ bool "Sleep States (EXPERIMENTAL)"
+ depends on X86 && ACPI && !ACPI_HT_ONLY && EXPERIMENTAL
---help---
This option adds support for ACPI suspend states.
Index: linux/include/linux/reboot.h
===================================================================
--- linux.orig/include/linux/reboot.h 2003-07-22 13:39:42.000000000 +0200
+++ linux/include/linux/reboot.h 2003-07-17 22:22:58.000000000 +0200
@@ -21,7 +21,7 @@
* CAD_OFF Ctrl-Alt-Del sequence sends SIGINT to init task.
* POWER_OFF Stop OS and remove all power from system, if possible.
* RESTART2 Restart system using given command string.
- * SW_SUSPEND Suspend system using Software Suspend if compiled in
+ * SW_SUSPEND Suspend system using software suspend if compiled in.
*/
#define LINUX_REBOOT_CMD_RESTART 0x01234567
Index: linux/include/linux/suspend.h
===================================================================
--- linux.orig/include/linux/suspend.h 2003-07-22 13:39:42.000000000 +0200
+++ linux/include/linux/suspend.h 2003-07-22 12:54:08.000000000 +0200
@@ -55,10 +55,6 @@
extern int register_suspend_notifier(struct notifier_block *);
extern int unregister_suspend_notifier(struct notifier_block *);
-extern void refrigerator(unsigned long);
-
-extern int freeze_processes(void);
-extern void thaw_processes(void);
extern unsigned int nr_copy_pages __nosavedata;
extern suspend_pagedir_t *pagedir_nosave __nosavedata;
@@ -76,15 +72,23 @@
extern void do_suspend_lowlevel_s4bios(int resume);
#else
-static inline void software_suspend(void)
-{
-}
+static inline void software_suspend(void) { }
#define software_resume() do { } while(0)
#define register_suspend_notifier(a) do { } while(0)
#define unregister_suspend_notifier(a) do { } while(0)
+#endif
+
+#ifdef CONFIG_PM
+extern void refrigerator(unsigned long);
+extern int freeze_processes(void);
+extern void thaw_processes(void);
+#else
#define refrigerator(a) do { BUG(); } while(0)
#define freeze_processes() do { panic("You need CONFIG_SOFTWARE_SUSPEND to do sleeps."); } while(0)
#define thaw_processes() do { } while(0)
#endif
+extern int prepare_suspend_console(void);
+extern void restore_console(void);
+
#endif /* _LINUX_SWSUSP_H */
Index: linux/kernel/Makefile
===================================================================
--- linux.orig/kernel/Makefile 2003-07-22 13:39:43.000000000 +0200
+++ linux/kernel/Makefile 2003-07-17 22:22:58.000000000 +0200
@@ -17,7 +17,7 @@
obj-$(CONFIG_PM) += pm.o
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
+obj-$(CONFIG_PM) += suspend.o
obj-$(CONFIG_COMPAT) += compat.o
ifneq ($(CONFIG_IA64),y)
Index: linux/kernel/suspend.c
===================================================================
--- linux.orig/kernel/suspend.c 2003-07-22 13:39:43.000000000 +0200
+++ linux/kernel/suspend.c 2003-07-22 13:46:26.000000000 +0200
@@ -5,7 +5,7 @@
* machine suspend feature using pretty near only high-level routines
*
* Copyright (C) 1998-2001 Gabor Kuti <seasons@fornax.hu>
- * Copyright (C) 1998,2001,2002 Pavel Machek <pavel@suse.cz>
+ * Copyright (C) 1998,2001-2003 Pavel Machek <pavel@suse.cz>
*
* I'd like to thank the following people for their work:
*
@@ -65,6 +65,7 @@
#include <asm/pgtable.h>
#include <asm/io.h>
+#ifdef CONFIG_SOFTWARE_SUSPEND
extern long sys_sync(void);
unsigned char software_suspend_enabled = 0;
@@ -78,7 +79,6 @@
#undef SUSPEND_CONSOLE
#endif
-#define TIMEOUT (6 * HZ) /* Timeout for stopping processes */
#define __ADDRESS(x) ((unsigned long) phys_to_virt(x))
#define ADDRESS(x) __ADDRESS((x) << PAGE_SHIFT)
#define ADDRESS2(x) __ADDRESS(__pa(x)) /* Needed for x86-64 where some pages are in memory twice */
@@ -139,39 +139,45 @@
static const char name_suspend[] = "Suspend Machine: ";
static const char name_resume[] = "Resume Machine: ";
+#endif
/*
* Debug
*/
-#define DEBUG_DEFAULT
-#undef DEBUG_PROCESS
+#undef DEBUG_DEFAULT
#undef DEBUG_SLOW
-#define TEST_SWSUSP 0 /* Set to 1 to reboot instead of halt machine after suspension */
+#define TEST_SWSUSP 0 /* Set to 1 to reboot instead of halt machine after suspension */
#ifdef DEBUG_DEFAULT
-# define PRINTK(f, a...) printk(f, ## a)
+# define PRINTK(f, a...) printk(f, ## a)
#else
-# define PRINTK(f, a...)
+# define PRINTK(f, a...) do {} while (0)
#endif
#ifdef DEBUG_SLOW
#define MDELAY(a) mdelay(a)
#else
-#define MDELAY(a)
+#define MDELAY(a) do {} while (0)
#endif
/*
* Refrigerator and related stuff
*/
-#define INTERESTING(p) \
- /* We don't want to touch kernel_threads..*/ \
- if (p->flags & PF_IOTHREAD) \
- continue; \
- if (p == current) \
- continue; \
- if (p->state == TASK_ZOMBIE) \
- continue;
+/* 0 = Ignore this process when freezing/thawing, 1 = freeze/thaw this process */
+static inline int interesting_process(struct task_struct *p)
+{
+ if (p->flags & PF_IOTHREAD)
+ return 0;
+ if (p == current)
+ return 0;
+ if ((p->state == TASK_ZOMBIE) || (p->state == TASK_DEAD))
+ return 0;
+
+ return 1;
+}
+
+#define TIMEOUT (6 * HZ) /* Timeout for stopping processes */
/* Refrigerator is place where frozen processes are stored :-). */
void refrigerator(unsigned long flag)
@@ -212,9 +218,12 @@
read_lock(&tasklist_lock);
do_each_thread(g, p) {
unsigned long flags;
- INTERESTING(p);
+ if (!interesting_process(p))
+ continue;
if (p->flags & PF_FROZEN)
continue;
+ if (p->state == TASK_STOPPED)
+ continue;
/* FIXME: smp problem here: we may not access other process' flags
without locking */
@@ -245,19 +254,56 @@
printk( "Restarting tasks..." );
read_lock(&tasklist_lock);
do_each_thread(g, p) {
- INTERESTING(p);
-
- if (p->flags & PF_FROZEN) p->flags &= ~PF_FROZEN;
- else
- printk(KERN_INFO " Strange, %s not stopped\n", p->comm );
- wake_up_process(p);
+ if (!interesting_process(p))
+ continue;
+ if (p->flags & PF_FROZEN) {
+ p->flags &= ~PF_FROZEN;
+ wake_up_process(p);
+ } else
+ PRINTK(KERN_INFO " Strange, %s not frozen\n", p->comm );
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
+ schedule();
printk( " done\n" );
MDELAY(500);
}
+int prepare_suspend_console(void)
+{
+ orig_loglevel = console_loglevel;
+ console_loglevel = new_loglevel;
+
+#ifdef CONFIG_VT
+ orig_fgconsole = fg_console;
+#ifdef SUSPEND_CONSOLE
+ if(vc_allocate(SUSPEND_CONSOLE))
+ /* we can't have a free VC for now. Too bad,
+ * we don't want to mess the screen for now. */
+ return 1;
+
+ set_console (SUSPEND_CONSOLE);
+ if (vt_waitactive(SUSPEND_CONSOLE)) {
+ printk(KERN_ERR "Bummer. Can't switch VCs.\n");
+ return 1;
+ }
+ orig_kmsg = kmsg_redirect;
+ kmsg_redirect = SUSPEND_CONSOLE;
+#endif
+#endif
+ return 0;
+}
+
+void restore_console(void)
+{
+ console_loglevel = orig_loglevel;
+#ifdef SUSPEND_CONSOLE
+ set_console (orig_fgconsole);
+#endif
+ return;
+}
+
+#ifdef CONFIG_SOFTWARE_SUSPEND
/*
* Saving part...
*/
@@ -283,17 +329,6 @@
return 0;
}
-/*
- * This is our sync function. With this solution we probably won't sleep
- * but that should not be a problem since tasks are stopped..
- */
-
-static inline void do_suspend_sync(void)
-{
- blk_run_queues();
-#warning This might be broken. We need to somehow wait for data to reach the disk
-}
-
/* We memorize in swapfile_used what swap devices are used for suspension */
#define SWAPFILE_UNUSED 0
#define SWAPFILE_SUSPEND 1 /* This is the suspending device */
@@ -561,7 +596,6 @@
free_suspend_pagedir((unsigned long) pagedir);
return NULL;
}
- printk(".");
SetPageNosave(virt_to_page(p->address));
p->orig_address = 0;
p++;
@@ -569,39 +603,6 @@
return pagedir;
}
-static int prepare_suspend_console(void)
-{
- orig_loglevel = console_loglevel;
- console_loglevel = new_loglevel;
-
-#ifdef CONFIG_VT
- orig_fgconsole = fg_console;
-#ifdef SUSPEND_CONSOLE
- if(vc_allocate(SUSPEND_CONSOLE))
- /* we can't have a free VC for now. Too bad,
- * we don't want to mess the screen for now. */
- return 1;
-
- set_console (SUSPEND_CONSOLE);
- if(vt_waitactive(SUSPEND_CONSOLE)) {
- PRINTK("Bummer. Can't switch VCs.");
- return 1;
- }
- orig_kmsg = kmsg_redirect;
- kmsg_redirect = SUSPEND_CONSOLE;
-#endif
-#endif
- return 0;
-}
-
-static void restore_console(void)
-{
- console_loglevel = orig_loglevel;
-#ifdef SUSPEND_CONSOLE
- set_console (orig_fgconsole);
-#endif
- return;
-}
static int prepare_suspend_processes(void)
{
@@ -852,7 +853,6 @@
free_pages((unsigned long) pagedir_nosave, pagedir_order);
spin_unlock_irq(&suspend_pagedir_lock);
mark_swapfiles(((swp_entry_t) {0}), MARK_SWAP_RESUME);
- PRINTK(KERN_WARNING "%sLeaving do_magic_suspend_2...\n", name_suspend);
}
static void do_software_suspend(void)
@@ -861,20 +861,13 @@
if (prepare_suspend_console())
printk( "%sCan't allocate a console... proceeding\n", name_suspend);
if (!prepare_suspend_processes()) {
-
/* At this point, all user processes and "dangerous"
kernel threads are stopped. Free some memory, as we
need half of memory free. */
-
free_some_memory();
- /* No need to invalidate any vfsmnt list -- they will be valid after resume, anyway.
- *
- * We sync here -- so you have consistent filesystem state when things go wrong.
- * -- so that noone writes to disk after we do atomic copy of data.
- */
- PRINTK("Syncing disks before copy\n");
- do_suspend_sync();
+ /* No need to invalidate any vfsmnt list -- they will be valid after resume, anyway. */
+ blk_run_queues();
/* Save state of all device drivers, and stop them. */
if(drivers_suspend()==0)
@@ -888,12 +881,11 @@
* using normal kernel mechanism.
*/
do_magic(0);
- PRINTK("Restarting processes...\n");
thaw_processes();
}
software_suspend_enabled = 1;
MDELAY(1000);
- restore_console ();
+ restore_console();
}
/*
@@ -906,7 +898,7 @@
return;
software_suspend_enabled = 0;
- BUG_ON(in_interrupt());
+ BUG_ON(in_atomic());
do_software_suspend();
}
@@ -1279,4 +1271,5 @@
EXPORT_SYMBOL(software_suspend);
EXPORT_SYMBOL(software_suspend_enabled);
+#endif
EXPORT_SYMBOL(refrigerator);
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-07-26 21:13 ` Pavel Machek
@ 2003-07-26 21:31 ` Patrick Mochel
2003-07-26 21:35 ` Pavel Machek
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Patrick Mochel @ 2003-07-26 21:31 UTC (permalink / raw)
To: Pavel Machek; +Cc: Linus Torvalds, kernel list
> Okay, I killed few trivial hunks, will submit them through trivial
> patch monkey. Are you happy now, patrick?
Why do you insist on abusing the trivial patch monkey? Why can't you send
them directly to the maintainers? For instance, you add/remove printk()s
and comments that other people may or may not want in there.
But no, this doesn't make me happy because you insist on munging multiple
patches together that have little to do with each other, besides the fact
they touch the same file. Like I said in private email, it really helps to
track down a problem if each patch and subsequent changeset is as small
and localized as possible.
And, that's a real problem with swsusp. It's a huge mess right now. I'd
like to see it work well and reliably for 2.6, and have the source code be
in a state where people can look at it without running away screaming.
Convoluted updates are not going to help the situation.
-pat
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-07-26 21:31 ` Patrick Mochel
@ 2003-07-26 21:35 ` Pavel Machek
2003-07-26 21:37 ` Pavel Machek
2003-07-26 22:32 ` "linux-power" tree [was Re: swsusp updates] Pavel Machek
2 siblings, 0 replies; 15+ messages in thread
From: Pavel Machek @ 2003-07-26 21:35 UTC (permalink / raw)
To: Patrick Mochel; +Cc: Linus Torvalds, kernel list
Hi!
> > Okay, I killed few trivial hunks, will submit them through trivial
> > patch monkey. Are you happy now, patrick?
>
> Why do you insist on abusing the trivial patch monkey? Why can't you send
> them directly to the maintainers? For instance, you add/remove printk()s
> and comments that other people may or may not want in there.
If killing an noisy printk is not an trivial patch, I do not know what
else is. If you want me to keep some printks, tell me, and we can talk
about that.
> But no, this doesn't make me happy because you insist on munging multiple
> patches together that have little to do with each other, besides the fact
> they touch the same file. Like I said in private email, it really helps to
> track down a problem if each patch and subsequent changeset is as small
> and localized as possible.
> And, that's a real problem with swsusp. It's a huge mess right now. I'd
> like to see it work well and reliably for 2.6, and have the source code be
> in a state where people can look at it without running away screaming.
> Convoluted updates are not going to help the situation.
Yes, and just now you are contributing for swsusp to stay in the messy
state. Thanx a lot.
If you want to become swsusp maintainer, say so, and you'll be fed
nice and split patches *once*. That's okay to do. But I'm not able/do
not have enough time to produce split patch each time Linus decides to
drop the mail into the bitbucket.
I really don't like "Linus dropped patch -> resubmit 2 patches merged"
resulting in you screaming "SPLIT IT UP!" on the lists.
Pavel
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-07-26 21:31 ` Patrick Mochel
2003-07-26 21:35 ` Pavel Machek
@ 2003-07-26 21:37 ` Pavel Machek
2003-07-26 22:32 ` "linux-power" tree [was Re: swsusp updates] Pavel Machek
2 siblings, 0 replies; 15+ messages in thread
From: Pavel Machek @ 2003-07-26 21:37 UTC (permalink / raw)
To: Patrick Mochel; +Cc: Linus Torvalds, kernel list
Hi!
> > Okay, I killed few trivial hunks, will submit them through trivial
> > patch monkey. Are you happy now, patrick?
>
> Why do you insist on abusing the trivial patch monkey? Why can't you send
> them directly to the maintainers? For instance, you add/remove printk()s
> and comments that other people may or may not want in there.
>
> But no, this doesn't make me happy because you insist on munging multiple
> patches together that have little to do with each other, besides the fact
> they touch the same file. Like I said in private email, it really helps to
> track down a problem if each patch and subsequent changeset is as small
> and localized as possible.
>
> And, that's a real problem with swsusp. It's a huge mess right now. I'd
> like to see it work well and reliably for 2.6, and have the source code be
> in a state where people can look at it without running away screaming.
> Convoluted updates are not going to help the situation.
[Sorry for the mess, I guess we are on the good way to solve this in
private mails.]
Pavel
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
^ permalink raw reply [flat|nested] 15+ messages in thread
* "linux-power" tree [was Re: swsusp updates]
2003-07-26 21:31 ` Patrick Mochel
2003-07-26 21:35 ` Pavel Machek
2003-07-26 21:37 ` Pavel Machek
@ 2003-07-26 22:32 ` Pavel Machek
2 siblings, 0 replies; 15+ messages in thread
From: Pavel Machek @ 2003-07-26 22:32 UTC (permalink / raw)
To: Patrick Mochel; +Cc: Linus Torvalds, kernel list
Hi!
> And, that's a real problem with swsusp. It's a huge mess right now. I'd
> like to see it work well and reliably for 2.6, and have the source code be
> in a state where people can look at it without running away screaming.
> Convoluted updates are not going to help the situation.
Okay, so the debate is not over. It looks like his internet connection
only works as long as you keep flaming him -- perhaps he has frozen
ethernet cable? :-)
Anyway, patrick seems to have his own "linux-power" tree, and thinks
that his "linux-power" tree will help powermanagment in Linux. I don't
think that is the case, but I'll provide split patches *once*. Then
I'm going to post each new patch (I guess I'll cc: patrick), but
cumulate them for submission to Linus. Patches will be marked [PM]
(read it as Pavel Machek or Power Managment).
I hope that works for everybody.
Pavel
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-08-04 22:13 ` Pavel Machek
@ 2003-08-04 22:27 ` Andrew Morton
0 siblings, 0 replies; 15+ messages in thread
From: Andrew Morton @ 2003-08-04 22:27 UTC (permalink / raw)
To: Pavel Machek; +Cc: torvalds, linux-kernel, mochel
Pavel Machek <pavel@ucw.cz> wrote:
>
> This should fix it: (incremental).
It generates rejects against Linus's current tree.
Please grab the latest from
ftp://ftp.kernel.org/pub/linux/kernel/v2.5/testing/cset/index.html
rediff, retest with various config options, resend.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-08-04 20:43 ` Andrew Morton
@ 2003-08-04 22:13 ` Pavel Machek
2003-08-04 22:27 ` Andrew Morton
0 siblings, 1 reply; 15+ messages in thread
From: Pavel Machek @ 2003-08-04 22:13 UTC (permalink / raw)
To: Andrew Morton; +Cc: torvalds, linux-kernel, mochel
Hi!
> > Here are swsusp updates, retransmitted. Please apply this time.
>
> With CONFIG_SOFTWARE_SUSPEND=n:
>
> kernel/suspend.c: In function `prepare_suspend_console':
> kernel/suspend.c:272: `orig_loglevel' undeclared (first use in this function)
> kernel/suspend.c:272: (Each undeclared identifier is reported only once
> kernel/suspend.c:272: for each function it appears in.)
> kernel/suspend.c:273: `new_loglevel' undeclared (first use in this function)
> kernel/suspend.c:276: `orig_fgconsole' undeclared (first use in this function)
> kernel/suspend.c: In function `restore_console':
> kernel/suspend.c:297: `orig_loglevel' undeclared (first use in this
function)
This should fix it: (incremental).
Pavel
--- /usr/src/tmp/linux/kernel/suspend.c 2003-08-05 00:02:29.000000000 +0200
+++ /usr/src/linux/kernel/suspend.c 2003-08-04 23:55:07.000000000 +0200
@@ -69,15 +69,6 @@
unsigned char software_suspend_enabled = 0;
-#define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1)
-/* With SUSPEND_CONSOLE defined, it suspend looks *really* cool, but
- we probably do not take enough locks for switching consoles, etc,
- so bad things might happen.
-*/
-#if !defined(CONFIG_VT) || !defined(CONFIG_VT_CONSOLE)
-#undef SUSPEND_CONSOLE
-#endif
-
#define __ADDRESS(x) ((unsigned long) phys_to_virt(x))
#define ADDRESS(x) __ADDRESS((x) << PAGE_SHIFT)
#define ADDRESS2(x) __ADDRESS(__pa(x)) /* Needed for x86-64 where some pages are in memory twice */
@@ -91,9 +82,6 @@
spinlock_t suspend_pagedir_lock __nosavedata = SPIN_LOCK_UNLOCKED;
/* Variables to be preserved over suspend */
-static int new_loglevel = 7;
-static int orig_loglevel = 0;
-static int orig_fgconsole, orig_kmsg;
static int pagedir_order_check;
static int nr_copy_pages_check;
@@ -267,6 +255,19 @@
MDELAY(500);
}
+#define SUSPEND_CONSOLE (MAX_NR_CONSOLES-1)
+/* With SUSPEND_CONSOLE defined, it suspend looks *really* cool, but
+ we probably do not take enough locks for switching consoles, etc,
+ so bad things might happen.
+*/
+#if !defined(CONFIG_VT) || !defined(CONFIG_VT_CONSOLE)
+#undef SUSPEND_CONSOLE
+#endif
+
+static int new_loglevel = 7;
+static int orig_loglevel = 0;
+static int orig_fgconsole, orig_kmsg;
+
int prepare_suspend_console(void)
{
orig_loglevel = console_loglevel;
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: swsusp updates
2003-08-04 20:14 swsusp updates Pavel Machek
@ 2003-08-04 20:43 ` Andrew Morton
2003-08-04 22:13 ` Pavel Machek
0 siblings, 1 reply; 15+ messages in thread
From: Andrew Morton @ 2003-08-04 20:43 UTC (permalink / raw)
To: Pavel Machek; +Cc: torvalds, linux-kernel, mochel
Pavel Machek <pavel@ucw.cz> wrote:
>
> Here are swsusp updates, retransmitted. Please apply this time.
With CONFIG_SOFTWARE_SUSPEND=n:
kernel/suspend.c: In function `prepare_suspend_console':
kernel/suspend.c:272: `orig_loglevel' undeclared (first use in this function)
kernel/suspend.c:272: (Each undeclared identifier is reported only once
kernel/suspend.c:272: for each function it appears in.)
kernel/suspend.c:273: `new_loglevel' undeclared (first use in this function)
kernel/suspend.c:276: `orig_fgconsole' undeclared (first use in this function)
kernel/suspend.c: In function `restore_console':
kernel/suspend.c:297: `orig_loglevel' undeclared (first use in this function)
^ permalink raw reply [flat|nested] 15+ messages in thread
* swsusp updates
@ 2003-08-04 20:14 Pavel Machek
2003-08-04 20:43 ` Andrew Morton
0 siblings, 1 reply; 15+ messages in thread
From: Pavel Machek @ 2003-08-04 20:14 UTC (permalink / raw)
To: torvalds, kernel list; +Cc: Patrick Mochel
Hi!
Here are swsusp updates, retransmitted. Please apply this time.
This fixes suspend with ^Z-ed processes (could corrupt data),
makes CONFIG_SOFTWARE_SUSPEND independend from CONFIG_ACPI_SLEEP,
fixes console after S3 and fixes too loud printks.
Pavel
Index: linux/drivers/acpi/sleep/main.c
===================================================================
--- linux.orig/drivers/acpi/sleep/main.c 2003-07-22 13:39:42.000000000 +0200
+++ linux/drivers/acpi/sleep/main.c 2003-07-22 12:53:27.000000000 +0200
@@ -69,10 +81,6 @@
* First, we call to the device driver layer to save device state.
* Once we have that, we save whatevery processor and kernel state we
* need to memory.
- * If we're entering S4, we then write the memory image to disk.
- *
- * Only then is it safe for us to power down devices, since we may need
- * the disks and upstream buses to write to.
*/
acpi_status
acpi_system_save_state(
@@ -197,7 +205,7 @@
break;
}
local_irq_restore(flags);
- printk(KERN_CRIT "Back to C!\n");
+ printk(KERN_DEBUG "Back to C!\n");
return status;
}
@@ -226,6 +234,7 @@
if (state == ACPI_STATE_S4 && !acpi_gbl_FACS->S4bios_f)
return AE_ERROR;
+ prepare_suspend_console();
/*
* TBD: S1 can be done without device_suspend. Make a CONFIG_XX
* to handle however when S1 failed without device_suspend.
@@ -270,6 +279,7 @@
/* reset firmware waking vector */
acpi_set_firmware_waking_vector((acpi_physical_address) 0);
thaw_processes();
+ restore_console();
return status;
}
Index: linux/arch/i386/kernel/Makefile
===================================================================
--- linux.orig/arch/i386/kernel/Makefile 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/Makefile 2003-07-17 22:22:58.000000000 +0200
@@ -24,7 +24,8 @@
obj-$(CONFIG_X86_MPPARSE) += mpparse.o
obj-$(CONFIG_X86_LOCAL_APIC) += apic.o nmi.o
obj-$(CONFIG_X86_IO_APIC) += io_apic.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o suspend_asm.o
+obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
+obj-$(CONFIG_PM) += suspend_asm.o
obj-$(CONFIG_X86_NUMAQ) += numaq.o
obj-$(CONFIG_X86_SUMMIT) += summit.o
obj-$(CONFIG_EDD) += edd.o
Index: linux/arch/i386/kernel/suspend_asm.S
===================================================================
--- linux.orig/arch/i386/kernel/suspend_asm.S 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/suspend_asm.S 2003-07-20 15:02:12.000000000 +0200
@@ -32,6 +32,7 @@
saved_context_eflags:
.long 0
+#ifdef CONFIG_SOFTWARE_SUSPEND
.text
ENTRY(do_magic)
@@ -117,4 +118,4 @@
loop2:
.quad 0
.previous
-
\ No newline at end of file
+#endif
Index: linux/arch/i386/kernel/sysenter.c
===================================================================
--- linux.orig/arch/i386/kernel/sysenter.c 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/sysenter.c 2003-07-17 22:22:58.000000000 +0200
@@ -31,8 +31,6 @@
wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
wrmsr(MSR_IA32_SYSENTER_ESP, tss->esp1, 0);
wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long) sysenter_entry, 0);
-
- printk("Enabling SEP on CPU %d\n", cpu);
put_cpu();
}
Index: linux/drivers/acpi/Kconfig
===================================================================
--- linux.orig/drivers/acpi/Kconfig 2003-07-22 13:39:42.000000000 +0200
+++ linux/drivers/acpi/Kconfig 2003-07-17 22:22:58.000000000 +0200
@@ -58,8 +58,8 @@
default y
config ACPI_SLEEP
- bool "Sleep States"
- depends on X86 && ACPI && !ACPI_HT_ONLY && SOFTWARE_SUSPEND
+ bool "Sleep States (EXPERIMENTAL)"
+ depends on X86 && ACPI && !ACPI_HT_ONLY && EXPERIMENTAL
---help---
This option adds support for ACPI suspend states.
Index: linux/drivers/base/power.c
===================================================================
--- linux.orig/drivers/base/power.c 2003-07-22 13:39:42.000000000 +0200
+++ linux/drivers/base/power.c 2003-07-17 22:22:58.000000000 +0200
@@ -52,8 +52,6 @@
struct device * dev;
int error = 0;
- printk(KERN_EMERG "Suspending devices\n");
-
down_write(&devices_subsys.rwsem);
list_for_each_entry_reverse(dev,&devices_subsys.kset.list,kobj.entry) {
if (dev->driver && dev->driver->suspend) {
@@ -114,8 +112,6 @@
}
}
up_write(&devices_subsys.rwsem);
-
- printk(KERN_EMERG "Devices Resumed\n");
}
/**
@@ -125,8 +121,6 @@
{
struct device * dev;
- printk(KERN_EMERG "Shutting down devices\n");
-
down_write(&devices_subsys.rwsem);
list_for_each_entry_reverse(dev,&devices_subsys.kset.list,kobj.entry) {
pr_debug("shutting down %s: ",dev->name);
Index: linux/include/linux/reboot.h
===================================================================
--- linux.orig/include/linux/reboot.h 2003-07-22 13:39:42.000000000 +0200
+++ linux/include/linux/reboot.h 2003-07-17 22:22:58.000000000 +0200
@@ -21,7 +21,7 @@
* CAD_OFF Ctrl-Alt-Del sequence sends SIGINT to init task.
* POWER_OFF Stop OS and remove all power from system, if possible.
* RESTART2 Restart system using given command string.
- * SW_SUSPEND Suspend system using Software Suspend if compiled in
+ * SW_SUSPEND Suspend system using software suspend if compiled in.
*/
#define LINUX_REBOOT_CMD_RESTART 0x01234567
Index: linux/include/linux/suspend.h
===================================================================
--- linux.orig/include/linux/suspend.h 2003-07-22 13:39:42.000000000 +0200
+++ linux/include/linux/suspend.h 2003-07-22 12:54:08.000000000 +0200
@@ -55,10 +55,6 @@
extern int register_suspend_notifier(struct notifier_block *);
extern int unregister_suspend_notifier(struct notifier_block *);
-extern void refrigerator(unsigned long);
-
-extern int freeze_processes(void);
-extern void thaw_processes(void);
extern unsigned int nr_copy_pages __nosavedata;
extern suspend_pagedir_t *pagedir_nosave __nosavedata;
@@ -76,15 +72,23 @@
extern void do_suspend_lowlevel_s4bios(int resume);
#else
-static inline void software_suspend(void)
-{
-}
+static inline void software_suspend(void) { }
#define software_resume() do { } while(0)
#define register_suspend_notifier(a) do { } while(0)
#define unregister_suspend_notifier(a) do { } while(0)
+#endif
+
+#ifdef CONFIG_PM
+extern void refrigerator(unsigned long);
+extern int freeze_processes(void);
+extern void thaw_processes(void);
+#else
#define refrigerator(a) do { BUG(); } while(0)
#define freeze_processes() do { panic("You need CONFIG_SOFTWARE_SUSPEND to do sleeps."); } while(0)
#define thaw_processes() do { } while(0)
#endif
+extern int prepare_suspend_console(void);
+extern void restore_console(void);
+
#endif /* _LINUX_SWSUSP_H */
Index: linux/kernel/Makefile
===================================================================
--- linux.orig/kernel/Makefile 2003-07-22 13:39:43.000000000 +0200
+++ linux/kernel/Makefile 2003-07-17 22:22:58.000000000 +0200
@@ -17,7 +17,7 @@
obj-$(CONFIG_PM) += pm.o
obj-$(CONFIG_CPU_FREQ) += cpufreq.o
obj-$(CONFIG_BSD_PROCESS_ACCT) += acct.o
-obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o
+obj-$(CONFIG_PM) += suspend.o
obj-$(CONFIG_COMPAT) += compat.o
ifneq ($(CONFIG_IA64),y)
Index: linux/kernel/suspend.c
===================================================================
--- linux.orig/kernel/suspend.c 2003-07-22 13:39:43.000000000 +0200
+++ linux/kernel/suspend.c 2003-07-22 13:46:26.000000000 +0200
@@ -5,7 +5,7 @@
* machine suspend feature using pretty near only high-level routines
*
* Copyright (C) 1998-2001 Gabor Kuti <seasons@fornax.hu>
- * Copyright (C) 1998,2001,2002 Pavel Machek <pavel@suse.cz>
+ * Copyright (C) 1998,2001-2003 Pavel Machek <pavel@suse.cz>
*
* I'd like to thank the following people for their work:
*
@@ -65,6 +65,7 @@
#include <asm/pgtable.h>
#include <asm/io.h>
+#ifdef CONFIG_SOFTWARE_SUSPEND
extern long sys_sync(void);
unsigned char software_suspend_enabled = 0;
@@ -78,7 +79,6 @@
#undef SUSPEND_CONSOLE
#endif
-#define TIMEOUT (6 * HZ) /* Timeout for stopping processes */
#define __ADDRESS(x) ((unsigned long) phys_to_virt(x))
#define ADDRESS(x) __ADDRESS((x) << PAGE_SHIFT)
#define ADDRESS2(x) __ADDRESS(__pa(x)) /* Needed for x86-64 where some pages are in memory twice */
@@ -139,39 +139,45 @@
static const char name_suspend[] = "Suspend Machine: ";
static const char name_resume[] = "Resume Machine: ";
+#endif
/*
* Debug
*/
-#define DEBUG_DEFAULT
-#undef DEBUG_PROCESS
+#undef DEBUG_DEFAULT
#undef DEBUG_SLOW
-#define TEST_SWSUSP 0 /* Set to 1 to reboot instead of halt machine after suspension */
+#define TEST_SWSUSP 1 /* Set to 1 to reboot instead of halt machine after suspension */
#ifdef DEBUG_DEFAULT
-# define PRINTK(f, a...) printk(f, ## a)
+# define PRINTK(f, a...) printk(f, ## a)
#else
-# define PRINTK(f, a...)
+# define PRINTK(f, a...) do {} while (0)
#endif
#ifdef DEBUG_SLOW
#define MDELAY(a) mdelay(a)
#else
-#define MDELAY(a)
+#define MDELAY(a) do {} while (0)
#endif
/*
* Refrigerator and related stuff
*/
-#define INTERESTING(p) \
- /* We don't want to touch kernel_threads..*/ \
- if (p->flags & PF_IOTHREAD) \
- continue; \
- if (p == current) \
- continue; \
- if (p->state == TASK_ZOMBIE) \
- continue;
+/* 0 = Ignore this process when freezing/thawing, 1 = freeze/thaw this process */
+static inline int interesting_process(struct task_struct *p)
+{
+ if (p->flags & PF_IOTHREAD)
+ return 0;
+ if (p == current)
+ return 0;
+ if ((p->state == TASK_ZOMBIE) || (p->state == TASK_DEAD))
+ return 0;
+
+ return 1;
+}
+
+#define TIMEOUT (6 * HZ) /* Timeout for stopping processes */
/* Refrigerator is place where frozen processes are stored :-). */
void refrigerator(unsigned long flag)
@@ -212,9 +218,12 @@
read_lock(&tasklist_lock);
do_each_thread(g, p) {
unsigned long flags;
- INTERESTING(p);
+ if (!interesting_process(p))
+ continue;
if (p->flags & PF_FROZEN)
continue;
+ if (p->state == TASK_STOPPED)
+ continue;
/* FIXME: smp problem here: we may not access other process' flags
without locking */
@@ -245,19 +254,56 @@
printk( "Restarting tasks..." );
read_lock(&tasklist_lock);
do_each_thread(g, p) {
- INTERESTING(p);
-
- if (p->flags & PF_FROZEN) p->flags &= ~PF_FROZEN;
- else
- printk(KERN_INFO " Strange, %s not stopped\n", p->comm );
- wake_up_process(p);
+ if (!interesting_process(p))
+ continue;
+ if (p->flags & PF_FROZEN) {
+ p->flags &= ~PF_FROZEN;
+ wake_up_process(p);
+ } else
+ PRINTK(KERN_INFO " Strange, %s not frozen\n", p->comm );
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
+ schedule();
printk( " done\n" );
MDELAY(500);
}
+int prepare_suspend_console(void)
+{
+ orig_loglevel = console_loglevel;
+ console_loglevel = new_loglevel;
+
+#ifdef CONFIG_VT
+ orig_fgconsole = fg_console;
+#ifdef SUSPEND_CONSOLE
+ if(vc_allocate(SUSPEND_CONSOLE))
+ /* we can't have a free VC for now. Too bad,
+ * we don't want to mess the screen for now. */
+ return 1;
+
+ set_console (SUSPEND_CONSOLE);
+ if (vt_waitactive(SUSPEND_CONSOLE)) {
+ printk(KERN_ERR "Bummer. Can't switch VCs.\n");
+ return 1;
+ }
+ orig_kmsg = kmsg_redirect;
+ kmsg_redirect = SUSPEND_CONSOLE;
+#endif
+#endif
+ return 0;
+}
+
+void restore_console(void)
+{
+ console_loglevel = orig_loglevel;
+#ifdef SUSPEND_CONSOLE
+ set_console (orig_fgconsole);
+#endif
+ return;
+}
+
+#ifdef CONFIG_SOFTWARE_SUSPEND
/*
* Saving part...
*/
@@ -283,17 +329,6 @@
return 0;
}
-/*
- * This is our sync function. With this solution we probably won't sleep
- * but that should not be a problem since tasks are stopped..
- */
-
-static inline void do_suspend_sync(void)
-{
- blk_run_queues();
-#warning This might be broken. We need to somehow wait for data to reach the disk
-}
-
/* We memorize in swapfile_used what swap devices are used for suspension */
#define SWAPFILE_UNUSED 0
#define SWAPFILE_SUSPEND 1 /* This is the suspending device */
@@ -561,7 +596,6 @@
free_suspend_pagedir((unsigned long) pagedir);
return NULL;
}
- printk(".");
SetPageNosave(virt_to_page(p->address));
p->orig_address = 0;
p++;
@@ -569,39 +603,6 @@
return pagedir;
}
-static int prepare_suspend_console(void)
-{
- orig_loglevel = console_loglevel;
- console_loglevel = new_loglevel;
-
-#ifdef CONFIG_VT
- orig_fgconsole = fg_console;
-#ifdef SUSPEND_CONSOLE
- if(vc_allocate(SUSPEND_CONSOLE))
- /* we can't have a free VC for now. Too bad,
- * we don't want to mess the screen for now. */
- return 1;
-
- set_console (SUSPEND_CONSOLE);
- if(vt_waitactive(SUSPEND_CONSOLE)) {
- PRINTK("Bummer. Can't switch VCs.");
- return 1;
- }
- orig_kmsg = kmsg_redirect;
- kmsg_redirect = SUSPEND_CONSOLE;
-#endif
-#endif
- return 0;
-}
-
-static void restore_console(void)
-{
- console_loglevel = orig_loglevel;
-#ifdef SUSPEND_CONSOLE
- set_console (orig_fgconsole);
-#endif
- return;
-}
static int prepare_suspend_processes(void)
{
@@ -852,7 +853,6 @@
free_pages((unsigned long) pagedir_nosave, pagedir_order);
spin_unlock_irq(&suspend_pagedir_lock);
mark_swapfiles(((swp_entry_t) {0}), MARK_SWAP_RESUME);
- PRINTK(KERN_WARNING "%sLeaving do_magic_suspend_2...\n", name_suspend);
}
static void do_software_suspend(void)
@@ -861,20 +861,13 @@
if (prepare_suspend_console())
printk( "%sCan't allocate a console... proceeding\n", name_suspend);
if (!prepare_suspend_processes()) {
-
/* At this point, all user processes and "dangerous"
kernel threads are stopped. Free some memory, as we
need half of memory free. */
-
free_some_memory();
- /* No need to invalidate any vfsmnt list -- they will be valid after resume, anyway.
- *
- * We sync here -- so you have consistent filesystem state when things go wrong.
- * -- so that noone writes to disk after we do atomic copy of data.
- */
- PRINTK("Syncing disks before copy\n");
- do_suspend_sync();
+ /* No need to invalidate any vfsmnt list -- they will be valid after resume, anyway. */
+ blk_run_queues();
/* Save state of all device drivers, and stop them. */
if(drivers_suspend()==0)
@@ -888,12 +881,11 @@
* using normal kernel mechanism.
*/
do_magic(0);
- PRINTK("Restarting processes...\n");
thaw_processes();
}
software_suspend_enabled = 1;
MDELAY(1000);
- restore_console ();
+ restore_console();
}
/*
@@ -906,7 +898,7 @@
return;
software_suspend_enabled = 0;
- BUG_ON(in_interrupt());
+ BUG_ON(in_atomic());
do_software_suspend();
}
@@ -1279,4 +1271,5 @@
EXPORT_SYMBOL(software_suspend);
EXPORT_SYMBOL(software_suspend_enabled);
+#endif
EXPORT_SYMBOL(refrigerator);
Index: linux/arch/i386/kernel/acpi/wakeup.S
===================================================================
--- linux.orig/arch/i386/kernel/acpi/wakeup.S 2003-07-22 13:39:42.000000000 +0200
+++ linux/arch/i386/kernel/acpi/wakeup.S 2003-07-22 13:26:01.000000000 +0200
@@ -43,6 +43,11 @@
testl $1, video_flags - wakeup_code
jz 1f
+ /* It is miracle that this works:
+ * PCI may or may not be initialized at this point
+ * I'm told we should pass device ID to video bios
+ However it works on some real machines...
+ */
lcall $0xc000,$3
movw %cs, %ax
movw %ax, %ds # Bios might have played with that
--
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
^ permalink raw reply [flat|nested] 15+ messages in thread
* swsusp updates
@ 2002-10-29 23:15 Pavel Machek
0 siblings, 0 replies; 15+ messages in thread
From: Pavel Machek @ 2002-10-29 23:15 UTC (permalink / raw)
To: torvalds, kernel list
Hi!
This uses "better" constraints that do not go through the register
unneccessarily. Please apply,
Pavel
--- clean/arch/i386/kernel/suspend.c 2002-09-22 23:46:53.000000000 +0200
+++ linux-swsusp/arch/i386/kernel/suspend.c 2002-10-13 20:19:43.000000000 +0200
@@ -54,10 +54,10 @@
/*
* descriptor tables
*/
- asm volatile ("sgdt (%0)" : "=m" (saved_context.gdt_limit));
- asm volatile ("sidt (%0)" : "=m" (saved_context.idt_limit));
- asm volatile ("sldt (%0)" : "=m" (saved_context.ldt));
- asm volatile ("str (%0)" : "=m" (saved_context.tr));
+ asm volatile ("sgdt %0" : "=m" (saved_context.gdt_limit));
+ asm volatile ("sidt %0" : "=m" (saved_context.idt_limit));
+ asm volatile ("sldt %0" : "=m" (saved_context.ldt));
+ asm volatile ("str %0" : "=m" (saved_context.tr));
/*
* save the general registers.
@@ -67,22 +67,22 @@
* It's really not necessary, and kinda fishy (check the assembly output),
* so it's avoided.
*/
- asm volatile ("movl %%esp, (%0)" : "=m" (saved_context.esp));
- asm volatile ("movl %%eax, (%0)" : "=m" (saved_context.eax));
- asm volatile ("movl %%ebx, (%0)" : "=m" (saved_context.ebx));
- asm volatile ("movl %%ecx, (%0)" : "=m" (saved_context.ecx));
- asm volatile ("movl %%edx, (%0)" : "=m" (saved_context.edx));
- asm volatile ("movl %%ebp, (%0)" : "=m" (saved_context.ebp));
- asm volatile ("movl %%esi, (%0)" : "=m" (saved_context.esi));
- asm volatile ("movl %%edi, (%0)" : "=m" (saved_context.edi));
-
+ asm volatile ("movl %%esp, %0" : "=m" (saved_context.esp));
+ asm volatile ("movl %%eax, %0" : "=m" (saved_context.eax));
+ asm volatile ("movl %%ebx, %0" : "=m" (saved_context.ebx));
+ asm volatile ("movl %%ecx, %0" : "=m" (saved_context.ecx));
+ asm volatile ("movl %%edx, %0" : "=m" (saved_context.edx));
+ asm volatile ("movl %%ebp, %0" : "=m" (saved_context.ebp));
+ asm volatile ("movl %%esi, %0" : "=m" (saved_context.esi));
+ asm volatile ("movl %%edi, %0" : "=m" (saved_context.edi));
+ /* FIXME: Need to save XMM0..XMM15? */
/*
* segment registers
*/
- asm volatile ("movw %%es, %0" : "=r" (saved_context.es));
- asm volatile ("movw %%fs, %0" : "=r" (saved_context.fs));
- asm volatile ("movw %%gs, %0" : "=r" (saved_context.gs));
- asm volatile ("movw %%ss, %0" : "=r" (saved_context.ss));
+ asm volatile ("movw %%es, %0" : "=m" (saved_context.es));
+ asm volatile ("movw %%fs, %0" : "=m" (saved_context.fs));
+ asm volatile ("movw %%gs, %0" : "=m" (saved_context.gs));
+ asm volatile ("movw %%ss, %0" : "=m" (saved_context.ss));
/*
* control registers
@@ -95,7 +95,7 @@
/*
* eflags
*/
- asm volatile ("pushfl ; popl (%0)" : "=m" (saved_context.eflags));
+ asm volatile ("pushfl ; popl %0" : "=m" (saved_context.eflags));
}
static void
@@ -125,9 +125,7 @@
/*
* first restore %ds, so we can access our data properly
*/
- asm volatile (".align 4");
- asm volatile ("movw %0, %%ds" :: "r" ((u16)__KERNEL_DS));
-
+ asm volatile ("movw %0, %%ds" :: "r" (__KERNEL_DS));
/*
* control registers
@@ -136,7 +134,7 @@
asm volatile ("movl %0, %%cr3" :: "r" (saved_context.cr3));
asm volatile ("movl %0, %%cr2" :: "r" (saved_context.cr2));
asm volatile ("movl %0, %%cr0" :: "r" (saved_context.cr0));
-
+
/*
* segment registers
*/
@@ -167,9 +165,9 @@
* now restore the descriptor tables to their proper values
* ltr is done i fix_processor_context().
*/
- asm volatile ("lgdt (%0)" :: "m" (saved_context.gdt_limit));
- asm volatile ("lidt (%0)" :: "m" (saved_context.idt_limit));
- asm volatile ("lldt (%0)" :: "m" (saved_context.ldt));
+ asm volatile ("lgdt %0" :: "m" (saved_context.gdt_limit));
+ asm volatile ("lidt %0" :: "m" (saved_context.idt_limit));
+ asm volatile ("lldt %0" :: "m" (saved_context.ldt));
fix_processor_context();
--- clean/include/asm-i386/suspend.h 2002-07-23 10:40:05.000000000 +0200
+++ linux-swsusp/include/asm-i386/suspend.h 2002-10-08 12:14:12.000000000 +0200
@@ -15,22 +15,22 @@
/* image of the saved processor state */
struct saved_context {
- u32 eax, ebx, ecx, edx;
- u32 esp, ebp, esi, edi;
- u16 es, fs, gs, ss;
- u32 cr0, cr2, cr3, cr4;
+ unsigned long eax, ebx, ecx, edx;
+ unsigned long esp, ebp, esi, edi;
+ u16 es, fs, gs, ss;
+ unsigned long cr0, cr2, cr3, cr4;
u16 gdt_pad;
u16 gdt_limit;
- u32 gdt_base;
+ unsigned long gdt_base;
u16 idt_pad;
u16 idt_limit;
- u32 idt_base;
+ unsigned long idt_base;
u16 ldt;
u16 tss;
- u32 tr;
- u32 safety;
- u32 return_address;
- u32 eflags;
+ unsigned long tr;
+ unsigned long safety;
+ unsigned long return_address;
+ unsigned long eflags;
} __attribute__((packed));
#define loaddebug(thread,register) \
@@ -52,11 +52,11 @@
static inline void acpi_save_register_state(unsigned long return_point)
{
saved_eip = return_point;
- asm volatile ("movl %%esp,(%0)" : "=m" (saved_esp));
- asm volatile ("movl %%ebp,(%0)" : "=m" (saved_ebp));
- asm volatile ("movl %%ebx,(%0)" : "=m" (saved_ebx));
- asm volatile ("movl %%edi,(%0)" : "=m" (saved_edi));
- asm volatile ("movl %%esi,(%0)" : "=m" (saved_esi));
+ asm volatile ("movl %%esp,%0" : "=m" (saved_esp));
+ asm volatile ("movl %%ebp,%0" : "=m" (saved_ebp));
+ asm volatile ("movl %%ebx,%0" : "=m" (saved_ebx));
+ asm volatile ("movl %%edi,%0" : "=m" (saved_edi));
+ asm volatile ("movl %%esi,%0" : "=m" (saved_esi));
}
#define acpi_restore_register_state() do {} while (0)
--
Worst form of spam? Adding advertisment signatures ala sourceforge.net.
What goes next? Inserting advertisment *into* email?
^ permalink raw reply [flat|nested] 15+ messages in thread
* swsusp updates
@ 2002-09-21 21:12 Pavel Machek
0 siblings, 0 replies; 15+ messages in thread
From: Pavel Machek @ 2002-09-21 21:12 UTC (permalink / raw)
To: torvalds, kernel list
Hi!
Small updates to documentation, sanity checks turned into BUG_ONs to
save space, fix recovery on resume error. Please apply,
Pavel
--- clean/Documentation/swsusp.txt 2002-07-09 04:54:06.000000000 +0200
+++ linux-swsusp/Documentation/swsusp.txt 2002-09-13 19:12:59.000000000 +0200
@@ -148,7 +148,7 @@
corrupts the virtual console of X.. (Maybe this has been fixed AFAIK).
Drivers we support
-- IDE disks are okay
+- IDE disks are okay... Were okay before Andre's ide came back.
- vesafb
Drivers that need support
@@ -156,6 +156,23 @@
- do IDE cdroms need some kind of support?
- IDE CD-RW -- how to deal with that?
+FAQ:
+
+Q: well, suspending a server is IMHO a really stupid thing,
+but... (Diego Zuccato):
+
+A: You bought new UPS for your server. How do you install it without
+bringing machine down? Suspend to disk, rearrange power cables,
+resume.
+
+You have your server on UPS. Power died, and UPS is indicating 30
+seconds to failure. What do you do? Suspend to disk.
+
+Ethernet card in your server died. You want to replace it. Your
+server is not hotplug capable. What do you do? Suspend to disk,
+replace ethernet card, resume. If you are fast your users will not
+even see broken connections.
+
Any other idea you might have tell me!
Contacting the author
--- clean/kernel/suspend.c 2002-09-21 13:20:46.000000000 +0200
+++ linux-swsusp/kernel/suspend.c 2002-09-21 13:25:41.000000000 +0200
@@ -472,16 +472,17 @@
int pfn;
struct page *page;
- if (max_mapnr != num_physpages)
- panic("mapnr is not expected");
+ BUG_ON (max_mapnr != num_physpages);
for (pfn = 0; pfn < max_mapnr; pfn++) {
page = pfn_to_page(pfn);
if (PageHighMem(page))
panic("Swsusp not supported on highmem boxes. Send 1GB of RAM to <pavel@ucw.cz> and try again ;-).");
+
if (!PageReserved(page)) {
if (PageNosave(page))
continue;
+
if ((chunk_size=is_head_of_free_region(page))!=0) {
pfn += chunk_size - 1;
continue;
@@ -774,9 +785,10 @@
BUG_ON (nr_copy_pages_check != nr_copy_pages);
BUG_ON (pagedir_order_check != pagedir_order);
+ __flush_tlb_global(); /* Even mappings of "global" things (vmalloc) need to be fixed */
+
PRINTK( "Freeing prev allocated pagedir\n" );
free_suspend_pagedir((unsigned long) pagedir_save);
- __flush_tlb_global(); /* Even mappings of "global" things (vmalloc) need to be fixed */
drivers_resume(RESUME_ALL_PHASES);
spin_unlock_irq(&suspend_pagedir_lock);
@@ -807,12 +819,10 @@
barrier();
mb();
- drivers_resume(RESUME_PHASE2);
spin_lock_irq(&suspend_pagedir_lock); /* Done to disable interrupts */
mdelay(1000);
free_pages((unsigned long) pagedir_nosave, pagedir_order);
- drivers_resume(RESUME_PHASE1);
spin_unlock_irq(&suspend_pagedir_lock);
mark_swapfiles(((swp_entry_t) {0}), MARK_SWAP_RESUME);
PRINTK(KERN_WARNING "%sLeaving do_magic_suspend_2...\n", name_suspend);
@@ -1035,6 +1045,7 @@
return 0;
#endif
printk(KERN_CRIT "%sWarning %s: Fixing swap signatures unimplemented...\n", name_resume, resume_file);
+ return 0;
}
extern kdev_t __init name_to_kdev_t(const char *line);
--
Worst form of spam? Adding advertisment signatures ala sourceforge.net.
What goes next? Inserting advertisment *into* email?
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2003-08-04 22:26 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-07-26 20:45 swsusp updates Pavel Machek
2003-07-26 21:05 ` Patrick Mochel
2003-07-26 21:03 ` Pavel Machek
2003-07-26 21:09 ` Patrick Mochel
2003-07-26 21:13 ` Pavel Machek
2003-07-26 21:31 ` Patrick Mochel
2003-07-26 21:35 ` Pavel Machek
2003-07-26 21:37 ` Pavel Machek
2003-07-26 22:32 ` "linux-power" tree [was Re: swsusp updates] Pavel Machek
-- strict thread matches above, loose matches on Subject: below --
2003-08-04 20:14 swsusp updates Pavel Machek
2003-08-04 20:43 ` Andrew Morton
2003-08-04 22:13 ` Pavel Machek
2003-08-04 22:27 ` Andrew Morton
2002-10-29 23:15 Pavel Machek
2002-09-21 21:12 Pavel Machek
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).