[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Patch][RFC] Support "xm dump" (is Re: [Xen-devel] Re: [Patch] Enable "sysrq c" handler for domU coredump)
On Thu, Aug 03, 2006 at 09:18:23AM +0900, Akio Takebe wrote: Content-Description: Mail message body > Hi, Keir and Horms > > This patch is sample patch. > I make "xm dump" command with dom0_ops. > xc_domain_dump() only call __domain_crash(). > After __domain_crash(), xend start dumpcore > because shutdown status is crash. > (When enabel-dump in xend-cofig.sxp is yes) > > The xm dump usage is below. > 1. vi /etc/xen/xend-config.sxp > (enable-dump yes) > 2. xend start > 3. xm create domU > 4. xm dump domU > 5. coredump is created in /var/xen/dump/ > > I think this way can probably dump both nonHVM and HVM domain's core. > But I tested only nonHVM domain (because I don't have HVM machine). > > How about this implementation? That seems fine to me, though I am no expert on xend. Some minor comments are inline. > Signed-off-by: Akio Takebe <takebe_akio@xxxxxxxxxxxxxx> > > Best Regards, > > Akio Takebe > # HG changeset patch > # User root@procyon > # Node ID a16cc49dbd01e9c3f78fb5041d782025c2bda2fa > # Parent 10b05c2e79475f90330fa061b46d6df7e71a41c5 > Support "xm dump" command. > xc_domain_dump() only call __domain_crash(). > After __domain_crash(), xend start dumpcore > because shutdown status is crash. > (When enabel-dump in xend-cofig.sxp is yes) > > The xm dump usage is below. > 1. vi /etc/xen/xend-config.sxp > (enable-dump yes) > 2. xend start > 3. xm create domU > 4. xm dump domU > 5. coredump is created in /var/xen/dump/ > > Signed-off-by: Akio Takebe <takebe_akio@xxxxxxxxxxxxxx> > > diff -r 10b05c2e7947 -r a16cc49dbd01 tools/libxc/xc_domain.c > --- a/tools/libxc/xc_domain.c Tue Aug 01 18:08:01 2006 +0100 > +++ b/tools/libxc/xc_domain.c Thu Aug 03 09:20:16 2006 +0900 > @@ -28,6 +28,14 @@ int xc_domain_create(int xc_handle, > return 0; > } > > +int xc_domain_dump(int xc_handle, > + uint32_t domid) > +{ > + DECLARE_DOM0_OP; > + op.cmd = DOM0_DUMPDOMAIN; > + op.u.dumpdomain.domain = (domid_t)domid; > + return do_dom0_op(xc_handle, &op); > +} > > int xc_domain_pause(int xc_handle, > uint32_t domid) > diff -r 10b05c2e7947 -r a16cc49dbd01 tools/libxc/xenctrl.h > --- a/tools/libxc/xenctrl.h Tue Aug 01 18:08:01 2006 +0100 > +++ b/tools/libxc/xenctrl.h Thu Aug 03 09:20:16 2006 +0900 > @@ -202,6 +202,17 @@ int xc_domain_unpause(int xc_handle, > uint32_t domid); > > /** > + * This function dump a domain. A domain_dump only crash domain. > + * after crash domain, xc_domain_dumpcore dump domain memory. Perhaps: /** * This function dumps a domain to a core file. It does this by * crashing the domain, after which xc_domain_dumpcore() will dump the * domain's memory. > + * > + * @parm xc_handle a handle to an open hypervisor interface > + * @parm domid the domain id to pause > + * @return 0 on success, -1 on failure. > + */ > +int xc_domain_dump(int xc_handle, > + uint32_t domid); > + > +/** > * This function will destroy a domain. Destroying a domain removes the > domain > * completely from memory. This function should be called after sending the > * domain a SHUTDOWN control message to free up the domain resources. > diff -r 10b05c2e7947 -r a16cc49dbd01 tools/python/xen/lowlevel/xc/xc.c > --- a/tools/python/xen/lowlevel/xc/xc.c Tue Aug 01 18:08:01 2006 +0100 > +++ b/tools/python/xen/lowlevel/xc/xc.c Thu Aug 03 09:20:16 2006 +0900 > @@ -117,6 +117,11 @@ static PyObject *pyxc_domain_max_vcpus(X > > Py_INCREF(zero); > return zero; > +} > + > +static PyObject *pyxc_domain_dump(XcObject *self, PyObject *args) > +{ > + return dom_op(self, args, xc_domain_dump); > } > > static PyObject *pyxc_domain_pause(XcObject *self, PyObject *args) > @@ -945,6 +950,13 @@ static PyMethodDef pyxc_methods[] = { > "Dump core of a domain.\n" > " dom [int]: Identifier of domain to dump core of.\n" > " corefile [string]: Name of corefile to be created.\n\n" > + "Returns: [int] 0 on success; -1 on error.\n" }, > + > + { "domain_dump", > + (PyCFunction)pyxc_domain_dump, > + METH_VARARGS, "\n" > + "Dump of a domain.\n" The description sof domain_dumpcore vs domain_dump above are somewhat ambigious. Could you make it clearer what the difference between the two is? Perhaps: "Crash a domain so that it will dump core\n" > + " dom [int]: Identifier of domain to dump core of.\n" > "Returns: [int] 0 on success; -1 on error.\n" }, > > { "domain_pause", > diff -r 10b05c2e7947 -r a16cc49dbd01 tools/python/xen/xend/XendDomain.py > --- a/tools/python/xen/xend/XendDomain.py Tue Aug 01 18:08:01 2006 +0100 > +++ b/tools/python/xen/xend/XendDomain.py Thu Aug 03 09:20:16 2006 +0900 > @@ -355,6 +355,23 @@ class XendDomain: > self.domains_lock.release() > > > + def domain_dump(self, domid): > + """dump domain's core.""" > + > + dominfo = self.domain_lookup_by_name_or_id_nr(domid) > + if not dominfo: > + raise XendInvalidDomain(str(domid)) > + > + if dominfo.getDomid() == PRIV_DOMAIN: > + raise XendError("Cannot dump privileged domain %s" % domid) > + > + try: > + log.info("Domain %s (%d) coredump.", dominfo.getName(), > + dominfo.getDomid()) > + return dominfo.dump() > + except Exception, ex: > + raise XendError(str(ex)) > + > def domain_unpause(self, domid): > """Unpause domain execution.""" > > diff -r 10b05c2e7947 -r a16cc49dbd01 tools/python/xen/xend/XendDomainInfo.py > --- a/tools/python/xen/xend/XendDomainInfo.py Tue Aug 01 18:08:01 2006 +0100 > +++ b/tools/python/xen/xend/XendDomainInfo.py Thu Aug 03 09:20:16 2006 +0900 > @@ -1546,6 +1546,8 @@ class XendDomainInfo: > def unpause(self): > xc.domain_unpause(self.domid) > > + def dump(self): > + xc.domain_dump(self.domid) > > ## private: > > diff -r 10b05c2e7947 -r a16cc49dbd01 tools/python/xen/xend/server/SrvDomain.py > --- a/tools/python/xen/xend/server/SrvDomain.py Tue Aug 01 18:08:01 > 2006 +0100 > +++ b/tools/python/xen/xend/server/SrvDomain.py Thu Aug 03 09:20:16 > 2006 +0900 > @@ -43,6 +43,10 @@ class SrvDomain(SrvDir): > ['config', 'sxpr']]) > return fn(req.args, {'dom': self.dom.domid}) > > + def op_dump(self, _1, _2): > + val = self.xd.domain_dump(self.dom.domid) > + return val > + > def op_unpause(self, _1, _2): > val = self.xd.domain_unpause(self.dom.domid) > return val > diff -r 10b05c2e7947 -r a16cc49dbd01 tools/python/xen/xm/main.py > --- a/tools/python/xen/xm/main.py Tue Aug 01 18:08:01 2006 +0100 > +++ b/tools/python/xen/xm/main.py Thu Aug 03 09:20:16 2006 +0900 > @@ -70,6 +70,7 @@ shutdown_help ="shutdown <DomId> [-w][-a > shutdown_help ="shutdown <DomId> [-w][-a][-R|-H] Shutdown a domain" > top_help = "top Monitor system and domains > in real-time" > unpause_help = "unpause <DomId> Unpause a paused domain" > +dump_help = "dump <DomId> dump domain's core" > > help_spacer = """ > """ > @@ -148,6 +149,7 @@ short_command_list = [ > "top", > "unpause", > "vcpu-set", > + "dump", > ] > > domain_commands = [ > @@ -173,6 +175,7 @@ domain_commands = [ > "vcpu-list", > "vcpu-pin", > "vcpu-set", > + "dump", > ] > > host_commands = [ > @@ -585,6 +588,12 @@ def xm_unpause(args): > dom = args[0] > > server.xend.domain.unpause(dom) > + > +def xm_dump(args): > + arg_check(args, "dump", 1) > + dom = args[0] > + > + server.xend.domain.dump(dom) > > def xm_rename(args): > arg_check(args, "rename", 2) > @@ -1126,6 +1135,7 @@ commands = { > # special > "pause": xm_pause, > "unpause": xm_unpause, > + "dump": xm_dump, > # host commands > "dmesg": xm_dmesg, > "info": xm_info, > diff -r 10b05c2e7947 -r a16cc49dbd01 xen/common/dom0_ops.c > --- a/xen/common/dom0_ops.c Tue Aug 01 18:08:01 2006 +0100 > +++ b/xen/common/dom0_ops.c Thu Aug 03 09:20:16 2006 +0900 > @@ -164,6 +164,23 @@ long do_dom0_op(XEN_GUEST_HANDLE(dom0_op > } > break; > > + case DOM0_DUMPDOMAIN: > + { > + struct domain *d = find_domain_by_id(op->u.dumpdomain.domain); > + ret = -ESRCH; > + if ( d != NULL ) > + { > + ret = -EINVAL; > + if ( d != current->domain ) > + { > + __domain_crash(d); > + ret = 0; > + } > + put_domain(d); > + } > + } > + break; > + > case DOM0_PAUSEDOMAIN: > { > struct domain *d = find_domain_by_id(op->u.pausedomain.domain); > diff -r 10b05c2e7947 -r a16cc49dbd01 xen/include/public/dom0_ops.h > --- a/xen/include/public/dom0_ops.h Tue Aug 01 18:08:01 2006 +0100 > +++ b/xen/include/public/dom0_ops.h Thu Aug 03 09:20:16 2006 +0900 > @@ -539,6 +539,14 @@ struct dom0_settimeoffset { > }; > typedef struct dom0_settimeoffset dom0_settimeoffset_t; > DEFINE_XEN_GUEST_HANDLE(dom0_settimeoffset_t); > + > +#define DOM0_DUMPDOMAIN 51 > +struct dom0_dumpdomain { > + /* IN parameters. */ > + domid_t domain; > +}; > +typedef struct dom0_dumpdomain dom0_dumpdomain_t; > +DEFINE_XEN_GUEST_HANDLE(dom0_dumpdomain_t); > > struct dom0_op { > uint32_t cmd; > @@ -583,6 +591,7 @@ struct dom0_op { > struct dom0_hypercall_init hypercall_init; > struct dom0_domain_setup domain_setup; > struct dom0_settimeoffset settimeoffset; > + struct dom0_dumpdomain dumpdomain; > uint8_t pad[128]; > } u; > }; -- Horms H: http://www.vergenet.net/~horms/ W: http://www.valinux.co.jp/en/ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |