]> xenbits.xensource.com Git - xen.git/commitdiff
tools/xenstore: evaluate the live update flag when starting
authorJuergen Gross <jgross@suse.com>
Wed, 13 Jan 2021 13:00:19 +0000 (14:00 +0100)
committerJuergen Gross <jgross@suse.com>
Thu, 21 Jan 2021 16:31:41 +0000 (17:31 +0100)
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@suse.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
Acked-by: Wei Liu <wl@xen.org>
tools/xenstore/xenstored_control.c
tools/xenstore/xenstored_control.h
tools/xenstore/xenstored_core.c
tools/xenstore/xenstored_domain.c
tools/xenstore/xenstored_domain.h
tools/xenstore/xenstored_posix.c

index 63b1f9a8b7bd837b3ef64746ffc78fd52a131c73..5151c1448e22a3370deeddc52bdb9ab93f723f22 100644 (file)
@@ -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.";
index 207e0a6fa352cb1923405f9c005504bcecaf06ad..aac61f05908fa8565f4cc4f72347c06f42e23aec 100644 (file)
@@ -17,3 +17,4 @@
 */
 
 int do_control(struct connection *conn, struct buffered_data *in);
+void lu_read_state(void);
index 2ef4534de7edfaa8ec5fa81cdae5bb7d383f2d27..4d88aeba3dde21a41997d3a7e908d08738040142 100644 (file)
@@ -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. */
index 71b078caf35bd832718bf981a5f2ba4372737259..775546757ba828b1d1825da7714dd22599655321 100644 (file)
@@ -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");
index 413b97437566e6e20c4fa532ce1a0eb7cf7695f7..b20269b038d132e8b3f1e6153318634023547cdd 100644 (file)
@@ -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);
index ae3e63e07f051776895a7c514cb1bfc975909753..48c37ffe3e030627123b9626d982bafde15f3adf 100644 (file)
@@ -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])