[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen master] tools/xenstore: evaluate the live update flag when starting



commit 9777fa6b6ea02eebf83db4023effb1a1350e6a6d
Author:     Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Wed Jan 13 14:00:19 2021 +0100
Commit:     Juergen Gross <jgross@xxxxxxxx>
CommitDate: Thu Jan 21 17:31:41 2021 +0100

    tools/xenstore: evaluate the live update flag when starting
    
    In the live update case several initialization steps of xenstore must
    be omitted or modified. Add the proper handling for that.
    
    Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
    Reviewed-by: Julien Grall <jgrall@xxxxxxxxxx>
    Acked-by: Wei Liu <wl@xxxxxxx>
---
 tools/xenstore/xenstored_control.c |  5 +++++
 tools/xenstore/xenstored_control.h |  1 +
 tools/xenstore/xenstored_core.c    | 44 +++++++++++++++++++++++++++-----------
 tools/xenstore/xenstored_domain.c  | 26 +++++++++++-----------
 tools/xenstore/xenstored_domain.h  |  3 ++-
 tools/xenstore/xenstored_posix.c   |  1 -
 6 files changed, 51 insertions(+), 29 deletions(-)

diff --git a/tools/xenstore/xenstored_control.c 
b/tools/xenstore/xenstored_control.c
index 63b1f9a8b7..5151c1448e 100644
--- a/tools/xenstore/xenstored_control.c
+++ b/tools/xenstore/xenstored_control.c
@@ -453,6 +453,11 @@ static const char *lu_dump_state(const void *ctx, struct 
connection *conn)
        return ret;
 }
 
+void lu_read_state(void)
+{
+       xprintf("live-update: read state\n");
+}
+
 static const char *lu_activate_binary(const void *ctx)
 {
        return "Not yet implemented.";
diff --git a/tools/xenstore/xenstored_control.h 
b/tools/xenstore/xenstored_control.h
index 207e0a6fa3..aac61f0590 100644
--- a/tools/xenstore/xenstored_control.h
+++ b/tools/xenstore/xenstored_control.h
@@ -17,3 +17,4 @@
 */
 
 int do_control(struct connection *conn, struct buffered_data *in);
+void lu_read_state(void);
diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 2ef4534de7..4d88aeba3d 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -1687,9 +1687,10 @@ static void tdb_logger(TDB_CONTEXT *tdb, int level, 
const char * fmt, ...)
        }
 }
 
-static void setup_structure(void)
+static void setup_structure(bool live_update)
 {
        char *tdbname;
+
        tdbname = talloc_strdup(talloc_autofree_context(), xs_daemon_tdb());
        if (!tdbname)
                barf_perror("Could not create tdbname");
@@ -1703,14 +1704,17 @@ static void setup_structure(void)
        if (!tdb_ctx)
                barf_perror("Could not create tdb file %s", tdbname);
 
-       manual_node("/", "tool");
-       manual_node("/tool", "xenstored");
-       manual_node("/tool/xenstored", NULL);
+       if (live_update)
+               manual_node("/", NULL);
+       else {
+               manual_node("/", "tool");
+               manual_node("/tool", "xenstored");
+               manual_node("/tool/xenstored", NULL);
+       }
 
        check_store();
 }
 
-
 static unsigned int hash_from_key_fn(void *k)
 {
        char *str = k;
@@ -2116,7 +2120,8 @@ int main(int argc, char *argv[])
 
        if (dofork) {
                openlog("xenstored", 0, LOG_DAEMON);
-               daemonize();
+               if (!live_update)
+                       daemonize();
        }
        if (pidfile)
                write_pidfile(pidfile);
@@ -2131,17 +2136,20 @@ int main(int argc, char *argv[])
        talloc_enable_null_tracking();
 
 #ifndef NO_SOCKETS
-       init_sockets();
+       if (!live_update)
+               init_sockets();
 #endif
 
        init_pipe(reopen_log_pipe);
 
        /* Setup the database */
-       setup_structure();
+       setup_structure(live_update);
 
        /* Listen to hypervisor. */
-       if (!no_domain_init)
-               domain_init();
+       if (!no_domain_init && !live_update) {
+               domain_init(-1);
+               dom0_init();
+       }
 
        if (outputpid) {
                printf("%ld\n", (long)getpid());
@@ -2149,13 +2157,21 @@ int main(int argc, char *argv[])
        }
 
        /* redirect to /dev/null now we're ready to accept connections */
-       if (dofork)
+       if (dofork && !live_update)
                finish_daemonize();
+#ifndef __MINIOS__
+       if (dofork)
+               xprintf = trace;
+#endif
 
        signal(SIGHUP, trigger_reopen_log);
        if (tracefile)
                tracefile = talloc_strdup(NULL, tracefile);
 
+       /* Read state in case of live update. */
+       if (live_update)
+               lu_read_state();
+
        /* Get ready to listen to the tools. */
        initialize_fds(&sock_pollfd_idx, &timeout);
 
@@ -2163,8 +2179,10 @@ int main(int argc, char *argv[])
        xenbus_notify_running();
 
 #if defined(XEN_SYSTEMD_ENABLED)
-       sd_notify(1, "READY=1");
-       fprintf(stderr, SD_NOTICE "xenstored is ready\n");
+       if (!live_update) {
+               sd_notify(1, "READY=1");
+               fprintf(stderr, SD_NOTICE "xenstored is ready\n");
+       }
 #endif
 
        /* Main loop. */
diff --git a/tools/xenstore/xenstored_domain.c 
b/tools/xenstore/xenstored_domain.c
index 71b078caf3..775546757b 100644
--- a/tools/xenstore/xenstored_domain.c
+++ b/tools/xenstore/xenstored_domain.c
@@ -706,29 +706,23 @@ bool check_perms_special(const char *name, struct 
connection *conn)
        return perm_for_conn(conn, p) & XS_PERM_READ;
 }
 
-static int dom0_init(void) 
-{ 
+void dom0_init(void)
+{
        evtchn_port_t port;
        struct domain *dom0;
 
        port = xenbus_evtchn();
        if (port == -1)
-               return -1;
+               barf_perror("Failed to initialize dom0 port");
 
        dom0 = introduce_domain(NULL, xenbus_master_domid(), port);
        if (!dom0)
-               return -1;
+               barf_perror("Failed to initialize dom0");
 
        xenevtchn_notify(xce_handle, dom0->port);
-
-       if (set_dom_perms_default(&dom_release_perms) ||
-           set_dom_perms_default(&dom_introduce_perms))
-               return -1;
-
-       return 0; 
 }
 
-void domain_init(void)
+void domain_init(int evtfd)
 {
        int rc;
 
@@ -758,13 +752,17 @@ void domain_init(void)
 
        talloc_set_destructor(xgt_handle, close_xgt_handle);
 
-       xce_handle = xenevtchn_open(NULL, XENEVTCHN_NO_CLOEXEC);
+       if (evtfd < 0)
+               xce_handle = xenevtchn_open(NULL, XENEVTCHN_NO_CLOEXEC);
+       else
+               xce_handle = xenevtchn_fdopen(NULL, evtfd, 0);
 
        if (xce_handle == NULL)
                barf_perror("Failed to open evtchn device");
 
-       if (dom0_init() != 0) 
-               barf_perror("Failed to initialize dom0 state"); 
+       if (set_dom_perms_default(&dom_release_perms) ||
+           set_dom_perms_default(&dom_introduce_perms))
+               barf_perror("Failed to set special permissions");
 
        if ((rc = xenevtchn_bind_virq(xce_handle, VIRQ_DOM_EXC)) == -1)
                barf_perror("Failed to bind to domain exception virq port");
diff --git a/tools/xenstore/xenstored_domain.h 
b/tools/xenstore/xenstored_domain.h
index 413b974375..b20269b038 100644
--- a/tools/xenstore/xenstored_domain.h
+++ b/tools/xenstore/xenstored_domain.h
@@ -42,7 +42,8 @@ int do_get_domain_path(struct connection *conn, struct 
buffered_data *in);
 /* Allow guest to reset all watches */
 int do_reset_watches(struct connection *conn, struct buffered_data *in);
 
-void domain_init(void);
+void domain_init(int evtfd);
+void dom0_init(void);
 
 /* Returns the implicit path of a connection (only domains have this) */
 const char *get_implicit_path(const struct connection *conn);
diff --git a/tools/xenstore/xenstored_posix.c b/tools/xenstore/xenstored_posix.c
index ae3e63e07f..48c37ffe3e 100644
--- a/tools/xenstore/xenstored_posix.c
+++ b/tools/xenstore/xenstored_posix.c
@@ -85,7 +85,6 @@ void finish_daemonize(void)
        dup2(devnull, STDOUT_FILENO);
        dup2(devnull, STDERR_FILENO);
        close(devnull);
-       xprintf = trace;
 }
 
 void init_pipe(int reopen_log_pipe[2])
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.