Re: [PATH] Trigger OOM handler through sysrq

Pavel Machek (pavel@suse.cz)
Sun, 26 Aug 2001 16:37:32 +0000


Hi!

> > The below patch allows you to trigger the OOM handler rather then the
> > generic SAK.
>
> Hmm, does your patch work? You can't call oom_kill() from a non-task
> context because it uses schedule(). I had a similar patch for
> experiments long ago but can't find it. Anyway I think this solution
> fixes the symptom, not the root of the problem, especially SysRq
> is disabled in many places because of security reasons ....
>
> .... but it's true it can be lifesaver in cases ;) The patch below works
> for me. For people who are interested, see
> /usr/src/linux/Documentation/sysrq.txt how to enable 'Magic SysRq keys'
> and after you can use ALT-SysRQ-f whenever you want to free some
> memory killing a process chosen by the kernel.

This is usefull and can be lifesaver. Can you push it to linus?

>
> diff -ur linux.orig/drivers/char/sysrq.c linux/drivers/char/sysrq.c
> --- linux.orig/drivers/char/sysrq.c Fri Aug 17 00:58:32 2001
> +++ linux/drivers/char/sysrq.c Fri Aug 17 22:09:31 2001
> @@ -28,6 +28,7 @@
>
> extern void reset_vc(unsigned int);
> extern struct list_head super_blocks;
> +extern int sysrq_oom;
>
> /* Whether we react on sysrq keys or just ignore them */
> int sysrq_enabled = 1;
> @@ -137,6 +138,11 @@
> send_sig_all(SIGKILL, 1);
> orig_log_level = 8;
> break;
> + case 'f': /* F -- call out of memory killer */
> + printk("Trying to free some memory killing a \"bad\" process\n");
> + sysrq_oom = 1;
> + wakeup_kswapd();
> + break;
> default: /* Unknown: help */
> if (kbd)
> printk("unRaw ");
> @@ -147,7 +153,7 @@
> printk("Boot ");
> if (sysrq_power_off)
> printk("Off ");
> - printk("Sync Unmount showPc showTasks showMem loglevel0-8 tErm kIll killalL\n");
> + printk("Sync Unmount showPc showTasks showMem loglevel0-8 tErm kIll killalL Freemem\n");
> /* Don't use 'A' as it's handled specially on the Sparc */
> }
>
> diff -ur linux.orig/mm/vmscan.c linux/mm/vmscan.c
> --- linux.orig/mm/vmscan.c Fri Aug 17 03:01:33 2001
> +++ linux/mm/vmscan.c Fri Aug 17 22:03:51 2001
> @@ -24,6 +24,8 @@
>
> #include <asm/pgalloc.h>
>
> +int sysrq_oom = 0;
> +
> /*
> * The "priority" of VM scanning is how much of the queues we
> * will scan in one go. A value of 6 for DEF_PRIORITY implies
> @@ -925,6 +927,12 @@
>
> /* Recalculate VM statistics. */
> recalculate_vm_stats();
> + }
> +
> + if (sysrq_oom) {
> + sysrq_oom = 0;
> + oom_kill();
> + continue;
> }
>
> if (!do_try_to_free_pages(GFP_KSWAPD, 1)) {
>
>
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/

-- 
Philips Velo 1: 1"x4"x8", 300gram, 60, 12MB, 40bogomips, linux, mutt,
details at http://atrey.karlin.mff.cuni.cz/~pavel/velo/index.html.

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/