[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 14/17] tools/xenstored: Auto-introduce domains
Replace dom0_init() with init_domains() which uses libxenmanage to iterate through all existing domains and introduce them. dom0_domid is updated with the xenstore domain, since it really indicates the local domain. priv_domid is set to the control domain. This makes it limited to a single domain. These features let xenstore automatically connect any existing domains, which means it doesn't need to be done manually from init-dom0less. For a legacy dom0, the result should be unchanged. For a late xenstore stubdom it should also be the same, but priv_domid would be set automatically to control domain (which default to 0 normally). Always signal the event channel for initial domains. This gets dom0 (a local xenstored domain) to connect. Also always write XENSTORE_CONNECTED since we know we are connected at this point. Signed-off-by: Jason Andryuk <jason.andryuk@xxxxxxx> --- tools/xenstored/core.c | 2 +- tools/xenstored/domain.c | 45 +++++++++++++++++++++++++++++++--------- tools/xenstored/domain.h | 2 +- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c index 550e879a00..835402af81 100644 --- a/tools/xenstored/core.c +++ b/tools/xenstored/core.c @@ -2762,7 +2762,7 @@ int main(int argc, char *argv[]) /* Listen to hypervisor. */ if (!live_update) { domain_init(-1); - dom0_init(); + init_domains(); } /* redirect to /dev/null now we're ready to accept connections */ diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c index 5443b4e608..44e997cee4 100644 --- a/tools/xenstored/domain.c +++ b/tools/xenstored/domain.c @@ -1257,20 +1257,45 @@ const char *get_implicit_path(const struct connection *conn) return conn->domain->path; } -void dom0_init(void) +void init_domains(void) { - evtchn_port_t port; - struct domain *dom0; + unsigned int domid; + unsigned int state; + unsigned int caps; + uint64_t unique_id; + + while (!xenmanage_poll_changed_domain(xm_handle, &domid, &state, &caps, + &unique_id)) { + evtchn_port_t port = 0; + struct domain *domain; + + if (caps & XENMANAGE_GETDOMSTATE_CAP_XENSTORE) + dom0_domid = domid; + + if (caps & XENMANAGE_GETDOMSTATE_CAP_CONTROL) + priv_domid = domid; - port = get_xenbus_evtchn(); - if (port == -1) - barf_perror("Failed to initialize dom0 port"); + if (domid == dom0_domid) { + port = get_xenbus_evtchn(); + if (port == -1) + barf_perror("Failed to initialize dom%u port", + domid); + } + + domain = introduce_domain(NULL, domid, port, false); + if (!domain) { + xprintf("Could not initialize dom%u", domid); + continue; + } - dom0 = introduce_domain(NULL, xenbus_master_domid(), port, false); - if (!dom0) - barf_perror("Failed to initialize dom0"); + domain_conn_reset(domain); - xenevtchn_notify(xce_handle, dom0->port); + if (domain->interface) + domain->interface->connection = XENSTORE_CONNECTED; + + /* Notify the domain that xenstore is available */ + xenevtchn_notify(xce_handle, domain->port); + } } void stubdom_init(void) diff --git a/tools/xenstored/domain.h b/tools/xenstored/domain.h index 844ac11510..6a78f06935 100644 --- a/tools/xenstored/domain.h +++ b/tools/xenstored/domain.h @@ -84,7 +84,7 @@ int do_reset_watches(const void *ctx, struct connection *conn, void domain_early_init(void); void domain_init(int evtfd); -void dom0_init(void); +void init_domains(void); void stubdom_init(void); void domain_deinit(void); void ignore_connection(struct connection *conn, unsigned int err); -- 2.50.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |