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

[Xen-devel] [PATCH 13/18] xenstored: support running in minios stubdom



A previous versions of this patch has been sent to xen-devel. See
http://lists.xensource.com/archives/html/xen-devel/2009-03/msg01655.html

Originally-by: Diego Ongaro <diego.ongaro@xxxxxxxxxx>
Originally-by: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>
Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
 extras/mini-os/include/list.h          |    6 ++--
 extras/mini-os/main.c                  |    4 +++
 stubdom/Makefile                       |   29 +++++++++++++++++--
 tools/xenstore/Makefile                |    9 +++++-
 tools/xenstore/tdb.c                   |    6 ++--
 tools/xenstore/utils.h                 |    2 +
 tools/xenstore/xenstored_core.c        |   47 ++++++++++++++++++++++++++++++-
 tools/xenstore/xenstored_domain.c      |    7 +++++
 tools/xenstore/xenstored_transaction.c |    2 +
 9 files changed, 100 insertions(+), 12 deletions(-)

diff --git a/extras/mini-os/include/list.h b/extras/mini-os/include/list.h
index a60ae23..4e6a2ac 100644
--- a/extras/mini-os/include/list.h
+++ b/extras/mini-os/include/list.h
@@ -1,5 +1,5 @@
-#ifndef _LINUX_LIST_H
-#define _LINUX_LIST_H
+#ifndef _MINIOS_LIST_H
+#define _MINIOS_LIST_H
 
 /*
  * Simple doubly linked list implementation.
@@ -186,5 +186,5 @@ static __inline__ void minios_list_splice(struct 
minios_list_head *list, struct
                n = minios_list_entry(pos->member.next, typeof(*pos), member);  
\
             &pos->member != (head);                                    \
             pos = n, n = minios_list_entry(n->member.next, typeof(*n), member))
-#endif /* _LINUX_LIST_H */
+#endif /* _MINIOS_LIST_H */
 
diff --git a/extras/mini-os/main.c b/extras/mini-os/main.c
index b95b889..cd89849 100644
--- a/extras/mini-os/main.c
+++ b/extras/mini-os/main.c
@@ -60,6 +60,7 @@ static void call_main(void *p)
      * crashing. */
     //sleep(1);
 
+#ifndef CONFIG_XENSTORE
 #ifndef CONFIG_GRUB
     sparse((unsigned long) &__app_bss_start, &__app_bss_end - 
&__app_bss_start);
 #if defined(HAVE_LWIP) && !defined(CONFIG_QEMU)
@@ -67,6 +68,7 @@ static void call_main(void *p)
 #endif
 #endif
     create_thread("pcifront", pcifront_watches, NULL);
+#endif
 
 #ifdef CONFIG_QEMU
     /* Fetch argc, argv from XenStore */
@@ -169,9 +171,11 @@ void _exit(int ret)
     close_all_files();
     __libc_fini_array();
     printk("main returned %d\n", ret);
+#ifndef CONFIG_XENSTORE
 #ifdef HAVE_LWIP
     stop_networking();
 #endif
+#endif
     stop_kernel();
     if (!ret) {
        /* No problem, just shutdown.  */
diff --git a/stubdom/Makefile b/stubdom/Makefile
index 3705059..e0a90a9 100644
--- a/stubdom/Makefile
+++ b/stubdom/Makefile
@@ -74,14 +74,14 @@ TARGET_CPPFLAGS += -I$(XEN_ROOT)/xen/include
 
 TARGET_LDFLAGS += -nostdlib -L$(CROSS_PREFIX)/$(GNU_TARGET_ARCH)-xen-elf/lib
 
-TARGETS=ioemu c caml grub
+TARGETS=ioemu c caml grub xenstore
 
 CROSS_MAKE := $(MAKE) DESTDIR=
 
 .PHONY: all
 all: build
 ifeq ($(STUBDOM_SUPPORTED),1)
-build: genpath ioemu-stubdom c-stubdom pv-grub
+build: genpath ioemu-stubdom c-stubdom pv-grub xenstore-stubdom
 else
 build: genpath
 endif
@@ -262,6 +262,11 @@ mk-headers-$(XEN_TARGET_ARCH): ioemu/linkfarm.stamp
          ln -sf $(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/*.c . && \
          ln -sf $(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/*.h . && \
          ln -sf $(XEN_ROOT)/tools/libxc/$(XEN_TARGET_ARCH)/Makefile . )
+       mkdir -p xenstore
+       [ -h xenstore/Makefile ] || ( cd xenstore && \
+         ln -sf $(XEN_ROOT)/tools/xenstore/*.c . && \
+         ln -sf $(XEN_ROOT)/tools/xenstore/*.h . && \
+         ln -sf $(XEN_ROOT)/tools/xenstore/Makefile . )
        $(CROSS_MAKE) -C $(MINI_OS) links
        touch mk-headers-$(XEN_TARGET_ARCH)
 
@@ -334,6 +339,14 @@ grub: grub-upstream $(CROSS_ROOT)
        mkdir -p grub-$(XEN_TARGET_ARCH)
        CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(CROSS_MAKE) 
-C $@ OBJ_DIR=$(CURDIR)/grub-$(XEN_TARGET_ARCH)
 
+##########
+# xenstore
+##########
+
+.PHONY: xenstore
+xenstore: $(CROSS_ROOT)
+       CPPFLAGS="$(TARGET_CPPFLAGS)" CFLAGS="$(TARGET_CFLAGS)" $(CROSS_MAKE) 
-C $@ LWIPDIR=$(CURDIR)/lwip xenstored.a CONFIG_STUBDOM=y
+
 ########
 # minios
 ########
@@ -355,12 +368,16 @@ c-stubdom: mini-os-$(XEN_TARGET_ARCH)-c 
lwip-$(XEN_TARGET_ARCH) libxc c
 pv-grub: mini-os-$(XEN_TARGET_ARCH)-grub libxc grub
        DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_GRUB 
$(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(CROSS_MAKE) -C $(MINI_OS) 
OBJ_DIR=$(CURDIR)/$< APP_OBJS=$(CURDIR)/grub-$(XEN_TARGET_ARCH)/main.a
 
+.PHONY: xenstore-stubdom
+xenstore-stubdom: mini-os-$(XEN_TARGET_ARCH)-xenstore libxc xenstore
+       DEF_CPPFLAGS="$(TARGET_CPPFLAGS)" DEF_CFLAGS="-DCONFIG_XENSTORE 
$(TARGET_CFLAGS)" DEF_LDFLAGS="$(TARGET_LDFLAGS)" $(MAKE) -C $(MINI_OS) 
OBJ_DIR=$(CURDIR)/$< LWIPDIR=$(CURDIR)/lwip-$(XEN_TARGET_ARCH) 
APP_OBJS=$(CURDIR)/xenstore/xenstored.a
+
 #########
 # install
 #########
 
 ifeq ($(STUBDOM_SUPPORTED),1)
-install: genpath install-readme install-ioemu install-grub
+install: genpath install-readme install-ioemu install-grub install-xenstore
 else
 install: genpath
 endif
@@ -379,6 +396,10 @@ install-grub: pv-grub
        $(INSTALL_DIR) "$(DESTDIR)$(XENFIRMWAREDIR)"
        $(INSTALL_DATA) mini-os-$(XEN_TARGET_ARCH)-grub/mini-os.gz 
"$(DESTDIR)$(XENFIRMWAREDIR)/pv-grub-$(XEN_TARGET_ARCH).gz"
 
+install-xenstore: xenstore-stubdom
+       $(INSTALL_DIR) "$(DESTDIR)/usr/lib/xen/boot"
+       $(INSTALL_PROG) mini-os-$(XEN_TARGET_ARCH)-xenstore/mini-os.gz 
"$(DESTDIR)/usr/lib/xen/boot/xenstore-stubdom.gz"
+
 #######
 # clean
 #######
@@ -390,12 +411,14 @@ clean:
        rm -fr mini-os-$(XEN_TARGET_ARCH)-c
        rm -fr mini-os-$(XEN_TARGET_ARCH)-caml
        rm -fr mini-os-$(XEN_TARGET_ARCH)-grub
+       rm -fr mini-os-$(XEN_TARGET_ARCH)-xenstore
        $(CROSS_MAKE) -C caml clean
        $(CROSS_MAKE) -C c clean
        rm -fr grub-$(XEN_TARGET_ARCH)
        rm -f $(STUBDOMPATH)
        [ ! -d libxc-$(XEN_TARGET_ARCH) ] || $(CROSS_MAKE) -C 
libxc-$(XEN_TARGET_ARCH) clean
        -[ ! -d ioemu ] || $(CROSS_MAKE) -C ioemu clean
+       -[ ! -d xenstore ] || $(CROSS_MAKE) -C xenstore clean
 
 # clean the cross-compilation result
 .PHONY: crossclean
diff --git a/tools/xenstore/Makefile b/tools/xenstore/Makefile
index 4facb62..3a061d6 100644
--- a/tools/xenstore/Makefile
+++ b/tools/xenstore/Makefile
@@ -28,6 +28,10 @@ endif
 
 ALL_TARGETS = libxenstore.so libxenstore.a clients xs_tdb_dump xenstored
 
+ifdef CONFIG_STUBDOM
+CFLAGS += -DNO_SOCKETS=1 -DNO_LOCAL_XENBUS=1 -DNO_SYSLOG=1 -DNO_REOPEN_LOG=1
+endif
+
 .PHONY: all
 all: $(ALL_TARGETS)
 
@@ -45,10 +49,13 @@ xenstored_probes.o: xenstored_solaris.o
 
 CFLAGS += -DHAVE_DTRACE=1
 endif
- 
+
 xenstored: $(XENSTORED_OBJS)
        $(CC) $(LDFLAGS) $^ $(LDLIBS_libxenctrl) $(SOCKET_LIBS) -o $@ 
$(APPEND_LDFLAGS)
 
+xenstored.a: $(XENSTORED_OBJS)
+       $(AR) cr $@ $^
+
 $(CLIENTS): xenstore
        ln -f xenstore $@
 
diff --git a/tools/xenstore/tdb.c b/tools/xenstore/tdb.c
index 639ce6e..75ffd2a 100644
--- a/tools/xenstore/tdb.c
+++ b/tools/xenstore/tdb.c
@@ -1334,7 +1334,7 @@ static int tdb_next_lock(TDB_CONTEXT *tdb, struct 
tdb_traverse_lock *tlock,
 
                /* Iterate through chain */
                while( tlock->off) {
-                       tdb_off current;
+                       tdb_off mycurrent;
                        if (rec_read(tdb, tlock->off, rec) == -1)
                                goto fail;
 
@@ -1352,10 +1352,10 @@ static int tdb_next_lock(TDB_CONTEXT *tdb, struct 
tdb_traverse_lock *tlock,
                        }
 
                        /* Try to clean dead ones from old traverses */
-                       current = tlock->off;
+                       mycurrent = tlock->off;
                        tlock->off = rec->next;
                        if (!tdb->read_only && 
-                           do_delete(tdb, current, rec) != 0)
+                           do_delete(tdb, mycurrent, rec) != 0)
                                goto fail;
                }
                tdb_unlock(tdb, tlock->hash, F_WRLCK);
diff --git a/tools/xenstore/utils.h b/tools/xenstore/utils.h
index f378343..2effd17 100644
--- a/tools/xenstore/utils.h
+++ b/tools/xenstore/utils.h
@@ -19,7 +19,9 @@ static inline bool strends(const char *a, const char *b)
        return streq(a + strlen(a) - strlen(b), b);
 }
 
+#ifndef ARRAY_SIZE
 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#endif
 
 void barf(const char *fmt, ...) __attribute__((noreturn));
 void barf_perror(const char *fmt, ...) __attribute__((noreturn));
diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 0623aac..2d4a7e1 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -32,7 +32,9 @@
 #include <stdio.h>
 #include <stdarg.h>
 #include <stdlib.h>
+#ifndef NO_SYSLOG
 #include <syslog.h>
+#endif
 #include <string.h>
 #include <errno.h>
 #include <dirent.h>
@@ -61,13 +63,24 @@ LIST_HEAD(connections);
 static int tracefd = -1;
 static bool recovery = true;
 static bool remove_local = true;
+#ifndef NO_REOPEN_LOG
 static int reopen_log_pipe[2];
+#endif
 static char *tracefile = NULL;
 static TDB_CONTEXT *tdb_ctx;
 
 static void corrupt(struct connection *conn, const char *fmt, ...);
 static void check_store(void);
 
+#ifdef __MINIOS__
+#define lockf(...) (-ENOSYS)
+#endif
+
+#ifdef NO_SYSLOG
+#define openlog(...) ((void) 0)
+#define syslog(...)  ((void) 0)
+#endif
+
 #define log(...)                                                       \
        do {                                                            \
                char *s = talloc_asprintf(NULL, __VA_ARGS__);           \
@@ -92,8 +105,10 @@ TDB_CONTEXT *tdb_context(struct connection *conn)
 
 bool replace_tdb(const char *newname, TDB_CONTEXT *newtdb)
 {
+#ifndef __MINIOS__
        if (rename(newname, xs_daemon_tdb()) != 0)
                return false;
+#endif
        tdb_close(tdb_ctx);
        tdb_ctx = talloc_steal(talloc_autofree_context(), newtdb);
        return true;
@@ -195,6 +210,7 @@ void trace_destroy(const void *data, const char *type)
        trace("DESTROY %s %p\n", type, data);
 }
 
+#ifndef NO_REOPEN_LOG
 /**
  * Signal handler for SIGHUP, which requests that the trace log is reopened
  * (in the main loop).  A single byte is written to reopen_log_pipe, to awaken
@@ -222,7 +238,7 @@ static void reopen_log(void)
                        trace("\n***\n");
        }
 }
-
+#endif
 
 static bool write_messages(struct connection *conn)
 {
@@ -329,7 +345,9 @@ static int initialize_set(fd_set *inset, fd_set *outset,
        set_fd(sock,               inset, &max);
        set_fd(ro_sock,            inset, &max);
 #endif
+#ifndef NO_REOPEN_LOG
        set_fd(reopen_log_pipe[0], inset, &max);
+#endif
 
        if (xce_handle != NULL)
                set_fd(xc_evtchn_fd(xce_handle), inset, &max);
@@ -1418,7 +1436,11 @@ static void accept_connection(int sock, bool canwrite)
 }
 #endif
 
+#ifdef __MINIOS__
+#define TDB_FLAGS TDB_INTERNAL|TDB_NOLOCK
+#else
 #define TDB_FLAGS 0
+#endif
 
 /* We create initial nodes manually. */
 static void manual_node(const char *name, const char *child)
@@ -1443,7 +1465,11 @@ static void setup_structure(void)
 {
        char *tdbname;
        tdbname = talloc_strdup(talloc_autofree_context(), xs_daemon_tdb());
+#ifdef __MINIOS__
+       tdb_ctx = NULL;
+#else
        tdb_ctx = tdb_open(tdbname, 0, TDB_FLAGS, O_RDWR, 0);
+#endif
 
        if (tdb_ctx) {
                /* XXX When we make xenstored able to restart, this will have
@@ -1669,6 +1695,7 @@ static void corrupt(struct connection *conn, const char 
*fmt, ...)
 }
 
 
+#ifndef __MINIOS__
 static void write_pidfile(const char *pidfile)
 {
        char buf[100];
@@ -1715,7 +1742,7 @@ static void daemonize(void)
        /* Discard our parent's old-fashioned umask prejudices. */
        umask(0);
 }
-
+#endif
 
 static void usage(void)
 {
@@ -1769,7 +1796,11 @@ int main(int argc, char *argv[])
        struct sockaddr_un addr;
 #endif
        fd_set inset, outset;
+#ifdef __MINIOS__
+       bool dofork = false;
+#else
        bool dofork = true;
+#endif
        bool outputpid = false;
        bool no_domain_init = false;
        const char *pidfile = NULL;
@@ -1823,8 +1854,11 @@ int main(int argc, char *argv[])
        if (optind != argc)
                barf("%s: No arguments desired", argv[0]);
 
+#ifndef NO_REOPEN_LOG
        reopen_log();
+#endif
 
+#ifndef __MINIOS__
        /* make sure xenstored directory exists */
        if (mkdir(xs_daemon_rundir(), 0755)) {
                if (errno != EEXIST) {
@@ -1846,6 +1880,7 @@ int main(int argc, char *argv[])
        }
        if (pidfile)
                write_pidfile(pidfile);
+#endif
 
        /* Talloc leak reports go to stderr, which is closed if we fork. */
        if (!dofork)
@@ -1890,9 +1925,11 @@ int main(int argc, char *argv[])
                barf_perror("Could not listen on sockets");
 #endif
 
+#ifndef NO_REOPEN_LOG
        if (pipe(reopen_log_pipe)) {
                barf_perror("pipe");
        }
+#endif
 
        /* Setup the database */
        setup_structure();
@@ -1921,7 +1958,9 @@ int main(int argc, char *argv[])
                xprintf = trace;
        }
 
+#ifndef NO_REOPEN_LOG
        signal(SIGHUP, trigger_reopen_log);
+#endif
 
        if (xce_handle != NULL)
                evtchn_fd = xc_evtchn_fd(xce_handle);
@@ -1933,8 +1972,10 @@ int main(int argc, char *argv[])
        max = initialize_set(&inset, &outset, &timeout);
 #endif
 
+#ifndef __MINIOS__
        /* Tell the kernel we're up and running. */
        xenbus_notify_running();
+#endif
 
        /* Main loop. */
        for (;;) {
@@ -1946,12 +1987,14 @@ int main(int argc, char *argv[])
                        barf_perror("Select failed");
                }
 
+#ifndef NO_REOPEN_LOG
                if (FD_ISSET(reopen_log_pipe[0], &inset)) {
                        char c;
                        if (read(reopen_log_pipe[0], &c, 1) != 1)
                                barf_perror("read failed");
                        reopen_log();
                }
+#endif
 
 #ifndef NO_SOCKETS
                if (FD_ISSET(*sock, &inset))
diff --git a/tools/xenstore/xenstored_domain.c 
b/tools/xenstore/xenstored_domain.c
index 0b8353b..811ae3c 100644
--- a/tools/xenstore/xenstored_domain.c
+++ b/tools/xenstore/xenstored_domain.c
@@ -588,6 +588,12 @@ void restore_existing_connections(void)
 {
 }
 
+#ifdef __MINIOS__
+static inline int dom0_init(void) 
+{
+       return 0;
+}
+#else
 static int dom0_init(void) 
 { 
        evtchn_port_t port;
@@ -611,6 +617,7 @@ static int dom0_init(void)
 
        return 0; 
 }
+#endif
 
 void domain_init(void)
 {
diff --git a/tools/xenstore/xenstored_transaction.c 
b/tools/xenstore/xenstored_transaction.c
index 380c691..c59acfb 100644
--- a/tools/xenstore/xenstored_transaction.c
+++ b/tools/xenstore/xenstored_transaction.c
@@ -120,7 +120,9 @@ static int destroy_transaction(void *_transaction)
        trace_destroy(trans, "transaction");
        if (trans->tdb)
                tdb_close(trans->tdb);
+#ifndef __MINIOS__
        unlink(trans->tdb_name);
+#endif
        return 0;
 }
 
-- 
1.7.7.5


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

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