# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1169220514 0
# Node ID 9a1809ce711b0c61bc2bf302218efeb95637cf6b
# Parent dcb145f858e32a1d310a5558d4e12bb0521a625d
xenstore: add XS_RESUME command; export it to xend.
This clears the shutdown flag for a domain in xenstore, allowing
subsequent shutdowns of the same domain to fire the appropriate
watches.
Signed-off-by: Brendan Cully <brendan@xxxxxxxxx>
---
tools/python/xen/lowlevel/xs/xs.c | 28 +++++++++++++++++++++++
tools/python/xen/xend/XendDomainInfo.py | 3 +-
tools/python/xen/xend/xenstore/xsutil.py | 3 ++
tools/xenstore/xenstored_core.c | 5 ++++
tools/xenstore/xenstored_domain.c | 37 +++++++++++++++++++++++++++++++
tools/xenstore/xenstored_domain.h | 3 ++
tools/xenstore/xs.c | 6 +++++
tools/xenstore/xs.h | 5 ++++
8 files changed, 89 insertions(+), 1 deletion(-)
diff -r dcb145f858e3 -r 9a1809ce711b tools/python/xen/lowlevel/xs/xs.c
--- a/tools/python/xen/lowlevel/xs/xs.c Fri Jan 19 15:23:41 2007 +0000
+++ b/tools/python/xen/lowlevel/xs/xs.c Fri Jan 19 15:28:34 2007 +0000
@@ -618,6 +618,33 @@ static PyObject *xspy_introduce_domain(X
return none(result);
}
+#define xspy_resume_domain_doc "\n" \
+ "Tell xenstore to clear its shutdown flag for a domain.\n" \
+ "This ensures that a subsequent shutdown will fire the\n" \
+ "appropriate watches.\n" \
+ " dom [int]: domain id\n" \
+ "\n" \
+ "Returns None on success.\n" \
+ "Raises xen.lowlevel.xs.Error on error.\n"
+
+static PyObject *xspy_resume_domain(XsHandle *self, PyObject *args)
+{
+ uint32_t dom;
+
+ struct xs_handle *xh = xshandle(self);
+ bool result = 0;
+
+ if (!xh)
+ return NULL;
+ if (!PyArg_ParseTuple(args, "i", &dom))
+ return NULL;
+
+ Py_BEGIN_ALLOW_THREADS
+ result = xs_resume_domain(xh, dom);
+ Py_END_ALLOW_THREADS
+
+ return none(result);
+}
#define xspy_release_domain_doc "\n" \
"Tell xenstore to release its channel to a domain.\n" \
@@ -789,6 +816,7 @@ static PyMethodDef xshandle_methods[] =
XSPY_METH(transaction_start, METH_NOARGS),
XSPY_METH(transaction_end, METH_VARARGS | METH_KEYWORDS),
XSPY_METH(introduce_domain, METH_VARARGS),
+ XSPY_METH(resume_domain, METH_VARARGS),
XSPY_METH(release_domain, METH_VARARGS),
XSPY_METH(close, METH_NOARGS),
XSPY_METH(get_domain_path, METH_VARARGS),
diff -r dcb145f858e3 -r 9a1809ce711b tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Fri Jan 19 15:23:41 2007 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py Fri Jan 19 15:28:34 2007 +0000
@@ -45,7 +45,7 @@ from xen.xend.XendError import XendError
from xen.xend.XendError import XendError, VmError
from xen.xend.XendDevices import XendDevices
from xen.xend.xenstore.xstransact import xstransact, complete
-from xen.xend.xenstore.xsutil import GetDomainPath, IntroduceDomain
+from xen.xend.xenstore.xsutil import GetDomainPath, IntroduceDomain,
ResumeDomain
from xen.xend.xenstore.xswatch import xswatch
from xen.xend.XendConstants import *
from xen.xend.XendAPIConstants import *
@@ -1545,6 +1545,7 @@ class XendDomainInfo:
try:
if self.domid is not None:
xc.domain_resume(self.domid)
+ ResumeDomain(self.domid)
except:
log.exception("XendDomainInfo.resume: xc.domain_resume failed on
domain %s." % (str(self.domid)))
diff -r dcb145f858e3 -r 9a1809ce711b tools/python/xen/xend/xenstore/xsutil.py
--- a/tools/python/xen/xend/xenstore/xsutil.py Fri Jan 19 15:23:41 2007 +0000
+++ b/tools/python/xen/xend/xenstore/xsutil.py Fri Jan 19 15:28:34 2007 +0000
@@ -24,3 +24,6 @@ def IntroduceDomain(domid, page, port):
def GetDomainPath(domid):
return xshandle().get_domain_path(domid)
+
+def ResumeDomain(domid):
+ return xshandle().resume_domain(domid)
diff -r dcb145f858e3 -r 9a1809ce711b tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c Fri Jan 19 15:23:41 2007 +0000
+++ b/tools/xenstore/xenstored_core.c Fri Jan 19 15:28:34 2007 +0000
@@ -164,6 +164,7 @@ static char *sockmsg_string(enum xsd_soc
case XS_WATCH_EVENT: return "WATCH_EVENT";
case XS_ERROR: return "ERROR";
case XS_IS_DOMAIN_INTRODUCED: return "XS_IS_DOMAIN_INTRODUCED";
+ case XS_RESUME: return "RESUME";
default:
return "**UNKNOWN**";
}
@@ -1265,6 +1266,10 @@ static void process_message(struct conne
case XS_GET_DOMAIN_PATH:
do_get_domain_path(conn, onearg(in));
+ break;
+
+ case XS_RESUME:
+ do_resume(conn, onearg(in));
break;
default:
diff -r dcb145f858e3 -r 9a1809ce711b tools/xenstore/xenstored_domain.c
--- a/tools/xenstore/xenstored_domain.c Fri Jan 19 15:23:41 2007 +0000
+++ b/tools/xenstore/xenstored_domain.c Fri Jan 19 15:28:34 2007 +0000
@@ -395,6 +395,43 @@ void do_release(struct connection *conn,
send_ack(conn, XS_RELEASE);
}
+void do_resume(struct connection *conn, const char *domid_str)
+{
+ struct domain *domain;
+ unsigned int domid;
+
+ if (!domid_str) {
+ send_error(conn, EINVAL);
+ return;
+ }
+
+ domid = atoi(domid_str);
+ if (!domid) {
+ send_error(conn, EINVAL);
+ return;
+ }
+
+ if (conn->id != 0) {
+ send_error(conn, EACCES);
+ return;
+ }
+
+ domain = find_domain_by_domid(domid);
+ if (!domain) {
+ send_error(conn, ENOENT);
+ return;
+ }
+
+ if (!domain->conn) {
+ send_error(conn, EINVAL);
+ return;
+ }
+
+ domain->shutdown = 0;
+
+ send_ack(conn, XS_RESUME);
+}
+
void do_get_domain_path(struct connection *conn, const char *domid_str)
{
char *path;
diff -r dcb145f858e3 -r 9a1809ce711b tools/xenstore/xenstored_domain.h
--- a/tools/xenstore/xenstored_domain.h Fri Jan 19 15:23:41 2007 +0000
+++ b/tools/xenstore/xenstored_domain.h Fri Jan 19 15:28:34 2007 +0000
@@ -32,6 +32,9 @@ void do_release(struct connection *conn,
void do_release(struct connection *conn, const char *domid_str);
/* domid */
+void do_resume(struct connection *conn, const char *domid_str);
+
+/* domid */
void do_get_domain_path(struct connection *conn, const char *domid_str);
/* Returns the event channel handle */
diff -r dcb145f858e3 -r 9a1809ce711b tools/xenstore/xs.c
--- a/tools/xenstore/xs.c Fri Jan 19 15:23:41 2007 +0000
+++ b/tools/xenstore/xs.c Fri Jan 19 15:28:34 2007 +0000
@@ -719,6 +719,12 @@ bool xs_release_domain(struct xs_handle
return xs_bool(single_with_domid(h, XS_RELEASE, domid));
}
+/* clear the shutdown bit for the given domain */
+bool xs_resume_domain(struct xs_handle *h, unsigned int domid)
+{
+ return xs_bool(single_with_domid(h, XS_RESUME, domid));
+}
+
char *xs_get_domain_path(struct xs_handle *h, unsigned int domid)
{
char domid_str[MAX_STRLEN(domid)];
diff -r dcb145f858e3 -r 9a1809ce711b tools/xenstore/xs.h
--- a/tools/xenstore/xs.h Fri Jan 19 15:23:41 2007 +0000
+++ b/tools/xenstore/xs.h Fri Jan 19 15:28:34 2007 +0000
@@ -133,6 +133,11 @@ bool xs_introduce_domain(struct xs_handl
unsigned int domid,
unsigned long mfn,
unsigned int eventchn);
+/* Resume a domain.
+ * Clear the shutdown flag for this domain in the store.
+ */
+bool xs_resume_domain(struct xs_handle *h, unsigned int domid);
+
/* Release a domain.
* Tells the store domain to release the memory page to the domain.
*/
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|