[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
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |