mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
Add resumedomain domctl to resume a domain after checkpoint.
Export resumedomain domctl to libxc, xend. Signed-off-by: Brendan Cully <brendan@cs.ubc.ca>
This commit is contained in:
1 parent
6b23fd229a
commit
e105919b01
6 files changed
+60
No files matched your search
@@ -89,6 +89,16 @@ int xc_domain_shutdown(int xc_handle,
|
||||
}
|
||||
|
||||
|
||||
int xc_domain_resume(int xc_handle,
|
||||
uint32_t domid)
|
||||
{
|
||||
DECLARE_DOMCTL;
|
||||
domctl.cmd = XEN_DOMCTL_resumedomain;
|
||||
domctl.domain = (domid_t)domid;
|
||||
return do_domctl(xc_handle, &domctl);
|
||||
}
|
||||
|
||||
|
||||
int xc_vcpu_setaffinity(int xc_handle,
|
||||
uint32_t domid,
|
||||
int vcpu,
|
||||
|
||||
@@ -236,6 +236,18 @@ int xc_domain_unpause(int xc_handle,
|
||||
int xc_domain_destroy(int xc_handle,
|
||||
uint32_t domid);
|
||||
|
||||
|
||||
/**
|
||||
* This function resumes a suspended domain. The domain should have
|
||||
* been previously suspended.
|
||||
*
|
||||
* @parm xc_handle a handle to an open hypervisor interface
|
||||
* @parm domid the domain id to resume
|
||||
* return 0 on success, -1 on failure
|
||||
*/
|
||||
int xc_domain_resume(int xc_handle,
|
||||
uint32_t domid);
|
||||
|
||||
/**
|
||||
* This function will shutdown a domain. This is intended for use in
|
||||
* fully-virtualized domains where this operation is analogous to the
|
||||
|
||||
@@ -174,6 +174,10 @@ static PyObject *pyxc_domain_shutdown(XcObject *self, PyObject *args)
|
||||
return zero;
|
||||
}
|
||||
|
||||
static PyObject *pyxc_domain_resume(XcObject *self, PyObject *args)
|
||||
{
|
||||
return dom_op(self, args, xc_domain_resume);
|
||||
}
|
||||
|
||||
static PyObject *pyxc_vcpu_setaffinity(XcObject *self,
|
||||
PyObject *args,
|
||||
@@ -1042,6 +1046,13 @@ static PyMethodDef pyxc_methods[] = {
|
||||
"Destroy a domain.\n"
|
||||
" dom [int]: Identifier of domain to be destroyed.\n\n"
|
||||
"Returns: [int] 0 on success; -1 on error.\n" },
|
||||
|
||||
{ "domain_resume",
|
||||
(PyCFunction)pyxc_domain_resume,
|
||||
METH_VARARGS, "\n"
|
||||
"Resume execution of a suspended domain.\n"
|
||||
" dom [int]: Identifier of domain to be resumed.\n\n"
|
||||
"Returns: [int] 0 on success; -1 on error.\n" },
|
||||
|
||||
{ "domain_shutdown",
|
||||
(PyCFunction)pyxc_domain_shutdown,
|
||||
|
||||
@@ -1539,6 +1539,15 @@ class XendDomainInfo:
|
||||
self.cleanupDomain()
|
||||
|
||||
|
||||
def resumeDomain(self):
|
||||
log.debug("XendDomainInfo.resumeDomain(%s)", str(self.domid))
|
||||
|
||||
try:
|
||||
if self.domid is not None:
|
||||
xc.domain_resume(self.domid)
|
||||
except:
|
||||
log.exception("XendDomainInfo.resume: xc.domain_resume failed on domain %s." % (str(self.domid)))
|
||||
|
||||
#
|
||||
# Channels for xenstore and console
|
||||
#
|
||||
|
||||
@@ -286,6 +286,23 @@ ret_t do_domctl(XEN_GUEST_HANDLE(xen_domctl_t) u_domctl)
|
||||
}
|
||||
break;
|
||||
|
||||
case XEN_DOMCTL_resumedomain:
|
||||
{
|
||||
struct domain *d = find_domain_by_id(op->domain);
|
||||
struct vcpu *v;
|
||||
|
||||
ret = -ESRCH;
|
||||
if ( d != NULL )
|
||||
{
|
||||
ret = 0;
|
||||
if ( test_and_clear_bit(_DOMF_shutdown, &d->domain_flags) )
|
||||
for_each_vcpu ( d, v )
|
||||
vcpu_wake(v);
|
||||
put_domain(d);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case XEN_DOMCTL_createdomain:
|
||||
{
|
||||
struct domain *d;
|
||||
|
||||
@@ -63,6 +63,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_domctl_createdomain_t);
|
||||
#define XEN_DOMCTL_destroydomain 2
|
||||
#define XEN_DOMCTL_pausedomain 3
|
||||
#define XEN_DOMCTL_unpausedomain 4
|
||||
#define XEN_DOMCTL_resumedomain 27
|
||||
|
||||
#define XEN_DOMCTL_getdomaininfo 5
|
||||
struct xen_domctl_getdomaininfo {
|
||||
|
||||