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