From: Matthew Bloch <matthew@bytemark.co.uk>
To: xen-devel@lists.sourceforge.net
Subject: PATCH: ability to send sysrqs to Linux domains
Date: Thu, 09 Dec 2004 11:44:53 +0000 [thread overview]
Message-ID: <cp9drl$qoj$1@sea.gmane.org> (raw)
[-- Attachment #1: Type: text/plain, Size: 838 bytes --]
Here's the promised patch against a recent 2.01 snapshot to allow you to
send sysrqs to running Linux kernels. I went with Keir's suggestion of
adding a sub-reason code to the shutdown message with a 1-byte payload
specifying which key was pressed. Hope it's acceptable for the main
tree; I will happily alter it to spec if any of the maintainers have
suggestions for better structuring it.
It adds the CONFIG_MAGIC_SYSRQ option to the Linux kernel which you need
to turn on for a guest to work with it, then you can just do e.g. "xm
sysrq domainname s" to sync your discs.
cheers,
--
Matthew Bloch Bytemark Hosting
http://www.bytemark.co.uk/
phone UK: 0845 004 3 004 US: 1-877 BYTEMAR
Dedicated Linux hosts from 15ukp ($26) per month
[-- Attachment #2: sysrq-patch5 --]
[-- Type: text/plain, Size: 10550 bytes --]
diff -urN xen-2.0/linux-2.6.9-xen-sparse/arch/xen/Kconfig xen-2.0-sysrq/linux-2.6.9-xen-sparse/arch/xen/Kconfig
--- xen-2.0/linux-2.6.9-xen-sparse/arch/xen/Kconfig 2004-11-17 22:51:41.000000000 +0000
+++ xen-2.0-sysrq/linux-2.6.9-xen-sparse/arch/xen/Kconfig 2004-12-08 15:03:23.000000000 +0000
@@ -164,3 +164,20 @@
source "crypto/Kconfig"
source "lib/Kconfig"
+
+menu "Kernel hacking"
+
+config MAGIC_SYSRQ
+ bool "Magic SysRq key"
+ help
+ If you say Y here, you will have some control over the system even
+ if the system crashes for example during kernel debugging (e.g., you
+ will be able to flush the buffer cache to disk, reboot the system
+ immediately or dump some status information). This is accomplished
+ by pressing various keys while holding SysRq (Alt+PrintScreen). It
+ also works on a serial console (on PC hardware at least), if you
+ send a BREAK and then within 5 seconds a command keypress. The
+ keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
+ unless you really know what this hack does.
+
+endmenu
diff -urN xen-2.0/linux-2.6.9-xen-sparse/arch/xen/kernel/reboot.c xen-2.0-sysrq/linux-2.6.9-xen-sparse/arch/xen/kernel/reboot.c
--- xen-2.0/linux-2.6.9-xen-sparse/arch/xen/kernel/reboot.c 2004-11-17 22:51:41.000000000 +0000
+++ xen-2.0-sysrq/linux-2.6.9-xen-sparse/arch/xen/kernel/reboot.c 2004-12-08 15:03:23.000000000 +0000
@@ -8,6 +8,7 @@
#include <linux/unistd.h>
#include <linux/module.h>
#include <linux/reboot.h>
+#include <linux/sysrq.h>
#include <asm/irq.h>
#include <asm/mmu_context.h>
#include <asm-xen/ctrl_if.h>
@@ -53,6 +54,7 @@
/* Ignore multiple shutdown requests. */
static int shutting_down = -1;
+static int pending_sysrq = -1;
static void __do_suspend(void)
{
@@ -214,9 +216,22 @@
}
}
+static void __sysrq_handler(void *unused)
+{
+#ifndef CONFIG_MAGIC_SYSRQ
+ printk("CONFIG_MAGIC_SYSRQ not compiled in, will ignore!\n");
+#else
+ handle_sysrq(pending_sysrq, NULL, NULL);
+ pending_sysrq = -1;
+#endif
+}
+
static void shutdown_handler(ctrl_msg_t *msg, unsigned long id)
{
static DECLARE_WORK(shutdown_work, __shutdown_handler, NULL);
+ static DECLARE_WORK(sysrq_work, __sysrq_handler, NULL);
+
+ printk("msg->subtype = %d, msg->msg[0] = %d", msg->subtype, msg->msg[0]);
if ( (shutting_down == -1) &&
((msg->subtype == CMSG_SHUTDOWN_POWEROFF) ||
@@ -226,6 +241,12 @@
shutting_down = msg->subtype;
schedule_work(&shutdown_work);
}
+ else if (msg->subtype == CMSG_SHUTDOWN_SYSRQ)
+ {
+ /* sysrqs are allowed during shutdown in case shutdown stuffs up */
+ pending_sysrq = msg->msg[0];
+ schedule_work(&sysrq_work);
+ }
else
{
printk("Ignore spurious shutdown request\n");
diff -urN xen-2.0/tools/python/xen/xend/XendClient.py xen-2.0-sysrq/tools/python/xen/xend/XendClient.py
--- xen-2.0/tools/python/xen/xend/XendClient.py 2004-11-17 22:51:40.000000000 +0000
+++ xen-2.0-sysrq/tools/python/xen/xend/XendClient.py 2004-12-08 15:03:23.000000000 +0000
@@ -228,10 +228,11 @@
return self.xendPost(self.domainurl(id),
{'op' : 'pause' })
- def xend_domain_shutdown(self, id, reason):
+ def xend_domain_shutdown(self, id, reason, key=None):
return self.xendPost(self.domainurl(id),
{'op' : 'shutdown',
- 'reason' : reason })
+ 'reason' : reason,
+ 'key' : key })
def xend_domain_destroy(self, id, reason):
return self.xendPost(self.domainurl(id),
diff -urN xen-2.0/tools/python/xen/xend/XendDomain.py xen-2.0-sysrq/tools/python/xen/xend/XendDomain.py
--- xen-2.0/tools/python/xen/xend/XendDomain.py 2004-11-17 22:51:42.000000000 +0000
+++ xen-2.0-sysrq/tools/python/xen/xend/XendDomain.py 2004-12-09 10:47:57.000000000 +0000
@@ -455,7 +455,7 @@
except Exception, ex:
raise XendError(str(ex))
- def domain_shutdown(self, id, reason='poweroff'):
+ def domain_shutdown(self, id, reason='poweroff', key=None):
"""Shutdown domain (nicely).
- poweroff: restart according to exit code and restart mode
- reboot: restart on exit
@@ -474,7 +474,7 @@
eserver.inject('xend.domain.shutdown', [dominfo.name, dominfo.id, reason])
if reason == 'halt':
reason = 'poweroff'
- val = xend.domain_shutdown(dominfo.id, reason)
+ val = xend.domain_shutdown(dominfo.id, reason, key)
self.refresh_schedule()
return val
diff -urN xen-2.0/tools/python/xen/xend/server/SrvDaemon.py xen-2.0-sysrq/tools/python/xen/xend/server/SrvDaemon.py
--- xen-2.0/tools/python/xen/xend/server/SrvDaemon.py 2004-11-17 22:51:47.000000000 +0000
+++ xen-2.0-sysrq/tools/python/xen/xend/server/SrvDaemon.py 2004-12-09 10:51:57.000000000 +0000
@@ -711,14 +711,14 @@
raise XendError('Invalid console id')
console.disconnect()
- def domain_shutdown(self, dom, reason):
+ def domain_shutdown(self, dom, reason, key=None):
"""Shutdown a domain.
"""
dom = int(dom)
ctrl = self.domainCF.getController(dom)
if not ctrl:
raise XendError('No domain controller: %s' % dom)
- ctrl.shutdown(reason)
+ ctrl.shutdown(reason, key)
return 0
def domain_mem_target_set(self, dom, target):
diff -urN xen-2.0/tools/python/xen/xend/server/SrvDomain.py xen-2.0-sysrq/tools/python/xen/xend/server/SrvDomain.py
--- xen-2.0/tools/python/xen/xend/server/SrvDomain.py 2004-11-17 22:51:47.000000000 +0000
+++ xen-2.0-sysrq/tools/python/xen/xend/server/SrvDomain.py 2004-12-08 17:24:07.000000000 +0000
@@ -47,7 +47,8 @@
def op_shutdown(self, op, req):
fn = FormFn(self.xd.domain_shutdown,
[['dom', 'str'],
- ['reason', 'str']])
+ ['reason', 'str'],
+ ['key', 'int']])
val = fn(req.args, {'dom': self.dom.id})
req.setResponseCode(http.ACCEPTED)
req.setHeader("Location", "%s/.." % req.prePathURL())
diff -urN xen-2.0/tools/python/xen/xend/server/domain.py xen-2.0-sysrq/tools/python/xen/xend/server/domain.py
--- xen-2.0/tools/python/xen/xend/server/domain.py 2004-11-17 22:51:43.000000000 +0000
+++ xen-2.0-sysrq/tools/python/xen/xend/server/domain.py 2004-12-08 17:20:02.000000000 +0000
@@ -28,7 +28,8 @@
"""
reasons = {'poweroff' : 'shutdown_poweroff_t',
'reboot' : 'shutdown_reboot_t',
- 'suspend' : 'shutdown_suspend_t' }
+ 'suspend' : 'shutdown_suspend_t',
+ 'sysrq' : 'shutdown_sysrq_t' }
def __init__(self, factory, dom):
controller.Controller.__init__(self, factory, dom)
@@ -36,16 +37,19 @@
self.addMethod(CMSG_MEM_REQUEST, 0, None)
self.registerChannel()
- def shutdown(self, reason):
+ def shutdown(self, reason, key=None):
"""Shutdown a domain.
reason shutdown reason
+ key sysrq key (only if reason is 'sysrq')
"""
msgtype = self.reasons.get(reason)
if not msgtype:
raise XendError('invalid reason:' + reason)
- msg = packMsg(msgtype, {})
- self.writeRequest(msg)
+ extra = {}
+ if reason == 'sysrq': extra['key'] = key
+ print extra
+ self.writeRequest(packMsg(msgtype, extra))
def mem_target_set(self, target):
"""Set domain memory target in pages.
diff -urN xen-2.0/tools/python/xen/xend/server/messages.py xen-2.0-sysrq/tools/python/xen/xend/server/messages.py
--- xen-2.0/tools/python/xen/xend/server/messages.py 2004-11-17 22:51:42.000000000 +0000
+++ xen-2.0-sysrq/tools/python/xen/xend/server/messages.py 2004-12-08 15:03:23.000000000 +0000
@@ -197,10 +197,12 @@
CMSG_SHUTDOWN_POWEROFF = 0
CMSG_SHUTDOWN_REBOOT = 1
CMSG_SHUTDOWN_SUSPEND = 2
+CMSG_SHUTDOWN_SYSRQ = 3
STOPCODE_shutdown = 0
STOPCODE_reboot = 1
STOPCODE_suspend = 2
+STOPCODE_sysrq = 3
shutdown_formats = {
'shutdown_poweroff_t':
@@ -211,6 +213,9 @@
'shutdown_suspend_t':
(CMSG_SHUTDOWN, CMSG_SHUTDOWN_SUSPEND),
+
+ 'shutdown_sysrq_t':
+ (CMSG_SHUTDOWN, CMSG_SHUTDOWN_SYSRQ)
}
msg_formats.update(shutdown_formats)
diff -urN xen-2.0/tools/python/xen/xm/main.py xen-2.0-sysrq/tools/python/xen/xm/main.py
--- xen-2.0/tools/python/xen/xm/main.py 2004-11-17 22:51:47.000000000 +0000
+++ xen-2.0-sysrq/tools/python/xen/xm/main.py 2004-12-08 15:03:23.000000000 +0000
@@ -11,7 +11,7 @@
from xen.xend import sxp
from xen.xend.XendClient import XendError, server
from xen.xend.XendClient import main as xend_client_main
-from xen.xm import create, destroy, migrate, shutdown
+from xen.xm import create, destroy, migrate, shutdown, sysrq
from xen.xm.opts import *
class Group:
@@ -401,6 +401,19 @@
xm.prog(ProgShutdown)
+class ProgSysrq(Prog):
+ group = 'domain'
+ name = "sysrq"
+ info = """Send a sysrq to a domain."""
+
+ def help(self, args):
+ sysrq.main([args[0], '-h'])
+
+ def main(self, args):
+ sysrq.main(args)
+
+xm.prog(ProgSysrq)
+
class ProgPause(Prog):
group = 'domain'
name = "pause"
diff -urN xen-2.0/tools/python/xen/xm/sysrq.py xen-2.0-sysrq/tools/python/xen/xm/sysrq.py
--- xen-2.0/tools/python/xen/xm/sysrq.py 1970-01-01 01:00:00.000000000 +0100
+++ xen-2.0-sysrq/tools/python/xen/xm/sysrq.py 2004-12-08 17:17:38.000000000 +0000
@@ -0,0 +1,39 @@
+# (C) Matthew Bloch <matthew@bytemark.co.uk> 2004
+
+"""Domain shutdown.
+"""
+import string
+import sys
+import time
+
+from xen.xend.XendClient import server
+from xen.xm.opts import *
+
+DOM0_NAME = 'Domain-0'
+DOM0_ID = '0'
+
+gopts = Opts(use="""[DOM] [letter]
+
+Sends a Linux sysrq to a domain.
+""")
+
+gopts.opt('help', short='h',
+ fn=set_true, default=0,
+ use="Print this help.")
+
+def sysrq(dom, req):
+ server.xend_domain_shutdown(dom, 'sysrq', req)
+
+def main(argv):
+ opts = gopts
+ args = opts.parse(argv)
+ if opts.vals.help:
+ opts.usage()
+ return
+
+ # no options for the moment
+ if len(args) < 1: opts.err('Missing domain')
+ if len(args) < 2: opts.err('Missing sysrq character')
+ dom = args[0]
+ req = ord(args[1][0])
+ sysrq(dom, req)
next reply other threads:[~2004-12-09 11:44 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-12-09 11:44 Matthew Bloch [this message]
2004-12-09 17:43 ` PATCH: ability to send sysrqs to Linux domains Mike Wray
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='cp9drl$qoj$1@sea.gmane.org' \
--to=matthew@bytemark.co.uk \
--cc=xen-devel@lists.sourceforge.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.