ChangeSet 1.2262, 2005/03/31 08:37:04-08:00, [EMAIL PROTECTED]

        [PATCH] make sysrq-F call oom_kill()
        
        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.
        
        From: Coywolf Qi Hunt <[EMAIL PROTECTED]>
        
          Move it into a workqueue to avoid taking VM locks from IRQ context.
        
        Signed-off-by: Coywolf Qi Hunt <[EMAIL PROTECTED]>
        Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
        Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>



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


diff -Nru a/Documentation/sysrq.txt b/Documentation/sysrq.txt
--- a/Documentation/sysrq.txt   2005-03-31 10:18:03 -08:00
+++ b/Documentation/sysrq.txt   2005-03-31 10:18:03 -08:00
@@ -92,6 +92,8 @@
           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 -Nru a/drivers/char/sysrq.c b/drivers/char/sysrq.c
--- a/drivers/char/sysrq.c      2005-03-31 10:18:03 -08:00
+++ b/drivers/char/sysrq.c      2005-03-31 10:18:03 -08:00
@@ -31,9 +31,10 @@
 #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 <linux/vt_kern.h>
+#include <linux/workqueue.h>
 
 #include <asm/ptrace.h>
 
@@ -209,6 +210,24 @@
        .enable_mask    = SYSRQ_ENABLE_SIGNAL,
 };
 
+static void moom_callback(void *ignored)
+{
+       out_of_memory(GFP_KERNEL);
+}
+
+static DECLARE_WORK(moom_work, moom_callback, NULL);
+
+static void sysrq_handle_moom(int key, struct pt_regs *pt_regs,
+                             struct tty_struct *tty)
+{
+       schedule_work(&moom_work);
+}
+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) 
 {
@@ -257,7 +276,7 @@
 /* c */ NULL,
 /* d */        NULL,
 /* e */        &sysrq_term_op,
-/* f */        NULL,
+/* f */        &sysrq_moom_op,
 /* g */        NULL,
 /* h */        NULL,
 /* i */        &sysrq_kill_op,
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to