swsusp for 2.4.17 -- newer ide supported
Subsystems (18)
Hi!
This is newer version of swsusp patch. It now supports newer ide driver (which just about everybody uses). It sometimes fails to suspend when top is running, otherwise no bugs are known. Try to break this one!
Pavel
CREDITS +7 -1
@@ -1666,6 +1666,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
@@ -1838,7 +1843,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
@@ -112,6 +112,31 @@ like MGA monitors that you are very unlikely to see on today's systems. +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. + Symmetric Multi-Processing support CONFIG_SMP This enables support for systems with more than one CPU. If you have
MAINTAINERS +8 -0
@@ -1378,6 +1378,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]
arch/i386/config.in +3 -0
@@ -404,6 +404,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
@@ -1677,6 +1677,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/process.c +14 -0
@@ -736,6 +736,20 @@ } } +#ifdef CONFIG_SOFTWARE_SUSPEND +/* +* We reload there esp0, LDT, page table pointer only. Other processor +* registers including segment ones are restored before calling this function +*/ +void activate_task (struct task_struct *tsk_p) +{ +struct thread_struct *tsk = &tsk_p->thread; +struct tss_struct *tss = init_tss +smp_processor_id (); + + tss->esp0 = tsk->esp0; +} +#endif + asmlinkage int sys_fork(struct pt_regs regs) {return do_fork (SIGCHLD , regs.esp, ®s,0 );
arch/i386/kernel/signal.c +7 -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>
@@ -595,6 +596,11 @@if ((regs->xcs &3 ) !=3 )return 1 ; +if (current->flags &PF_FREEZE ) { +refrigerator (); + goto no_signal; + } +if (!oldset) oldset = ¤t->blocked;
@@ -705,6 +711,7 @@return 1 ; } + no_signal:/* Did we come from a system call? */ if (regs->orig_eax >=0 ) {/* Restart the system call - no handlers present */
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.c +3 -1
@@ -146,7 +146,9 @@ system->states[i] = TRUE; } } - +#ifdef CONFIG_SOFTWARE_SUSPEND + system->states[4 ] = TRUE;; +#endif status =sm_osl_add_device (system);if (ACPI_FAILURE (status)) { goto end;
drivers/acpi/ospm/system/sm_osl.c +10 -3
@@ -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); }
@@ -685,6 +688,9 @@*/ if (state ==ACPI_S2 || state ==ACPI_S3 ) {#ifdef DONT_USE_UNTIL_LOWLEVEL_CODE_EXISTS +/* That && trick is *not going to work*. Read gcc +specs. That explicitely says: jumping from other +function is *not allowed*. */ wakeup_address =acpi_save_state_mem ((unsigned long )&&acpi_sleep_done);if (!wakeup_address) goto acpi_sleep_done;
@@ -692,11 +698,12 @@acpi_set_firmware_waking_vector ( (ACPI_PHYSICAL_ADDRESS )wakeup_address);#endif - } else if (state == ACPI_S4) + }else if (state ==ACPI_S4 ) {#ifdef DONT_USE_UNTIL_LOWLEVEL_CODE_EXISTS if (acpi_save_state_disk ((unsigned long )&&acpi_sleep_done)) - goto acpi_sleep_done; + goto acpi_sleep_done#endif + }/* set status, since acpi_enter_sleep_state won't return unless something * goes wrong, or it's just S1.
drivers/block/ll_rw_blk.c +5 -0
@@ -816,6 +816,9 @@* particular, no other flags, are changed by generic_make_request or * any lower level drivers. * */ + +kdev_t suspend_device; +void generic_make_request (int rw,struct buffer_head * bh) {int major =MAJOR (bh->b_rdev);
@@ -824,6 +827,8 @@if (!bh->b_end_io)BUG (); +if (suspend_device && (bh->b_rdev != suspend_device)) +panic ("Attempted to corrupt disk." );/* Test device size, when known. */ if (blk_size[major])
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/char/tty_io.c +1 -0
@@ -223,6 +223,7 @@ }if (tty->magic !=TTY_MAGIC ) {printk (badmagic,kdevname (device), routine); +printk ("Magic should be %lx, is %lx (@%lx)\n" , tty->magic,TTY_MAGIC , &tty->magic);return 1 ; }#endif
drivers/ide/hd.c +7 -0
@@ -346,6 +346,13 @@hd_request (); } +void do_reset_hd (void ) +{ +DEVICE_INTR =NULL ; + reset =1 ; +reset_hd (); +} +/* * Ok, don't know what to do with the unexpected interrupts: on some machines * doing a reset and a retry seems to result in an eternal loop. Right now I
drivers/ide/ide-disk.c +73 -0
97 lines not on this page · raw message
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
@@ -129,6 +129,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
@@ -2785,6 +2787,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 ) {
@@ -2823,6 +2828,8 @@/* update interval */ interval = bdf_prm.b_un.interval; +if (current->flags &PF_FREEZE ) +refrigerator ();if (interval) { tsk->state =TASK_INTERRUPTIBLE ;schedule_timeout (interval);
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 +308 -0
308 lines not on this page · raw message
include/linux/bitops.h +42 -1
54 lines not on this page · raw message
include/linux/ide.h +2 -3
@@ -468,7 +468,7 @@ typedef struct hwif_s { struct hwif_s *next; /* for linked-list in ide_hwgroup_t */ - void *hwgroup; /* actually (ide_hwgroup_t *) */ + struct hwgroup_s *hwgroup; /* actually (ide_hwgroup_t *) */ ide_ioreg_t io_ports[IDE_NR_PORTS]; /* task file registers */ hw_regs_t hw; /* Hardware info */ ide_drive_t drives[MAX_DRIVES]; /* drive info */
@@ -543,6 +543,7 @@ typedef struct hwgroup_s { ide_handler_t *handler;/* irq handler, if active */ + ide_handler_t *handler_save;/* irq handler, if active */ volatile int busy; /* BOOL: protects all fields below */ int sleeping; /* BOOL: wake us up on timer expiry */ ide_drive_t *drive; /* current drive */
@@ -697,11 +698,9 @@* structure directly (the allocation/layout may change!). * */ -#ifndef _IDE_Cextern ide_hwif_t ide_hwifs[];/* master data repository */ extern ide_module_t *ide_modules;extern ide_module_t *ide_probe; -#endif extern int noautodma;/*
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 /* MODULE */ #define __init
include/linux/mm.h +7 -0
@@ -285,6 +285,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)
@@ -338,6 +339,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
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 +3 -0
@@ -427,6 +427,9 @@#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 */ #define PF_USEDFPU 0x00100000/* task used FPU this quantum (SMP) */
include/linux/suspend.h +64 -0
64 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 +5 -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>
@@ -765,6 +766,10 @@#endif rd_load ();#endif + +/* This has to be before mounting root, because even readonly mount of reiserfs would replay +log corrupting stuff */ +software_resume ();/* Mount the root filesystem.. */ mount_root ();
kernel/Makefile +1 -0
@@ -19,6 +19,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 +1294 -0
1,294 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 +41 -0
53 lines not on this page · raw message
mm/page_io.c +4 -0
@@ -87,11 +87,15 @@* - it's marked as being swap-cache * - it's associated with the swap inode */ +extern long suspend_device;void rw_swap_page (int rw,struct page *page) {swp_entry_t entry; entry.val = page->index; + +if (suspend_device) +panic ("I refuse to corrupt memory/swap." );if (!PageLocked (page))PAGE_BUG (page);
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.24/scripts: mkdep
Only in linux-swsusp.24/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
On 28 Jan 2002, Pavel Machek typed:
] This is newer version of swsusp patch. It now supports newer ide ] driver (which just about everybody uses). It sometimes fails to ] suspend when top is running, otherwise no bugs are known. Try to break ] this one!
(As with previous versions) it does not work with ext3:
Cut and paste from syslog:
twilight kernel: SysRq : Software suspend
twilight kernel:
twilight kernel: Suspend Machine: Stopping processes twilight kernel: Suspend Machine: Waiting for tasks to stop... :::::::::::::::::::::::::::: twilight kernel: stopping tasks failed (1 tasks remaining) twilight kernel: Suspend Machine: Not all processes stopped! twilight kernel: Resume Machine: Restarting tasks...<6> Strange, kjournald not stopped twilight kernel: done twilight kernel: Resume Machine: Done resume from 0
Regards,
Kim
Quoted 7 lines · Pavel Machek
Hi!
This is newer version of swsusp patch. It now supports newer ide driver (which just about everybody uses). It sometimes fails to suspend when top is running, otherwise no bugs are known. Try to break this one!
Pavel
Having just (accidentally :) found out that my laptop does not survive 3 days on suspend to ram I gotta ask... Will this version work with ext3? If so then I can try and break it. I just don't wanna use something that is known to be rude to filesystems. I like my data. :)
Signature · 6 lines
SOCCER PLAYER IN GENITAL-BITING SCANDAL --- "It was something between
friends that I thought would have no importance until this morning when
I got up and saw all the commotion in the news," Gallardo told a news
conference. "It stunned me."
Reyes told Marca that he had "felt a slight pinch."
-- http://www.azcentral.com/offbeat/articles/1129soccer29-ON.htmlext3 & swsusp [was Re: [swsusp] swsusp for 2.4.17 -- newer ide supported]
In reply to Pavel MachekHi!
Quoted 10 lines
] This is newer version of swsusp patch. It now supports newer ide ] driver (which just about everybody uses). It sometimes fails to ] suspend when top is running, otherwise no bugs are known. Try to break ] this one!
(As with previous versions) it does not work with ext3:
Cut and paste from syslog:
twilight kernel: SysRq : Software suspend
twilight kernel:
Quoted 7 lines
twilight kernel: Suspend Machine: Stopping processes twilight kernel: Suspend Machine: Waiting for tasks to stop... :::::::::::::::::::::::::::: twilight kernel: stopping tasks failed (1 tasks remaining) twilight kernel: Suspend Machine: Not all processes stopped! twilight kernel: Resume Machine: Restarting tasks...<6> Strange, kjournald not stopped twilight kernel: done twilight kernel: Resume Machine: Done resume from 0
Yup, known, and I even had patch for this from someone from swsusp mailing list. Could that preson please mail it to me once again?
Pavel
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
Hi!
Quoted 9 lines
Quoted 4 lines
This is newer version of swsusp patch. It now supports newer ide driver (which just about everybody uses). It sometimes fails to suspend when top is running, otherwise no bugs are known. Try to break this one!
Having just (accidentally :) found out that my laptop does not survive 3 days on suspend to ram I gotta ask... Will this version work with ext3? If so then I can try and break it. I just don't wanna use something that is known to be rude to filesystems. I like my data. :)
This version will refuse to suspend with ext3 in place; patch should be somewhere in mailing lists of swsusp. I'll try to get it and merge.
Pavel
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