swsusp for 2.5.2-pre7
Subsystems (16)
Hi!
This is swsusp ported to 2.5.2-pre7. Swsusp is neccessary for acpi S4 (suspend to disk) support. Please apply,
Pavel
CREDITS +7 -1
@@ -1661,6 +1661,11 @@ S: D-91080 Uttenreuth S: Germany +N: Gabor Kuti +E: [email protected] +E: [email protected] +D: Author and Maintainer for Software Suspend + N: Jaroslav Kysela E: [email protected] W: http://www.perex.cz
@@ -1833,7 +1838,8 @@ E: [email protected] E: [email protected] D: Softcursor for vga, hypertech cdrom support, vcsa bugfix, nbd -D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB +D: sun4/330 port, capabilities for elf, speedup for rm on ext2, USB, +D: x86-64 port, software suspend S: Volkova 1131 S: 198 00 Praha 9 S: Czech Republic
Documentation/Configure.help +25 -0
@@ -17282,6 +17282,31 @@ a work-around for a number of buggy BIOSes. Switch this option on if your computer crashes instead of powering off properly. +Software Suspend +CONFIG_SOFTWARE_SUSPEND + Enable the possibilty of suspendig machine. It doesn't need APM. + You may suspend your machine by either pressing Sysrq-d or with + 'swsusp' or 'shutdown -z <time>' (patch for sysvinit needed). It + creates an image which is saved in your active swaps. By the next + booting the kernel detects the saved image, restores the memory from + it and then it continues to run as before you've suspended. + If you don't want the previous state to continue use the 'noresume' + kernel option. However note that your partitions will be fsck'd and + you must re-mkswap your swap partitions/files. + + Right now you may boot without resuming and then later resume but + in meantime you cannot use those swap partitions/files which were + involved in suspending. Also in this case there is a risk that buffers + on disk won't match with saved ones. + + SMP is supported ``as-is''. There's a code for it but doesn't work. + There have been problems reported relating SCSI. + + This option is about getting stable. However there is still some + absence of features. + + For more information take a look at Documentation/swsusp.txt. + Watchdog Timer Support CONFIG_WATCHDOG If you say Y here (and to one of the following options) and create a
MAINTAINERS +8 -0
@@ -1368,6 +1368,14 @@ L: [email protected] S: Maintained +SOFTWARE SUSPEND: +P: Gabor Kuti +M: [email protected] +M: [email protected] +L: http://lister.fornax.hu/mailman/listinfo/swsusp +W: http://falcon.sch.bme.hu/~seasons/linux +S: Maintained + SONIC NETWORK DRIVER P: Thomas Bogendoerfer M: [email protected]
Only in linux-swsusp.pre/arch/i386/boot: bbootsect Only in linux-swsusp.pre/arch/i386/boot: bsetup
Only in linux-swsusp.pre/arch/i386/boot: bzImage
Only in linux-swsusp.pre/arch/i386/boot/compressed: bvmlinux Only in linux-swsusp.pre/arch/i386/boot/compressed: bvmlinux.out
arch/i386/config.in +3 -0
@@ -407,6 +407,9 @@ mainmenu_option next_comment comment 'Kernel hacking' +if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then + dep_bool 'Software Suspend' CONFIG_SOFTWARE_SUSPEND $CONFIG_PM +fi bool 'Kernel debugging' CONFIG_DEBUG_KERNEL if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then
arch/i386/defconfig +1 -0
@@ -105,6 +105,7 @@ CONFIG_BINFMT_MISC=y CONFIG_PM=y # CONFIG_APM is not set +# CONFIG_SOFTWARE_SUSPEND is not set # # Memory Technology Devices (MTD)
arch/i386/kernel/apm.c +1 -0
@@ -1685,6 +1685,7 @@daemonize ();strcpy (current->comm,"kapm-idled" ); + current->flags |=PF_IOTHREAD ;sigfillset (¤t->blocked); current->tty =NULL ;/* get rid of controlling tty */
arch/i386/kernel/signal.c +4 -0
@@ -20,6 +20,7 @@#include <linux/stddef.h> #include <linux/tty.h> #include <linux/personality.h> +#include <linux/suspend.h> #include <asm/ucontext.h> #include <asm/uaccess.h> #include <asm/i387.h>
@@ -594,6 +595,9 @@*/ if ((regs->xcs &3 ) !=3 )return 1 ; + +if (current->flags &PF_FREEZE ) +refrigerator ();if (!oldset) oldset = ¤t->blocked;
arch/i386/vmlinux.lds +6 -0
@@ -54,6 +54,12 @@ __init_end = .; . = ALIGN(4096); + __nosave_begin = .; + .data_nosave : { *(.data.nosave) } + . = ALIGN(4096); + __nosave_end = .; + + . = ALIGN(4096); .data.page_aligned : { *(.data.idt) } . = ALIGN(32);
drivers/acpi/ospm/system/sm_osl.c +4 -1
@@ -140,7 +140,10 @@if (system->states[value] != TRUE)return -EINVAL ; -sm_osl_suspend (value); +if (value !=ACPI_S4 ) +sm_osl_suspend (value); +else +software_suspend ();return (count); }
drivers/char/sysrq.c +21 -0
@@ -27,6 +27,7 @@#include <linux/quotaops.h> #include <linux/smp_lock.h> #include <linux/module.h> +#include <linux/suspend.h> #include <linux/spinlock.h>
@@ -332,6 +333,22 @@ action_msg: "Kill All Tasks (even init)", }; +#ifdef CONFIG_SOFTWARE_SUSPEND +static void sysrq_handle_swsusp (int key,struct pt_regs *pt_regs, +struct kbd_struct *kbd,struct tty_struct *tty) { +if (!software_suspend_enabled) { +printk ("Software Suspend is not possible now\n" ); +return ; + } +software_suspend (); +} +static struct sysrq_key_op sysrq_swsusp_op = { + handler: sysrq_handle_swsusp, + help_msg:"suspenD" , + action_msg:"Software suspend\n" , +}; +#endif +/* END SIGNAL SYSRQ HANDLERS BLOCK */
@@ -354,7 +371,11 @@and will never arive */ /* b */ &sysrq_reboot_op,/* c */ NULL , +#ifdef CONFIG_SOFTWARE_SUSPEND +/* d */ &sysrq_swsusp_op, +#else/* d */ NULL , +#endif/* e */ &sysrq_term_op,/* f */ NULL , /* g */ NULL,
drivers/usb/storage/usb.c +1 -0
@@ -316,6 +316,7 @@*/ exit_files (current); current->files = init_task.files; + current->flags |=PF_IOTHREAD ;atomic_inc (¤t->files->count);daemonize ();
fs/buffer.c +7 -0
@@ -130,6 +130,8 @@wake_up (&bh->b_wait); } +DECLARE_TASK_QUEUE (tq_bdflush); +/* * Rewrote the wait-routines to use the "new" wait-queue functionality, * and getting rid of the cli-sti pairs. The wait-queue routines still
@@ -2669,6 +2671,9 @@for (;;) { CHECK_EMERGENCY_SYNC +#ifdef CONFIG_SOFTWARE_SUSPEND +run_task_queue (&tq_bdflush); +#endif spin_lock (&lru_list_lock);if (!write_some_buffers (NODEV ) ||balance_dirty_state () <0 ) {
@@ -2707,6 +2712,8 @@/* update interval */ interval = bdf_prm.b_un.interval; +if (current->flags &PF_FREEZE ) +refrigerator ();if (interval) { tsk->state =TASK_INTERRUPTIBLE ;schedule_timeout (interval);
fs/jbd/journal.c +3 -0
@@ -36,6 +36,7 @@#include <linux/slab.h> #include <asm/uaccess.h> #include <linux/proc_fs.h> +#include <linux/suspend.h> EXPORT_SYMBOL (journal_start);EXPORT_SYMBOL (journal_try_start);
@@ -249,6 +250,8 @@interruptible_sleep_on (&journal->j_wait_commit);jbd_debug (1 ,"kjournald wakes\n" ); +if (current->flags &PF_FREEZE ) +refrigerator ();/* Were we woken up by a commit wakeup event? */ if ((transaction = journal->j_running_transaction) != NULL &&
include/asm-generic/bitops.h +6 -0
@@ -51,6 +51,12 @@return ((mask & *addr) !=0 ); } +/* +* fls: find last bit set. +*/ + +#define fls (x) generic_fls(x) +#ifdef __KERNEL__/*
include/asm-i386/bitops.h +6 -0
@@ -330,6 +330,12 @@return word; } +/* +* fls: find last bit set. +*/ + +#define fls (x) generic_fls(x) +#ifdef __KERNEL__/**
include/asm-i386/suspend.h +301 -0
301 lines not on this page · raw message
Only in linux-swsusp.pre/include: config
include/linux/bitops.h +42 -1
54 lines not on this page · raw message
include/linux/init.h +3 -0
@@ -111,6 +111,9 @@*/ #define module_exit (x) __exitcall(x); +/* Data marked not to be saved by software_suspend() */ +#define __nosavedata __attribute__ ((__section__ (".data.nosave"))) +#else #define __init
include/linux/mm.h +7 -0
@@ -282,6 +282,7 @@#define PG_arch_1 13#define PG_reserved 14#define PG_launder 15/* written out by VM pressure.. */ +#define PG_nosave 29/* Make it prettier to test the above... */ #define UnlockPage (page) unlock_page(page)
@@ -335,6 +336,12 @@#define SetPageReserved (page) set_bit(PG_reserved, &(page)->flags)#define ClearPageReserved (page) clear_bit(PG_reserved, &(page)->flags) + +#define PageNosave (page) test_bit(PG_nosave, &(page)->flags) +#define PageSetNosave (page) set_bit(PG_nosave, &(page)->flags) +#define PageTestandSetNosave (page) test_and_set_bit(PG_nosave, &(page)->flags) +#define PageClearNosave (page) clear_bit(PG_nosave, &(page)->flags) +#define PageTestandClearNosave (page) test_and_clear_bit(PG_nosave, &(page)->flags)/* * Error return values for the *_nopage functions
Only in linux-swsusp.pre/include/linux: modules Only in linux-swsusp.pre/include/linux: modversions.h
include/linux/reboot.h +9 -0
@@ -20,6 +20,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 */ #define LINUX_REBOOT_CMD_RESTART 0x01234567
@@ -28,6 +29,7 @@#define LINUX_REBOOT_CMD_CAD_OFF 0x00000000#define LINUX_REBOOT_CMD_POWER_OFF 0x4321FEDC#define LINUX_REBOOT_CMD_RESTART2 0xA1B2C3D4 +#define LINUX_REBOOT_CMD_SW_SUSPEND 0xD000FCE2#ifdef __KERNEL__
@@ -45,6 +47,13 @@extern void machine_restart (char *cmd);extern void machine_halt (void );extern void machine_power_off (void ); + +/* +* Architecture-independent suspend facility +*/ + +extern void software_suspend (void ); +extern unsigned char software_suspend_enabled;#endif
include/linux/sched.h +5 -0
@@ -433,6 +433,11 @@#define PF_MEMDIE 0x00001000/* Killed for out-of-memory */ #define PF_FREE_PAGES 0x00002000/* per process page freeing */ #define PF_NOIO 0x00004000/* avoid generating further I/O */ +#define PF_FROZEN 0x00008000/* frozen for system suspend */ +#define PF_FREEZE 0x00010000/* this task should be frozen for suspend */ +#define PF_IOTHREAD 0x00020000/* this thread is needed for doing I/O +to swap file */ +#define PF_USEDFPU 0x00100000/* task used FPU this quantum (SMP) */
include/linux/suspend.h +65 -0
65 lines not on this page · raw message
include/linux/tqueue.h +1 -1
@@ -66,7 +66,7 @@#define DECLARE_TASK_QUEUE (q) LIST_HEAD(q)#define TQ_ACTIVE (q) (!list_empty(&q)) -extern task_queue tq_timer, tq_immediate, tq_disk; +extern task_queue tq_timer, tq_immediate, tq_disk, tq_bdflush;/* * To implement your own list of active bottom halfs, use the following
init/main.c +4 -0
@@ -27,6 +27,7 @@#include <linux/iobuf.h> #include <linux/bootmem.h> #include <linux/tty.h> +#include <linux/suspend.h> #include <asm/io.h> #include <asm/bugs.h>
@@ -534,6 +535,9 @@#ifdef CONFIG_PCMCIA init_pcmcia_ds ();/* Do this last */ #endif +/* This has to be before mounting root, because even readonly mount of reiserfs would replay +log corrupting stuff */ +software_resume (); }extern void prepare_namespace (void );
kernel/Makefile +1 -0
@@ -20,6 +20,7 @@ obj-$(CONFIG_UID16) += uid16.o obj-$(CONFIG_MODULES) += ksyms.o obj-$(CONFIG_PM) += pm.o +obj-$(CONFIG_SOFTWARE_SUSPEND) += suspend.o ifneq ($(CONFIG_IA64),y) # According to Alan Modra <[email protected]>, the -fno-omit-frame-pointer is
kernel/context.c +1 -0
@@ -72,6 +72,7 @@daemonize ();strcpy (curtask->comm,"keventd" ); + current->flags |=PF_IOTHREAD ; keventd_running =1 ; keventd_task = curtask;
kernel/signal.c +1 -1
@@ -463,7 +463,7 @@* No need to set need_resched since signal event passing * goes through ->blocked */ -static inline void signal_wake_up (struct task_struct *t) +inline void signal_wake_up (struct task_struct *t) { t->sigpending =1 ;
kernel/softirq.c +1 -0
@@ -366,6 +366,7 @@daemonize (); current->nice =19 ; + current->flags |=PF_IOTHREAD ;sigfillset (¤t->blocked);/* Migrate to the right CPU */
kernel/suspend.c +1264 -0
1,264 lines not on this page · raw message
kernel/sys.c +11 -0
@@ -4,6 +4,7 @@* Copyright (C) 1991, 1992 Linus Torvalds */ +#include <linux/config.h> #include <linux/module.h> #include <linux/mm.h> #include <linux/utsname.h>
@@ -322,6 +323,16 @@printk (KERN_EMERG "Restarting system with command '%s'.\n" , buffer);machine_restart (buffer);break ; + +#ifdef CONFIG_SOFTWARE_SUSPEND +case LINUX_REBOOT_CMD_SW_SUSPEND : +if (!software_suspend_enabled) +return -EAGAIN ; + +software_suspend (); +do_exit (0 ); +break ; +#endif default :unlock_kernel ();
mm/page_alloc.c +45 -2
65 lines not on this page · raw message
mm/vmscan.c +5 -1
@@ -731,8 +731,12 @@add_wait_queue (&kswapd_wait, &wait);mb (); -if (kswapd_can_sleep ()) +if (kswapd_can_sleep ()) { +if (current->flags &PF_FREEZE ) +refrigerator ();schedule (); + } +__set_current_state (TASK_RUNNING );remove_wait_queue (&kswapd_wait, &wait);
Only in linux-swsusp.pre/scripts: mkdep
Only in linux-swsusp.pre/scripts: split-include
Signature · 2 lines
(about SSSCA) "I don't say this lightly. However, I really think that the U.S. no longer is classifiable as a democracy, but rather as a plutocracy." --hpa