
From: Christian Leber <christian@leber.de>

Ky box (2.6.9-final) was yesterday completly stalled (mouse movable and
stupid loadmeter was still working) after starting mutt and was swapping
for half an hour until I sent SIGTERM to all processes.  I suspect it was a
2 GB big galeon process that was the problem.

I think sysrq needs a key to call oom_kill manually.

Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 25-akpm/Documentation/sysrq.txt |    2 ++
 25-akpm/drivers/char/sysrq.c    |   16 ++++++++++++++--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff -puN Documentation/sysrq.txt~make-sysrq-f-call-oom_kill Documentation/sysrq.txt
--- 25/Documentation/sysrq.txt~make-sysrq-f-call-oom_kill	2005-01-22 23:30:57.142821512 -0800
+++ 25-akpm/Documentation/sysrq.txt	2005-01-22 23:30:57.147820752 -0800
@@ -73,6 +73,8 @@ On all -  write a character to /proc/sys
           it so that only emergency messages like PANICs or OOPSes would
           make it to your console.)
 
+'f'	- Will call oom_kill to kill a memory hog process
+
 'e'     - Send a SIGTERM to all processes, except for init.
 
 'i'     - Send a SIGKILL to all processes, except for init.
diff -puN drivers/char/sysrq.c~make-sysrq-f-call-oom_kill drivers/char/sysrq.c
--- 25/drivers/char/sysrq.c~make-sysrq-f-call-oom_kill	2005-01-22 23:30:57.143821360 -0800
+++ 25-akpm/drivers/char/sysrq.c	2005-01-22 23:30:57.147820752 -0800
@@ -31,7 +31,7 @@
 #include <linux/suspend.h>
 #include <linux/writeback.h>
 #include <linux/buffer_head.h>		/* for fsync_bdev() */
-
+#include <linux/swap.h>
 #include <linux/spinlock.h>
 
 #include <asm/ptrace.h>
@@ -203,6 +203,18 @@ static struct sysrq_key_op sysrq_term_op
 	.action_msg	= "Terminate All Tasks",
 };
 
+static void sysrq_handle_moom(int key, struct pt_regs *pt_regs,
+			      struct tty_struct *tty)
+{
+	out_of_memory(GFP_KERNEL);
+//	console_loglevel = 8;
+}
+static struct sysrq_key_op sysrq_moom_op = {
+	.handler	= sysrq_handle_moom,
+	.help_msg	= "Full",
+	.action_msg	= "Manual OOM execution",
+};
+
 static void sysrq_handle_kill(int key, struct pt_regs *pt_regs,
 			      struct tty_struct *tty) 
 {
@@ -249,7 +261,7 @@ static struct sysrq_key_op *sysrq_key_ta
 /* c */ NULL,
 /* d */	NULL,
 /* e */	&sysrq_term_op,
-/* f */	NULL,
+/* f */	&sysrq_moom_op,
 /* g */	NULL,
 /* h */	NULL,
 /* i */	&sysrq_kill_op,
_
