[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Xen-devel] [PATCH] xenstored: allow guests to shutdown all of its watches using XS_RESET
- To: xen-devel@xxxxxxxxxxxxxxxxxxx
- From: Olaf Hering <olaf@xxxxxxxxx>
- Date: Fri, 12 Aug 2011 08:33:50 +0200
- Delivery-date: Thu, 11 Aug 2011 23:35:00 -0700
- Dkim-signature: v=1; a=rsa-sha1; c=relaxed/relaxed; t=1313130872; l=3487; s=domk; d=aepfle.de; h=To:From:Date:Subject:Content-Transfer-Encoding:MIME-Version: Content-Type:X-RZG-CLASS-ID:X-RZG-AUTH; bh=BcAMZmYuGf+A2N+w13HJIoJTuhQ=; b=sMU4rV2HzUUbAj17d+1fF5oPJ5w+kJLEefQHjqAsQRDQofvX8XrxpCkBSvIjvi2u9Rs pCYiU9CeCp0wdZthniZMc8rIHsrXeXmPPv7Kw2QRECCG0wKfs900qi8xgCTrx1yQdJOTP mSDwloBUh55z3qexKLBMyCRg6K+tTVr6ToU=
- List-id: Xen developer discussion <xen-devel.lists.xensource.com>
# HG changeset patch
# User Olaf Hering <olaf@xxxxxxxxx>
# Date 1313090526 -7200
# Node ID 31687c9a9e3edfae7cf23483c8457b011dc4d843
# Parent 1f08b380d4386cdd6714786a9163e5f51aecab5d
xenstored: allow guests to shutdown all of its watches using XS_RESET
During kexec all old watches have to be removed, otherwise the new
kernel will receive unexpected events. Allow a guest to reset itself and
cleanup all of its watches.
Add a new XS_RESET command to do the reset on behalf of the guest.
Signed-off-by: Olaf Hering <olaf@xxxxxxxxx>
diff -r 1f08b380d438 -r 31687c9a9e3e tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -120,6 +120,7 @@ static char *sockmsg_string(enum xsd_soc
case XS_IS_DOMAIN_INTRODUCED: return "XS_IS_DOMAIN_INTRODUCED";
case XS_RESUME: return "RESUME";
case XS_SET_TARGET: return "SET_TARGET";
+ case XS_RESET: return "RESET";
default:
return "**UNKNOWN**";
}
@@ -1242,6 +1243,10 @@ static void process_message(struct conne
do_set_target(conn, in);
break;
+ case XS_RESET:
+ do_reset(conn, in);
+ break;
+
default:
eprintf("Client unknown operation %i", in->hdr.msg.type);
send_error(conn, ENOSYS);
diff -r 1f08b380d438 -r 31687c9a9e3e tools/xenstore/xenstored_domain.c
--- a/tools/xenstore/xenstored_domain.c
+++ b/tools/xenstore/xenstored_domain.c
@@ -537,6 +537,57 @@ void do_is_domain_introduced(struct conn
send_reply(conn, XS_IS_DOMAIN_INTRODUCED, result ? "T" : "F", 2);
}
+/* domid, mfn, evtchn, path */
+void do_reset(struct connection *conn, struct buffered_data *in)
+{
+ struct domain *domain;
+ char *vec[3];
+ unsigned int domid;
+ unsigned long mfn;
+ evtchn_port_t port;
+
+ if (!conn->can_write) {
+ send_error(conn, EACCES);
+ return;
+ }
+
+ if (get_strings(in, vec, ARRAY_SIZE(vec)) < ARRAY_SIZE(vec)) {
+ send_error(conn, EINVAL);
+ return;
+ }
+
+ domid = atoi(vec[0]);
+ mfn = atol(vec[1]);
+ port = atoi(vec[2]);
+
+ /* Sanity check args. */
+ if (port <= 0) {
+ send_error(conn, EINVAL);
+ return;
+ }
+ /* Allow guest to reset all watches */
+ if (domid != DOMID_SELF && conn->id != 0) {
+ send_error(conn, EACCES);
+ return;
+ }
+
+ domain = find_domain_by_domid(conn->id);
+
+ if (domain == NULL) {
+ send_error(conn, EINVAL);
+ return;
+ }
+
+ if (domain->mfn != mfn || domain->conn != conn || domain->port != port)
{
+ send_error(conn, EACCES);
+ return;
+ }
+
+ domain_conn_reset(domain);
+
+ send_ack(conn, XS_RESET);
+}
+
static int close_xc_handle(void *_handle)
{
xc_interface_close(*(xc_interface**)_handle);
diff -r 1f08b380d438 -r 31687c9a9e3e tools/xenstore/xenstored_domain.h
--- a/tools/xenstore/xenstored_domain.h
+++ b/tools/xenstore/xenstored_domain.h
@@ -40,6 +40,9 @@ void do_set_target(struct connection *co
/* domid */
void do_get_domain_path(struct connection *conn, const char *domid_str);
+/* domid, mfn, eventchn, path */
+void do_reset(struct connection *conn, struct buffered_data *in);
+
void domain_init(void);
/* Returns the implicit path of a connection (only domains have this) */
diff -r 1f08b380d438 -r 31687c9a9e3e xen/include/public/io/xs_wire.h
--- a/xen/include/public/io/xs_wire.h
+++ b/xen/include/public/io/xs_wire.h
@@ -48,7 +48,8 @@ enum xsd_sockmsg_type
XS_IS_DOMAIN_INTRODUCED,
XS_RESUME,
XS_SET_TARGET,
- XS_RESTRICT
+ XS_RESTRICT,
+ XS_RESET
};
#define XS_WRITE_NONE "NONE"
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel