All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xenstored: allow guests to shutdown all of its watches using XS_RESET
@ 2011-08-12  6:33 Olaf Hering
  2011-08-12  6:42 ` [PATCH] xen/pv-on-hvm kexec: add xs_reset to shutdown watches from old kernel Olaf Hering
  2011-08-25 15:10 ` [PATCH] xenstored: allow guests to shutdown all of its watches using XS_RESET Ian Jackson
  0 siblings, 2 replies; 5+ messages in thread
From: Olaf Hering @ 2011-08-12  6:33 UTC (permalink / raw)
  To: xen-devel

# HG changeset patch
# User Olaf Hering <olaf@aepfle.de>
# 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@aepfle.de>

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"

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2011-08-25 15:34 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-12  6:33 [PATCH] xenstored: allow guests to shutdown all of its watches using XS_RESET Olaf Hering
2011-08-12  6:42 ` [PATCH] xen/pv-on-hvm kexec: add xs_reset to shutdown watches from old kernel Olaf Hering
2011-08-25 15:10 ` [PATCH] xenstored: allow guests to shutdown all of its watches using XS_RESET Ian Jackson
2011-08-25 15:19   ` Olaf Hering
2011-08-25 15:34     ` Ian Jackson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.