swsusp: killing sysrq-d support
Subsystems (4)
Hi!
swsusp supported being called from interrupt. I no longer think that's good idea. It killes tq_bdflush and cleans code up at pieces. This kills it.
[I'm not sure what version of pdflush.c do you have. If it rejects, then sorry, and just kill run_task_queue(&tq_pdflush) manually, or ignore it and I'll fix swsusp compilation in 2.5.18.]
Pavel
drivers/acpi/acpi_system.c +1 -3
@@ -774,11 +771,9 @@if (!system->states[state])return_VALUE (-ENODEV ); -#ifdef CONFIG_SOFTWARE_SUSPEND if (state ==4 ) { -/* We are working from process context, that's why we may call it directly. */ -do_software_suspend (); +software_suspend ();return_VALUE (count); }#endif
drivers/char/sysrq.c +0 -21
@@ -27,7 +27,6 @@#include <linux/quotaops.h> #include <linux/smp_lock.h> #include <linux/module.h> -#include <linux/suspend.h> #include <linux/spinlock.h>
@@ -318,22 +317,6 @@ 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 */
@@ -356,11 +339,7 @@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,
fs/buffer.c +0 -3
@@ -32,7 +32,6 @@#include <linux/writeback.h> #include <linux/mempool.h> #include <linux/hash.h> -#include <linux/suspend.h> #include <asm/bitops.h> #define BH_ENTRY (list) list_entry((list), struct buffer_head, b_assoc_buffers)
@@ -123,8 +122,6 @@smp_mb__after_clear_bit ();wake_up_buffer (bh); } - -DECLARE_TASK_QUEUE (tq_bdflush);/* * Block until a buffer comes unlocked. This doesn't stop it
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, tq_bdflush; +extern task_queue tq_timer, tq_immediate, tq_disk;/* * To implement your own list of active bottom halfs, use the following
kernel/suspend.c +7 -26
@@ -34,15 +34,6 @@* For TODOs,FIXMEs also look in Documentation/swsusp.txt */ -/* -* TODO: -* -* - we should launch a kernel_thread to process suspend request, cleaning up -* bdflush from this task. (check apm.c for something similar). -*/ - -/* FIXME: try to poison to memory */ -#include <linux/module.h> #include <linux/mm.h> #include <linux/swapctl.h>
@@ -847,9 +777,6 @@/* NOTREACHED */ } -/* forward decl */ -void do_software_suspend (void ); -/* * Magic happens here */
@@ -886,7 +813,6 @@#ifdef SUSPEND_CONSOLE update_screen (fg_console);/* Hmm, is this the problem? */ #endif - suspend_tq.routine = (void *)do_software_suspend; }static void do_magic_suspend_1 (void )
@@ -919,7 +841,6 @@drivers_resume (RESUME_PHASE1 );spin_unlock_irq (&suspend_pagedir_lock);mark_swapfiles (((swp_entry_t ) {0 }),MARK_SWAP_RESUME ); - suspend_tq.routine = (void *)do_software_suspend;printk (KERN_WARNING "%sLeaving do_magic_suspend_2...\n" , name_suspend); }
@@ -927,10 +848,9 @@#include <asm/suspend.h> /* -* This function is triggered using process bdflush. We try to swap out as -* much as we can then make a copy of the occupied pages in memory so we can -* make a copy of kernel state atomically, the I/O needed by saving won't -* bother us anymore. +* We try to swap out as much as we can then make a copy of the +* occupied pages in memory so we can make a copy of kernel state +* atomically, the I/O needed by saving won't bother us anymore. */ void do_software_suspend (void ) {
@@ -958,13 +877,9 @@restore_console (); } -struct tq_struct suspend_tq = - { routine: (void *)(void *)do_software_suspend, - data:0 }; -/* -* This is the trigger function, we must queue ourself since we -* can be called from interrupt && bdflush context is needed +* This is main interface to the outside world. It needs to be +* called from process context. */ void software_suspend (void ) {
@@ -972,8 +887,8 @@return ; software_suspend_enabled =0 ; -queue_task (&suspend_tq, &tq_bdflush); -wakeup_bdflush (); +BUG_ON (in_interrupt ()); +do_software_suspend (); }/* More restore stuff */
mm/pdflush.c +0 -3
@@ -108,9 +108,6 @@for ( ; ; ) {struct pdflush_work *pdf; -#ifdef CONFIG_SOFTWARE_SUSPEND -run_task_queue (&tq_bdflush); -#endif list_add (&my_work->list, &pdflush_list); my_work->when_i_went_to_sleep = jiffies;set_current_state (TASK_INTERRUPTIBLE );
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
please ignore this one -- Re: swsusp: killing sysrq-d support
Hi!
Please ignore this one, I'll create patch against 2.5.18.
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