swsusp ported to 2.4.19-pre5-ac2
Subsystems (20)
Hi!
Not much tested (its 2am here) -- it compiles and it should work. I killed pcnet32 pieces because it seemed too difficult to resolve.
Pavel
Only in linux-ac: .config
CREDITS +15 -1
@@ -501,6 +501,14 @@ S: Fremont, California 94539 S: USA +N: Florent Chabaud +E: [email protected] +D: software suspend +S: SGDN/DCSSI +S: 58, Bd Latour-Maubourg +S: 75700 Paris 07 SP +S: France + N: Gordon Chaffee E: [email protected] W: http://bmrc.berkeley.edu/people/chaffee/
@@ -1696,6 +1704,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
@@ -1868,7 +1881,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
@@ -1467,6 +1467,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-ac/arch/i386/boot: bbootsect
Only in linux-ac/arch/i386/boot: bsetup
Only in linux-ac/arch/i386/boot: bzImage
Only in linux-ac/arch/i386/boot/compressed: bvmlinux Only in linux-ac/arch/i386/boot/compressed: bvmlinux.out
arch/i386/config.in +3 -0
@@ -418,6 +418,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
@@ -110,6 +110,7 @@ # CONFIG_IKCONFIG is not set 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
@@ -1659,6 +1659,7 @@daemonize ();strcpy (current->comm,"kapmd" ); + current->flags |=PF_IOTHREAD ;sigfillset (¤t->blocked);if (apm_info.connection_version ==0 ) {
arch/i386/kernel/process.c +14 -0
@@ -738,6 +738,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 (0 ); + goto no_signal; + } +if (!oldset) oldset = ¤t->blocked;
@@ -702,6 +708,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
@@ -53,6 +53,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 +7 -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); }
@@ -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;
drivers/block/ll_rw_blk.c +5 -0
@@ -1017,6 +1017,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);
@@ -1025,6 +1028,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/block/loop.c +3 -3
@@ -71,11 +71,11 @@#include <linux/smp_lock.h> #include <linux/swap.h> #include <linux/slab.h> +#include <linux/loop.h> +#include <linux/suspend.h> #include <asm/uaccess.h> -#include <linux/loop.h> -#define MAJOR_NR LOOP_MAJORstatic int max_loop =8 ;
@@ -578,7 +578,7 @@atomic_inc (&lo->lo_pending);spin_unlock_irq (&lo->lo_lock); - current->flags |=PF_NOIO ; + current->flags |=PF_NOIO |PF_IOTHREAD ;/* * up sem, we are running
Only in linux-ac/drivers/char: consolemap_deftbl.c
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>
@@ -317,6 +318,22 @@ action_msg: "Kill All Tasks", }; +#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 */
@@ -339,7 +356,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/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/net/eepro100.c +0 -2
@@ -524,10 +524,8 @@static int eepro100_init_one (struct pci_dev *pdev,const struct pci_device_id *ent);static void eepro100_remove_one (struct pci_dev *pdev); -#ifdef CONFIG_PM static int eepro100_suspend (struct pci_dev *pdev,u32 state);static int eepro100_resume (struct pci_dev *pdev); -#endif static int do_eeprom_cmd (long ioaddr,int cmd,int cmd_len);static int mdio_read (long ioaddr,int phy_id,int location);
Only in linux-ac/drivers/net/hamradio/soundmodem: gentbl Only in linux-ac/drivers/net/hamradio/soundmodem: sm_tbl_afsk1200.h Only in linux-ac/drivers/net/hamradio/soundmodem: sm_tbl_afsk2400_7.h Only in linux-ac/drivers/net/hamradio/soundmodem: sm_tbl_afsk2400_8.h Only in linux-ac/drivers/net/hamradio/soundmodem: sm_tbl_afsk2666.h Only in linux-ac/drivers/net/hamradio/soundmodem: sm_tbl_fsk9600.h Only in linux-ac/drivers/net/hamradio/soundmodem: sm_tbl_hapn4800.h Only in linux-ac/drivers/net/hamradio/soundmodem: sm_tbl_psk4800.h
drivers/net/pcnet32.c +6 -13
@@ -1174,19 +1174,12 @@if (err_status &0x04000000 ) lp->stats.tx_aborted_errors++;if (err_status &0x08000000 ) lp->stats.tx_carrier_errors++;if (err_status &0x10000000 ) lp->stats.tx_window_errors++; -#ifndef DO_DXSUFLO if (err_status & 0x40000000) { lp->stats.tx_fifo_errors++; -/* Ackk! On FIFO errors the Tx unit is turned off! */ -/* Remove this verbosity later! */ -printk (KERN_ERR "%s: Tx FIFO error! CSR0=%4.4x\n" , - dev->name, csr0); - must_restart =1 ; - } -#else -if (err_status &0x40000000 ) { - lp->stats.tx_fifo_errors++; -if (! lp->dxsuflo) {/* If controller doesn't recover ... */ +#ifdef DO_DXSUFLO + if (! lp->dxsuflo) +#endif + { /* If controller doesn't recover ... */ /* Ackk! On FIFO errors the Tx unit is turned off! */ /* Remove this verbosity later! */ printk(KERN_ERR "%s: Tx FIFO error! CSR0=%4.4x\n",
@@ -1194,7 +1187,6 @@ must_restart =1 ; } } -#endif }else {if (status &0x1800 ) lp->stats.collisions++;
@@ -1721,12 +1713,13 @@ } } +module_init (pcnet32_init_module);module_exit (pcnet32_cleanup_module);/* * Local variables: -* compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c pcnet32.c" +* compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/include/linux -Wall -Wstrict-prototypes -O2 -m486 -c pcnet32.c" * c-indent-level: 4 * tab-width: 8 * End:
Only in linux-ac/drivers/pci: classlist.h
Only in linux-ac/drivers/pci: devlist.h
Only in linux-ac/drivers/pci: gen-devlist
drivers/pci/pci.c +2 -2
@@ -1629,7 +1629,7 @@return error; } -static int pci_pm_suspend (u32 state) +int pci_pm_suspend (u32 state) {struct list_head *list;struct pci_bus *bus;
@@ -1642,7 +1642,7 @@return 0 ; } -static int pci_pm_resume (void ) +int pci_pm_resume (void ) {struct list_head *list;struct pci_bus *bus;
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 ();reparent_to_init ();
fs/buffer.c +9 -1
@@ -48,6 +48,7 @@#include <linux/module.h> #include <linux/completion.h> #include <linux/mm_inline.h> +#include <linux/suspend.h> #include <asm/uaccess.h> #include <asm/io.h>
@@ -130,6 +131,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
@@ -2942,6 +2945,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 ) {
@@ -2974,11 +2980,13 @@spin_unlock_irq (&tsk->sigmask_lock);complete ((struct completion *)startup); - + current->flags |=PF_KERNTHREAD ;for (;;) {/* update interval */ interval = bdf_prm.b_un.interval; +if (current->flags &PF_FREEZE ) +refrigerator (PF_IOTHREAD );if (interval) { tsk->state =TASK_INTERRUPTIBLE ;schedule_timeout (interval);
fs/jbd/journal.c +11 -1
@@ -34,6 +34,7 @@#include <linux/init.h> #include <linux/mm.h> #include <linux/slab.h> +#include <linux/suspend.h> #include <asm/uaccess.h> #include <linux/proc_fs.h>
@@ -227,6 +228,7 @@ journal->j_commit_interval / HZ);list_add (&journal->j_all_journals, &all_journals); + current->flags |=PF_KERNTHREAD ;/* And now, wait forever for commit wakeup events. */ while (1 ) {if (journal->j_flags &JFS_UNMOUNT )
@@ -247,7 +249,15 @@ }wake_up (&journal->j_wait_done_commit); -interruptible_sleep_on (&journal->j_wait_commit); +if (current->flags &PF_FREEZE ) {/* The simpler the better. Flushing journal isn't a +good idea, because that depends on threads that +may be already stopped. */ +jbd_debug (1 ,"Now suspending kjournald\n" ); +refrigerator (PF_IOTHREAD ); +jbd_debug (1 ,"Resuming kjournald\n" ); + }else /* we assume on resume that commits are already there, +so we don't sleep */ +interruptible_sleep_on (&journal->j_wait_commit);jbd_debug (1 ,"kjournald wakes\n" );
fs/reiserfs/journal.c +10 -1
@@ -58,6 +58,7 @@#include <linux/stat.h> #include <linux/string.h> #include <linux/smp_lock.h> +#include <linux/suspend.h> /* the number of mounted filesystems. This is used to decide when to ** start and kill the commit thread
@@ -1872,6 +1873,7 @@spin_unlock_irq (¤t->sigmask_lock);sprintf (current->comm,"kreiserfsd" ) ; + current->flags |=PF_KERNTHREAD ;lock_kernel () ;while (1 ) {
@@ -1885,7 +1887,14 @@break ; }wake_up (&reiserfs_commit_thread_done) ; -interruptible_sleep_on_timeout (&reiserfs_commit_thread_wait,5 *HZ ) ; +#ifdef CONFIG_SOFTWARE_SUSPEND +if (current->flags &PF_FREEZE ) { +printk ("Now suspending kreiserfsd\n" ); +refrigerator (PF_IOTHREAD ); +printk ("Resuming kreiserfsd\n" ); + } else +#endif +interruptible_sleep_on_timeout (&reiserfs_commit_thread_wait,5 *HZ ) ; }unlock_kernel () ;wake_up (&reiserfs_commit_thread_done) ;
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
@@ -413,6 +413,12 @@return word; } +/* +* fls: find last bit set. +*/ + +#define fls (x) generic_fls(x) +#ifdef __KERNEL__/**
include/asm-i386/suspend.h +313 -0
313 lines not on this page · raw message
Only in linux-ac/include: config
include/linux/bitops.h +42 -1
54 lines not on this page · raw message
include/linux/ide.h +1 -0
@@ -624,6 +624,7 @@ typedef struct hwgroup_s { ide_handler_t *handler;/* irq handler, if active */ + ide_handler_t *handler_save;/* for suspend */ volatile int busy; /* BOOL: protects all fields below */ int sleeping; /* BOOL: wake us up on timer expiry */ ide_drive_t *drive; /* current drive */
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
@@ -303,6 +303,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)
@@ -363,6 +364,12 @@#define SetPageReserved (page) set_bit(PG_reserved, &(page)->flags)#define ClearPageReserved (page) clear_bit(PG_reserved, &(page)->flags)#define __SetPageReserved (page) __set_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)#define PageLRU (pp) \ (PageActive(pp) | PageInactiveDirty(pp) | PageInactiveClean(pp))
Only in linux-ac/include/linux: modules
Only in linux-ac/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 +4 -0
@@ -427,6 +427,10 @@#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_KERNTHREAD 0x00040000/* this thread is a kernel thread that cannot be sent signals to */ #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 +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>
@@ -520,6 +521,10 @@#ifdef CONFIG_TC tc_init ();#endif + +/* This has to be before mounting root, because even readonly mount of reiserfs would replay +log corrupting stuff */ +software_resume ();/* Networking initialization needs a process context */ sock_init ();
kernel/Makefile +2 -1
@@ -9,7 +9,7 @@ O_TARGET := kernel.o -export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o printk.o +export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o printk.o suspend.o obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \ module.o exit.o itimer.o info.o time.o softirq.o resource.o \
@@ -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 obj-$(CONFIG_IKCONFIG) += configs.o ifneq ($(CONFIG_IA64),y)
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
@@ -492,7 +492,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
@@ -365,6 +365,7 @@daemonize ();set_user_nice (current,19 ); + current->flags |=PF_IOTHREAD ;sigfillset (¤t->blocked);/* Migrate to the right CPU */
kernel/suspend.c +1374 -0
1,374 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
@@ -25,6 +25,7 @@#include <linux/file.h> #include <linux/compiler.h> #include <linux/mm_inline.h> +#include <linux/suspend.h> #include <asm/pgalloc.h>
@@ -672,13 +673,16 @@* us from recursively trying to free more memory as we're * trying to free the first piece of memory in the first place). */ - tsk->flags |=PF_MEMALLOC ; + tsk->flags |=PF_MEMALLOC |PF_KERNTHREAD ;/* * Kswapd main loop. */ for (;;) {static long recalc =0 ; + +if (current->flags &PF_FREEZE ) +refrigerator (PF_IOTHREAD );/* * We try to rebalance the VM either when we have a
Only in linux-ac/scripts: mkdep
Only in linux-ac/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