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

Re: [Xen-devel] [PATCH 21/24] [xen-unstable.hg] utility for accessing xenstore stubdom console which doesn't use xenstore



Hi,

I've attached an updated version of this patch which fixes a bug.

xenconsole_dump was sending a notification on the console evtchn after reading from the console shared page, but this causes crashes in minios VMs such as the xenstore stubdomain.

Removing the unnecessary xc_evtchn_notify() call in xenconsole_dump makes it possible to run "/etc/init.d/xenstored console" without crashing the xenstore stubdom.

Alex Zeffertt wrote:


This is a very dumb xenconsole backend that does not use xenstore.

Signed-off-by: Diego Ongaro <diego.ongaro@xxxxxxxxxx>
Signed-off-by: Alex Zeffertt <alex.zeffertt@xxxxxxxxxxxxx>
---

diff -r 3d1e54a046d3 .hgignore
--- a/.hgignore Mon Jun 08 14:13:00 2009 +0100
+++ b/.hgignore Wed Jun 10 16:11:09 2009 +0100
@@ -196,6 +196,7 @@
 ^tools/misc/xen-tmem-list-parse$
 ^tools/misc/xenperf$
 ^tools/misc/xenpm$
+^tools/misc/xenconsole_dump$
 ^tools/pygrub/build/.*$
 ^tools/python/build/.*$
 ^tools/python/xen/util/path\.py$
diff -r 3d1e54a046d3 tools/misc/Makefile
--- a/tools/misc/Makefile       Mon Jun 08 14:13:00 2009 +0100
+++ b/tools/misc/Makefile       Wed Jun 10 16:11:09 2009 +0100
@@ -10,7 +10,7 @@
 
 HDRS     = $(wildcard *.h)
 
-TARGETS-y := xenperf xenpm xen-tmem-list-parse
+TARGETS-y := xenperf xenpm xen-tmem-list-parse xenconsole_dump
 TARGETS-$(CONFIG_X86) += xen-detect
 TARGETS := $(TARGETS-y)
 
@@ -18,7 +18,7 @@
 SUBDIRS-$(CONFIG_MINITERM) += miniterm
 SUBDIRS := $(SUBDIRS-y)
 
-INSTALL_BIN-y := xencons
+INSTALL_BIN-y := xencons xenconsole_dump
 INSTALL_BIN-$(CONFIG_X86) += xen-detect
 INSTALL_BIN := $(INSTALL_BIN-y)
 
@@ -56,4 +56,7 @@
 xenperf xenpm: %: %.o Makefile
        $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(LDFLAGS_libxenctrl)
 
+xenconsole_dump: %: %.o Makefile
+       $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) $(LDFLAGS_libxenctrl)
+
 -include $(DEPS)
diff -r 3d1e54a046d3 tools/misc/xenconsole_dump.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/misc/xenconsole_dump.c      Wed Jun 10 16:11:09 2009 +0100
@@ -0,0 +1,142 @@
+/*
+ * This is a very dumb xenconsole backend that does not use xenstore.
+ *
+ * Copyright 2008, Diego Ongaro <diego.ongaro@xxxxxxxxxx>
+ *
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License.  See the file "COPYING" in the main directory of
+ * this archive for more details.
+ */
+
+#include <getopt.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+#include <sys/select.h>
+
+#include <xenctrl.h>
+#include <xen/grant_table.h>
+#include <xen/io/console.h>
+
+
+#define DIE() \
+do { \
+       fprintf(stderr, "DIE in %s at %s:%d\n", __FUNCTION__, __FILE__, 
__LINE__); \
+       exit(1); \
+} while (0)
+#define DIE_ON(cond) \
+do { \
+       if ((cond)) \
+               DIE(); \
+} while (0)
+
+
+static domid_t domid = -1;
+static evtchn_port_or_error_t remote_port = -1;
+static evtchn_port_or_error_t local_port = -1;
+static struct xencons_interface *intf;
+
+static int xce_handle;
+static int xcg_handle;
+
+static void
+try_dump(void)
+{
+       static char buffer[sizeof(intf->out)];
+       XENCONS_RING_IDX cons, prod, size;
+       int i = 0;
+
+       cons = intf->out_cons;
+       prod = intf->out_prod;
+       xen_mb();
+
+       size = prod - cons;
+       if ((size == 0) || (size > sizeof(intf->out)))
+               return;
+
+       while (cons != prod)
+               buffer[i++] = intf->out[MASK_XENCONS_IDX(cons++, intf->out)];
+
+       xen_mb();
+       intf->out_cons = cons;
+
+       DIE_ON(write(1, buffer, i) != i);
+}
+
+static void
+dump_ring(void)
+{
+       while (1) {
+               DIE_ON(xc_evtchn_pending(xce_handle) == -1);
+               try_dump();
+               DIE_ON(xc_evtchn_unmask(xce_handle, local_port) == -1);
+       }
+}
+
+static void
+setup(void)
+{
+       xce_handle = xc_evtchn_open();
+       DIE_ON(xce_handle == -1);
+
+       xcg_handle = xc_gnttab_open();
+       DIE_ON(xcg_handle == -1);
+
+       intf = xc_gnttab_map_grant_ref(xcg_handle,
+                                      domid,
+                                      GNTTAB_RESERVED_CONSOLE,
+                                      PROT_READ|PROT_WRITE);
+       DIE_ON(intf == NULL);
+
+       local_port = xc_evtchn_bind_interdomain(xce_handle, domid, remote_port);
+       DIE_ON(local_port == -1);
+
+}
+
+static void
+usage(char *name)
+{
+       printf("Usage: %s [-h] --domid=DOMID --remote-port=PORT\n", name);
+}
+
+int
+main(int argc, char **argv)
+{
+       const char *sopts = "h";
+       struct option lopts[] = {
+               { "help", 0, 0, 'h' },
+               { "domid", 1, 0, 'D'},
+               { "remote-port", 1, 0, 'P'},
+               { 0 },
+       };
+       int ch;
+       int opt_ind = 0;
+
+       while ((ch = getopt_long(argc, argv, sopts, lopts, &opt_ind)) != -1) {
+               switch (ch) {
+               case 'h':
+                       usage(argv[0]);
+                       exit(0);
+               case 'D':
+                       domid = (domid_t) atoi(optarg);
+                       break;
+               case 'P':
+                       remote_port = (evtchn_port_or_error_t) atoi(optarg);
+                       break;
+               }
+       }
+
+       if (domid <= 0 || remote_port < 0) {
+               usage(argv[0]);
+               exit(1);
+       }
+
+       setup();
+       dump_ring();
+
+       return 0;
+}
_______________________________________________
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®.