WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] xenstored: allow guests to shutdown all of its watch

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] xenstored: allow guests to shutdown all of its watches using XS_RESET
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=
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.7.5
# 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