Messages in this thread Patch in this message |  | | Date | Mon, 25 Sep 2000 12:21:44 +0200 | Subject | [SysRq PATCH]: no more reboots because console freeze | From | <> |
| |
Hi all
I made a very small patch to the SysRq facility that signals a program with SIGUSR1, the program is registered via sysctl
The signal is launched with Alt+SysRq+X (X stands for eXecute program)
/proc/sys/kernel/sysrq_progid contains pid and start_time which totally identifies the program to signal
One of the uses of this is restore the console when a X-server or a SVGAlib program crashes
How many times did you have got to reboot because of that, while your system may be doing something important??? this hopefully solves the problem
Patch is included below, sample programs/scripts are available at
http://pusa.uv.es/~ulisses/sysrq_X.tar.gz
Comments/sugestions wanted, please e-mail me directly to uaca@alumni.uv.es (I'm not subscribed to the linux-kernel mailing list)
Bye!
Ulisses
----------------------------------------------------------------------------- Debian GNU/Linux: a dream come true -----------------------------------------------------------------------------
diff -u -r linux-2.4.0-test8/drivers/char/sysrq.c linux-2.4.0-test8-modificat2/drivers/char/sysrq.c --- linux-2.4.0-test8/drivers/char/sysrq.c Tue Aug 1 04:36:10 2000 +++ linux-2.4.0-test8-modificat2/drivers/char/sysrq.c Mon Sep 25 08:58:23 2000 @@ -6,6 +6,8 @@ * * (c) 1997 Martin Mares <mj@atrey.karlin.mff.cuni.cz> * based on ideas by Pavel Machek <pavel@atrey.karlin.mff.cuni.cz> + * + * (c) 2000 Ulisses Alonso Camaró eXecute_program extension */ #include <linux/config.h> @@ -22,6 +24,7 @@ #include <linux/quotaops.h> #include <linux/smp_lock.h> #include <linux/module.h> +#include <linux/kernel.h> #include <asm/ptrace.h> @@ -30,9 +33,13 @@ extern int console_loglevel; extern struct list_head super_blocks; +void signal_program(void); + /* Whether we react on sysrq keys or just ignore them */ int sysrq_enabled = 1; +unsigned long sysrq_progid[2]= {0, 0}; /* pid and start_time */ + /* Machine specific power off function */ void (*sysrq_power_off)(void) = NULL; @@ -53,6 +60,35 @@ } } +void signal_program(void) +{ + struct task_struct *p; + pid_t pid= (pid_t)sysrq_progid[0]; + + read_lock(&tasklist_lock); + + if ((p= find_task_by_pid(pid)) == NULL) + goto error; + + if (!p->mm || p->pid == 1) + goto error; + + if (p->start_time != sysrq_progid[1]) + goto error; + + send_sig(SIGUSR1, p, 0); + + read_unlock(&tasklist_lock); + + return; + + error: + printk(KERN_ERR "SysRq: Could not send signal to pid %d with start_time %lu\n", + pid, sysrq_progid[1]); + + return; +} + /* * This function is called by the keyboard handler when SysRq is pressed * and any other keycode arrives. @@ -138,6 +174,10 @@ send_sig_all(SIGKILL, 1); orig_log_level = 8; break; + case 'x': + printk("eXecute program\n"); + signal_program(); + break; default: /* Unknown: help */ if (kbd) printk("unRaw "); @@ -148,7 +188,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 eXec_program\n"); /* Don't use 'A' as it's handled specially on the Sparc */ } diff -u -r linux-2.4.0-test8/include/linux/sysctl.h linux-2.4.0-test8-modificat2/include/linux/sysctl.h --- linux-2.4.0-test8/include/linux/sysctl.h Thu Aug 10 22:01:26 2000 +++ linux-2.4.0-test8-modificat2/include/linux/sysctl.h Sun Sep 24 12:39:30 2000 @@ -113,6 +113,7 @@ KERN_OVERFLOWGID=47, /* int: overflow GID */ KERN_SHMPATH=48, /* string: path to shm fs */ KERN_HOTPLUG=49, /* string: path to hotplug policy agent */ + KERN_SYSRQ_PROGID=50 /* string: pid and start_time of the program to signal */ }; diff -u -r linux-2.4.0-test8/kernel/sysctl.c linux-2.4.0-test8-modificat2/kernel/sysctl.c --- linux-2.4.0-test8/kernel/sysctl.c Tue Aug 1 04:36:11 2000 +++ linux-2.4.0-test8-modificat2/kernel/sysctl.c Mon Sep 25 08:59:24 2000 @@ -83,6 +83,10 @@ extern int acct_parm[]; #endif +#ifdef CONFIG_MAGIC_SYSRQ +extern unsigned long sysrq_progid[]; +#endif + extern int pgt_cache_water[]; static int parse_table(int *, int, void *, size_t *, void *, size_t, @@ -220,6 +224,10 @@ #ifdef CONFIG_MAGIC_SYSRQ {KERN_SYSRQ, "sysrq", &sysrq_enabled, sizeof (int), 0644, NULL, &proc_dointvec}, + {KERN_SYSRQ_PROGID, "sysrq_progid", &sysrq_progid, 2*sizeof(unsigned long), + 0644, NULL, &proc_doulongvec_minmax, NULL, + (void *)NULL, (void *)NULL}, +/* (void *)&sysrq_progid_min, (void *)&sysrq_progid_max}, */ #endif {KERN_MAX_THREADS, "threads-max", &max_threads, sizeof(int), 0644, NULL, &proc_dointvec}, - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/
|  |