* [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
@ 2009-04-08 18:34 Anthony Liguori
2009-04-08 18:34 ` [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
` (2 more replies)
0 siblings, 3 replies; 63+ messages in thread
From: Anthony Liguori @ 2009-04-08 18:34 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
Right now only one monitor device can be enabled at a time. In order to support
asynchronous notification of events, I would like to introduce a 'wait' command
that waits for an event to occur. This implies that we need an additional
monitor session to allow commands to still be executed while waiting for an
asynchronous notification.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/vl.c b/vl.c
index 4bd173f..f78cabb 100644
--- a/vl.c
+++ b/vl.c
@@ -184,6 +184,9 @@ int main(int argc, char **argv)
/* Max number of bluetooth switches on the commandline. */
#define MAX_BT_CMDLINE 10
+/* Maximum number of monitor devices */
+#define MAX_MONITOR_DEVICES 10
+
/* XXX: use a two level table to limit memory usage */
#define MAX_IOPORTS 65536
@@ -4252,8 +4255,9 @@ int main(int argc, char **argv, char **envp)
int hda_index;
int optind;
const char *r, *optarg;
- CharDriverState *monitor_hd = NULL;
- const char *monitor_device;
+ CharDriverState *monitor_hds[MAX_MONITOR_DEVICES];
+ const char *monitor_devices[MAX_MONITOR_DEVICES];
+ int monitor_device_index;
const char *serial_devices[MAX_SERIAL_PORTS];
int serial_device_index;
const char *parallel_devices[MAX_PARALLEL_PORTS];
@@ -4324,7 +4328,6 @@ int main(int argc, char **argv, char **envp)
kernel_cmdline = "";
cyls = heads = secs = 0;
translation = BIOS_ATA_TRANSLATION_AUTO;
- monitor_device = "vc:80Cx24C";
serial_devices[0] = "vc:80Cx24C";
for(i = 1; i < MAX_SERIAL_PORTS; i++)
@@ -4340,6 +4343,11 @@ int main(int argc, char **argv, char **envp)
virtio_consoles[i] = NULL;
virtio_console_index = 0;
+ monitor_devices[0] = "vc:80Cx24C";
+ for (i = 1; i < MAX_MONITOR_DEVICES; i++)
+ monitor_devices[i] = NULL;
+ monitor_device_index = 0;
+
usb_devices_index = 0;
nb_net_clients = 0;
@@ -4723,7 +4731,12 @@ int main(int argc, char **argv, char **envp)
break;
}
case QEMU_OPTION_monitor:
- monitor_device = optarg;
+ if (monitor_device_index >= MAX_MONITOR_DEVICES) {
+ fprintf(stderr, "qemu: too many monitor devices\n");
+ exit(1);
+ }
+ monitor_devices[monitor_device_index] = optarg;
+ monitor_device_index++;
break;
case QEMU_OPTION_serial:
if (serial_device_index >= MAX_SERIAL_PORTS) {
@@ -4974,8 +4987,8 @@ int main(int argc, char **argv, char **envp)
serial_devices[0] = "stdio";
if (parallel_device_index == 0)
parallel_devices[0] = "null";
- if (strncmp(monitor_device, "vc", 2) == 0)
- monitor_device = "stdio";
+ if (strncmp(monitor_devices[0], "vc", 2) == 0)
+ monitor_devices[0] = "stdio";
}
#ifndef _WIN32
@@ -5184,14 +5197,14 @@ int main(int argc, char **argv, char **envp)
#endif
/* Maintain compatibility with multiple stdio monitors */
- if (!strcmp(monitor_device,"stdio")) {
+ if (!strcmp(monitor_devices[0],"stdio")) {
for (i = 0; i < MAX_SERIAL_PORTS; i++) {
const char *devname = serial_devices[i];
if (devname && !strcmp(devname,"mon:stdio")) {
- monitor_device = NULL;
+ monitor_devices[0] = NULL;
break;
} else if (devname && !strcmp(devname,"stdio")) {
- monitor_device = NULL;
+ monitor_devices[0] = NULL;
serial_devices[i] = "mon:stdio";
break;
}
@@ -5208,11 +5221,20 @@ int main(int argc, char **argv, char **envp)
}
}
- if (monitor_device) {
- monitor_hd = qemu_chr_open("monitor", monitor_device, NULL);
- if (!monitor_hd) {
- fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
- exit(1);
+ for (i = 0; i < MAX_MONITOR_DEVICES; i++) {
+ const char *devname = monitor_devices[i];
+ if (devname && strcmp(devname, "none")) {
+ char label[32];
+ if (i == 0)
+ snprintf(label, sizeof(label), "monitor");
+ else
+ snprintf(label, sizeof(label), "monitor%d", i);
+ monitor_hds[i] = qemu_chr_open(label, devname, NULL);
+ if (!monitor_hds[i]) {
+ fprintf(stderr, "qemu: could not open monitor device '%s'\n",
+ devname);
+ exit(1);
+ }
}
}
@@ -5335,8 +5357,13 @@ int main(int argc, char **argv, char **envp)
text_consoles_set_display(display_state);
qemu_chr_initial_reset();
- if (monitor_device && monitor_hd)
- monitor_init(monitor_hd, MONITOR_USE_READLINE | MONITOR_IS_DEFAULT);
+ for (i = 0; i < MAX_MONITOR_DEVICES; i++) {
+ if (monitor_devices[i] && monitor_hds[i]) {
+ monitor_init(monitor_hds[i],
+ MONITOR_USE_READLINE |
+ ((i == 0) ? MONITOR_IS_DEFAULT : 0));
+ }
+ }
for(i = 0; i < MAX_SERIAL_PORTS; i++) {
const char *devname = serial_devices[i];
^ permalink raw reply related [flat|nested] 63+ messages in thread
* [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2)
2009-04-08 18:34 [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2) Anthony Liguori
@ 2009-04-08 18:34 ` Anthony Liguori
2009-04-08 18:34 ` [Qemu-devel] [PATCH 3/6] Introduce wait filtering (v2) Anthony Liguori
` (3 more replies)
2009-04-09 8:19 ` [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2) Avi Kivity
2009-05-11 20:54 ` Hollis Blanchard
2 siblings, 4 replies; 63+ messages in thread
From: Anthony Liguori @ 2009-04-08 18:34 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
The wait command will pause the monitor the command was issued in until a new
event becomes available. Events are queued if there isn't a waiter present.
The wait command completes after a single event is available.
Today, we queue events indefinitely but in the future, I suspect we'll drop
events that are older than a certain amount of time to avoid infinitely
allocating memory for long running VMs.
To make use of the new notification mechanism, this patch introduces a
qemu_notify_event() API. This API takes three parameters: a class which is
meant to classify the type of event being generated, a name which is meant to
distinguish which event in the class that has been generated, and a details
parameters which is meant to allow events to send arbitrary data with a given
event.
v1->v2
- Added a -d flag to poll for events instead of waiting
- Made old events expire after 10 minutes
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/Makefile b/Makefile
index 633774e..b87870b 100644
--- a/Makefile
+++ b/Makefile
@@ -84,7 +84,7 @@ OBJS+=usb-serial.o usb-net.o
OBJS+=sd.o ssi-sd.o
OBJS+=bt.o bt-host.o bt-vhci.o bt-l2cap.o bt-sdp.o bt-hci.o bt-hid.o usb-bt.o
OBJS+=buffered_file.o migration.o migration-tcp.o net.o qemu-sockets.o
-OBJS+=qemu-char.o aio.o net-checksum.o savevm.o cache-utils.o
+OBJS+=qemu-char.o aio.o net-checksum.o savevm.o cache-utils.o wait.o
ifdef CONFIG_BRLAPI
OBJS+= baum.o
diff --git a/monitor.c b/monitor.c
index ca1c11c..94c14b2 100644
--- a/monitor.c
+++ b/monitor.c
@@ -42,6 +42,7 @@
#include "migration.h"
#include "kvm.h"
#include "acl.h"
+#include "wait.h"
//#define DEBUG
//#define DEBUG_COMPLETION
@@ -1745,6 +1746,8 @@ static const mon_cmd_t mon_cmds[] = {
"acl allow vnc.username fred\n"
"acl deny vnc.username bob\n"
"acl reset vnc.username\n" },
+ { "wait", "-d", do_wait,
+ "[-d]", "wait for an asynchronous event (use -d to poll event)" },
{ NULL, NULL, },
};
diff --git a/wait.c b/wait.c
new file mode 100644
index 0000000..8f6cbad
--- /dev/null
+++ b/wait.c
@@ -0,0 +1,145 @@
+/*
+ * Asynchronous monitor notification support
+ *
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ * Anthony Liguori <aliguori@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-common.h"
+#include "monitor.h"
+#include "sys-queue.h"
+#include "osdep.h"
+#include "wait.h"
+
+typedef struct WaitEvent
+{
+ qemu_timeval timestamp;
+ char *class;
+ char *name;
+ char *details;
+ TAILQ_ENTRY(WaitEvent) node;
+} WaitEvent;
+
+typedef struct PendingWaiter
+{
+ Monitor *mon;
+ int polling;
+ TAILQ_ENTRY(PendingWaiter) node;
+} PendingWaiter;
+
+/* How long do we hold on to events (in seconds)
+ * default to 10 minutes. */
+#define EVENT_EXPIRATION_AGE (10 * 60)
+
+static TAILQ_HEAD(, WaitEvent) pending_events =
+ TAILQ_HEAD_INITIALIZER(pending_events);
+static TAILQ_HEAD(, PendingWaiter) pending_waiters =
+ TAILQ_HEAD_INITIALIZER(pending_waiters);
+
+static void free_event(WaitEvent *e)
+{
+ qemu_free(e->details);
+ qemu_free(e->name);
+ qemu_free(e->class);
+ qemu_free(e);
+}
+
+static void dispatch_event(PendingWaiter *w, WaitEvent *e)
+{
+ monitor_printf(w->mon, "%ld.%06ld: %s: %s\n",
+ e->timestamp.tv_sec, e->timestamp.tv_usec,
+ e->class, e->name);
+ if (e->details && strlen(e->details)) {
+ monitor_printf(w->mon, "%s\n", e->details);
+ }
+ if (!w->polling)
+ monitor_resume(w->mon);
+}
+
+static void remove_stale_events(void)
+{
+ qemu_timeval now;
+
+ qemu_gettimeofday(&now);
+
+ while (!TAILQ_EMPTY(&pending_events)) {
+ WaitEvent *e;
+
+ e = TAILQ_FIRST(&pending_events);
+ if ((now.tv_sec - e->timestamp.tv_sec) > EVENT_EXPIRATION_AGE) {
+ TAILQ_REMOVE(&pending_events, e, node);
+ free_event(e);
+ } else {
+ break;
+ }
+ }
+}
+
+static int try_to_process_events(void)
+{
+ int processed_events = 0;
+
+ while (!TAILQ_EMPTY(&pending_events) && !TAILQ_EMPTY(&pending_waiters)) {
+ WaitEvent *e;
+ PendingWaiter *w;
+
+ e = TAILQ_FIRST(&pending_events);
+ TAILQ_REMOVE(&pending_events, e, node);
+
+ w = TAILQ_FIRST(&pending_waiters);
+ TAILQ_REMOVE(&pending_waiters, w, node);
+
+ dispatch_event(w, e);
+
+ free_event(e);
+ qemu_free(w);
+
+ processed_events = 1;
+ }
+
+ remove_stale_events();
+
+ return processed_events;
+}
+
+void qemu_notify_event(const char *class, const char *name, const char *details)
+{
+ WaitEvent *e;
+
+ e = qemu_mallocz(sizeof(*e));
+
+ qemu_gettimeofday(&e->timestamp);
+ e->class = qemu_strdup(class);
+ e->name = qemu_strdup(name);
+ if (details)
+ e->details = qemu_strdup(details);
+
+ TAILQ_INSERT_TAIL(&pending_events, e, node);
+
+ try_to_process_events();
+}
+
+void do_wait(Monitor *mon, int polling)
+{
+ PendingWaiter *w;
+
+ w = qemu_mallocz(sizeof(*w));
+ w->mon = mon;
+ w->polling = polling;
+
+ TAILQ_INSERT_TAIL(&pending_waiters, w, node);
+
+ if (!w->polling)
+ monitor_suspend(w->mon);
+
+ if (!try_to_process_events() && w->polling) {
+ TAILQ_REMOVE(&pending_waiters, w, node);
+ qemu_free(w);
+ }
+}
diff --git a/wait.h b/wait.h
new file mode 100644
index 0000000..3fb455f
--- /dev/null
+++ b/wait.h
@@ -0,0 +1,23 @@
+/*
+ * Asynchronous monitor notification support
+ *
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ * Anthony Liguori <aliguori@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_WAIT_H
+#define QEMU_WAIT_H
+
+#include "monitor.h"
+
+void qemu_notify_event(const char *class, const char *name,
+ const char *details);
+void do_wait(Monitor *mon, int polling);
+
+#endif
^ permalink raw reply related [flat|nested] 63+ messages in thread
* [Qemu-devel] [PATCH 3/6] Introduce wait filtering (v2)
2009-04-08 18:34 ` [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
@ 2009-04-08 18:34 ` Anthony Liguori
2009-04-08 18:35 ` [Qemu-devel] [PATCH 4/6] Document new events (v2) Anthony Liguori
2009-04-08 18:43 ` [Qemu-devel] Re: [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
` (2 subsequent siblings)
3 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-08 18:34 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
This patch allows the wait command to be take a class mask that is used to
filter which events are waited for. Because of limitations in the monitor
callbacks, this required splitting wait into two commands: wait and poll. This
allows us to introduce the -x option to treat the mask as an exclusion mask.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/monitor.c b/monitor.c
index 94c14b2..1a7d026 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1746,8 +1746,12 @@ static const mon_cmd_t mon_cmds[] = {
"acl allow vnc.username fred\n"
"acl deny vnc.username bob\n"
"acl reset vnc.username\n" },
- { "wait", "-d", do_wait,
- "[-d]", "wait for an asynchronous event (use -d to poll event)" },
+ { "wait", "-xs?", do_wait,
+ "[-x] [mask]",
+ "wait for an asynchronous event (-x to make mask exclusive, mask specifies the event classes to wait for)" },
+ { "poll", "-xs?", do_poll,
+ "[-x] [mask]",
+ "poll for an asynchronous event (-x to make mask exclusive, mask specifies the event classes to poll for)" },
{ NULL, NULL, },
};
diff --git a/wait.c b/wait.c
index 8f6cbad..ebc156a 100644
--- a/wait.c
+++ b/wait.c
@@ -30,6 +30,8 @@ typedef struct PendingWaiter
{
Monitor *mon;
int polling;
+ int exclusive;
+ char *mask;
TAILQ_ENTRY(PendingWaiter) node;
} PendingWaiter;
@@ -50,6 +52,12 @@ static void free_event(WaitEvent *e)
qemu_free(e);
}
+static void free_waiter(PendingWaiter *w)
+{
+ qemu_free(w->mask);
+ qemu_free(w);
+}
+
static void dispatch_event(PendingWaiter *w, WaitEvent *e)
{
monitor_printf(w->mon, "%ld.%06ld: %s: %s\n",
@@ -81,6 +89,41 @@ static void remove_stale_events(void)
}
}
+static int find_string(const char *haystack, const char *needle)
+{
+ const char *p;
+ int clen = strlen(needle);
+
+ p = haystack;
+ while (p && strlen(p) >= clen) {
+ if (memcmp(p, needle, clen) == 0 &&
+ (p[clen] == 0 || p[clen] == ' ')) {
+ return 1;
+ }
+
+ p = strchr(p, ' ');
+ if (p)
+ p++;
+ }
+
+ return 0;
+}
+
+static int event_in_mask(PendingWaiter *w, WaitEvent *e)
+{
+ int ret;
+
+ if (e->class == NULL)
+ ret = 1;
+ else
+ ret = find_string(w->mask, e->class);
+
+ if (w->exclusive)
+ ret = !ret;
+
+ return ret;
+}
+
static int try_to_process_events(void)
{
int processed_events = 0;
@@ -92,15 +135,21 @@ static int try_to_process_events(void)
e = TAILQ_FIRST(&pending_events);
TAILQ_REMOVE(&pending_events, e, node);
- w = TAILQ_FIRST(&pending_waiters);
- TAILQ_REMOVE(&pending_waiters, w, node);
+ TAILQ_FOREACH(w, &pending_waiters, node) {
+ if (event_in_mask(w, e))
+ break;
+ }
- dispatch_event(w, e);
+ if (w) {
+ TAILQ_REMOVE(&pending_waiters, w, node);
- free_event(e);
- qemu_free(w);
+ dispatch_event(w, e);
- processed_events = 1;
+ free_event(e);
+ free_waiter(w);
+
+ processed_events = 1;
+ }
}
remove_stale_events();
@@ -125,13 +174,17 @@ void qemu_notify_event(const char *class, const char *name, const char *details)
try_to_process_events();
}
-void do_wait(Monitor *mon, int polling)
+static void wait_with_mask(Monitor *mon, int polling, int exclusive,
+ const char *mask)
{
PendingWaiter *w;
w = qemu_mallocz(sizeof(*w));
w->mon = mon;
w->polling = polling;
+ w->exclusive = exclusive;
+ if (mask && strlen(mask))
+ w->mask = qemu_strdup(mask);
TAILQ_INSERT_TAIL(&pending_waiters, w, node);
@@ -140,6 +193,16 @@ void do_wait(Monitor *mon, int polling)
if (!try_to_process_events() && w->polling) {
TAILQ_REMOVE(&pending_waiters, w, node);
- qemu_free(w);
+ free_waiter(w);
}
}
+
+void do_wait(Monitor *mon, int exclusive, const char *mask)
+{
+ wait_with_mask(mon, 0, exclusive, mask);
+}
+
+void do_poll(Monitor *mon, int exclusive, const char *mask)
+{
+ wait_with_mask(mon, 1, exclusive, mask);
+}
diff --git a/wait.h b/wait.h
index 3fb455f..0942823 100644
--- a/wait.h
+++ b/wait.h
@@ -18,6 +18,7 @@
void qemu_notify_event(const char *class, const char *name,
const char *details);
-void do_wait(Monitor *mon, int polling);
+void do_wait(Monitor *mon, int exclusive, const char *mask);
+void do_poll(Monitor *mon, int exclusive, const char *mask);
#endif
^ permalink raw reply related [flat|nested] 63+ messages in thread
* [Qemu-devel] [PATCH 4/6] Document new events (v2)
2009-04-08 18:34 ` [Qemu-devel] [PATCH 3/6] Introduce wait filtering (v2) Anthony Liguori
@ 2009-04-08 18:35 ` Anthony Liguori
2009-04-08 18:35 ` [Qemu-devel] [PATCH 5/6] Implement vm-state notifications (v2) Anthony Liguori
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-08 18:35 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
This patch introduces a standard way to document all new events. It also
enforces that documentation exists for each event. This documentation includes
a description of the details parameters that the event generates.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/Makefile.target b/Makefile.target
index b32d1af..adfe81b 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -495,6 +495,7 @@ endif #CONFIG_BSD_USER
ifndef CONFIG_USER_ONLY
OBJS=vl.o osdep.o monitor.o pci.o loader.o isa_mmio.o machine.o dma-helpers.o
+OBJS+=wait-events.o
# virtio has to be here due to weird dependency between PCI and virtio-net.
# need to fix this properly
OBJS+=virtio.o virtio-blk.o virtio-balloon.o virtio-net.o virtio-console.o
diff --git a/monitor.c b/monitor.c
index 1a7d026..8aed435 100644
--- a/monitor.c
+++ b/monitor.c
@@ -43,6 +43,7 @@
#include "kvm.h"
#include "acl.h"
#include "wait.h"
+#include "wait-events.h"
//#define DEBUG
//#define DEBUG_COMPLETION
@@ -1752,6 +1753,8 @@ static const mon_cmd_t mon_cmds[] = {
{ "poll", "-xs?", do_poll,
"[-x] [mask]",
"poll for an asynchronous event (-x to make mask exclusive, mask specifies the event classes to poll for)" },
+ { "show_event", "s?s?", do_show_event, "[class [name]]",
+ "show information about supported events" },
{ NULL, NULL, },
};
diff --git a/wait-events.c b/wait-events.c
new file mode 100644
index 0000000..3617ca6
--- /dev/null
+++ b/wait-events.c
@@ -0,0 +1,143 @@
+/*
+ * Asynchronous monitor notification support
+ *
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ * Anthony Liguori <aliguori@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#include "qemu-common.h"
+#include "wait-events.h"
+
+typedef struct EventDesc
+{
+ const char *name;
+ const char *short_desc;
+ const char *long_desc;
+ const char *detail_format;
+} EventDesc;
+
+typedef struct EventClassDesc
+{
+ const char *class;
+ const char *short_desc;
+ const char *long_desc;
+ const EventDesc *events;
+} EventClassDesc;
+
+static const EventDesc vm_state_events[] = {
+ { 0 },
+};
+
+static const EventClassDesc vm_event_classes[] = {
+ { 0 },
+};
+
+static const EventDesc *find_event_desc(const EventClassDesc *desc, const char *name)
+{
+ int i;
+
+ for (i = 0; desc->events[i].name; i++) {
+ if (strcmp(desc->events[i].name, name) == 0)
+ return &desc->events[i];
+ }
+
+ return NULL;
+}
+
+static const EventClassDesc *find_event_class(const char *class)
+{
+ int i;
+
+ for (i = 0; vm_event_classes[i].class; i++) {
+ if (strcmp(vm_event_classes[i].class, class) == 0)
+ return &vm_event_classes[i];
+ }
+
+ return NULL;
+}
+
+int qemu_is_notify_event_valid(const char *class, const char *name)
+{
+ const EventClassDesc *c;
+ const EventDesc *e;
+
+ c = find_event_class(class);
+ if (c == NULL)
+ return 0;
+
+ e = find_event_desc(c, name);
+ if (e == NULL)
+ return 0;
+
+ return 1;
+}
+
+static void do_show_event_name(Monitor *mon, const EventDesc *e)
+{
+ monitor_printf(mon, "%s\n", e->long_desc);
+ if (e->detail_format && strlen(e->detail_format)) {
+ monitor_printf(mon, "\n");
+ monitor_printf(mon, "Details Format:\n");
+ monitor_printf(mon, "%s\n", e->detail_format);
+ }
+}
+
+static void do_show_event_class(Monitor *mon, const EventClassDesc *c)
+{
+ int i;
+
+ monitor_printf(mon, "%s\n", c->long_desc);
+ monitor_printf(mon, "\n");
+ monitor_printf(mon, "Events:\n");
+ for (i = 0; c->events[i].name; i++) {
+ monitor_printf(mon, " %s - %s\n",
+ c->events[i].name,
+ c->events[i].short_desc);
+ }
+}
+
+static void do_show_event_list(Monitor *mon)
+{
+ int i;
+
+ for (i = 0; vm_event_classes[i].class; i++) {
+ monitor_printf(mon, "%s - %s\n",
+ vm_event_classes[i].class,
+ vm_event_classes[i].short_desc);
+ }
+}
+
+void do_show_event(Monitor *mon, const char *class, const char *name)
+{
+ if (class && strlen(class)) {
+ const EventClassDesc *c;
+
+ c = find_event_class(class);
+ if (c == NULL) {
+ monitor_printf(mon, "Unknown class: %s\n", class);
+ return;
+ }
+
+ if (name && strlen(name)) {
+ const EventDesc *e;
+
+ e = find_event_desc(c, name);
+ if (e == NULL) {
+ monitor_printf(mon, "Unknown event: %s\n", name);
+ return;
+ }
+
+ do_show_event_name(mon, e);
+ } else {
+ do_show_event_class(mon, c);
+ }
+ } else {
+ do_show_event_list(mon);
+ }
+}
diff --git a/wait-events.h b/wait-events.h
new file mode 100644
index 0000000..4770ec5
--- /dev/null
+++ b/wait-events.h
@@ -0,0 +1,23 @@
+/*
+ * Asynchronous monitor notification support
+ *
+ * Copyright IBM, Corp. 2009
+ *
+ * Authors:
+ * Anthony Liguori <aliguori@us.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef QEMU_WAIT_EVENTS_H
+#define QEMU_WAIT_EVENTS_H
+
+#include "monitor.h"
+
+int qemu_is_notify_event_valid(const char *class, const char *name);
+
+void do_show_event(Monitor *mon, const char *class, const char *name);
+
+#endif
diff --git a/wait.c b/wait.c
index ebc156a..a976a72 100644
--- a/wait.c
+++ b/wait.c
@@ -16,6 +16,7 @@
#include "sys-queue.h"
#include "osdep.h"
#include "wait.h"
+#include "wait-events.h"
typedef struct WaitEvent
{
@@ -161,6 +162,11 @@ void qemu_notify_event(const char *class, const char *name, const char *details)
{
WaitEvent *e;
+ if (!qemu_is_notify_event_valid(class, name)) {
+ fprintf(stderr, "BUG: invalid class/name %s: %s\n", class, name);
+ abort();
+ }
+
e = qemu_mallocz(sizeof(*e));
qemu_gettimeofday(&e->timestamp);
^ permalink raw reply related [flat|nested] 63+ messages in thread
* [Qemu-devel] [PATCH 5/6] Implement vm-state notifications (v2)
2009-04-08 18:35 ` [Qemu-devel] [PATCH 4/6] Document new events (v2) Anthony Liguori
@ 2009-04-08 18:35 ` Anthony Liguori
2009-04-08 18:35 ` [Qemu-devel] [PATCH 6/6] Implement vnc-event " Anthony Liguori
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-08 18:35 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
This patch adds notification whenever a vm starts or stops.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/vl.c b/vl.c
index f78cabb..ca0bcf9 100644
--- a/vl.c
+++ b/vl.c
@@ -164,6 +164,8 @@ int main(int argc, char **argv)
#include "libslirp.h"
#endif
+#include "wait.h"
+
//#define DEBUG_UNUSED_IOPORT
//#define DEBUG_IOPORT
//#define DEBUG_NET
@@ -3545,6 +3547,11 @@ static void vm_state_notify(int running, int reason)
{
VMChangeStateEntry *e;
+ if (running)
+ qemu_notify_event("vm-state", "start", "");
+ else
+ qemu_notify_event("vm-state", "stop", "");
+
for (e = vm_change_state_head.lh_first; e; e = e->entries.le_next) {
e->cb(e->opaque, running, reason);
}
diff --git a/wait-events.c b/wait-events.c
index 3617ca6..ecd26d2 100644
--- a/wait-events.c
+++ b/wait-events.c
@@ -31,10 +31,24 @@ typedef struct EventClassDesc
} EventClassDesc;
static const EventDesc vm_state_events[] = {
+ { "start", "the VM was started",
+ "This event occurs whenever a VM's state changes from stopped to\n"
+ "started. A vm initially is in a stopped state so a start event will\n"
+ "always occur when the vm is first launched unless the -S option is\n"
+ "provided.",
+ NULL, },
+ { "stop", "the VM was stopped",
+ "This event occurs whenever a VM's state changes from started to stopped\n"
+ "A vm initially is in the stopped state but no notification is generated\n"
+ "by this.",
+ NULL, },
{ 0 },
};
static const EventClassDesc vm_event_classes[] = {
+ { "vm-state", "the VM start/stop state has changed",
+ "These events occur whenever a VM's state changes.",
+ vm_state_events, },
{ 0 },
};
^ permalink raw reply related [flat|nested] 63+ messages in thread
* [Qemu-devel] [PATCH 6/6] Implement vnc-event notifications (v2)
2009-04-08 18:35 ` [Qemu-devel] [PATCH 5/6] Implement vm-state notifications (v2) Anthony Liguori
@ 2009-04-08 18:35 ` Anthony Liguori
0 siblings, 0 replies; 63+ messages in thread
From: Anthony Liguori @ 2009-04-08 18:35 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
This patch adds notification whenever a client connects or disconnects via VNC.
I'd like to add a lot more events especially ones that are auth related but this
is at least a start.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/vnc.c b/vnc.c
index 6d93215..abe6bdf 100644
--- a/vnc.c
+++ b/vnc.c
@@ -29,6 +29,7 @@
#include "qemu_socket.h"
#include "qemu-timer.h"
#include "acl.h"
+#include "wait.h"
#define VNC_REFRESH_INTERVAL (1000 / 30)
@@ -872,6 +873,15 @@ static void audio_del(VncState *vs)
}
}
+static void vnc_send_connect_event(VncState *vs)
+{
+ qemu_notify_event("vnc-event", "connect", vs->peer_address);
+}
+
+static void vnc_send_disconnect_event(VncState *vs)
+{
+ qemu_notify_event("vnc-event", "disconnect", vs->peer_address);
+}
int vnc_client_io_error(VncState *vs, int ret, int last_errno)
{
@@ -889,6 +899,8 @@ int vnc_client_io_error(VncState *vs, int ret, int last_errno)
}
}
+ vnc_send_disconnect_event(vs);
+ qemu_free(vs->peer_address);
VNC_DEBUG("Closing down client sock %d %d\n", ret, ret < 0 ? last_errno : 0);
qemu_set_fd_handler2(vs->csock, NULL, NULL, NULL, NULL);
closesocket(vs->csock);
@@ -2008,6 +2020,9 @@ static void vnc_connect(VncDisplay *vd, int csock)
vs->next = vd->clients;
vd->clients = vs;
+
+ vs->peer_address = vnc_socket_remote_addr("client-address=%s:%s", vs->csock);
+ vnc_send_connect_event(vs);
}
static void vnc_listen_read(void *opaque)
@@ -2055,7 +2070,6 @@ void vnc_display_init(DisplayState *ds)
register_displaychangelistener(ds, dcl);
}
-
void vnc_display_close(DisplayState *ds)
{
VncDisplay *vs = ds ? (VncDisplay *)ds->opaque : vnc_display;
diff --git a/vnc.h b/vnc.h
index 3ae95f3..745d655 100644
--- a/vnc.h
+++ b/vnc.h
@@ -161,6 +161,8 @@ struct VncState
Buffer zlib_tmp;
z_stream zlib_stream[4];
+ char *peer_address;
+
VncState *next;
};
diff --git a/wait-events.c b/wait-events.c
index ecd26d2..8a2af85 100644
--- a/wait-events.c
+++ b/wait-events.c
@@ -45,10 +45,24 @@ static const EventDesc vm_state_events[] = {
{ 0 },
};
+static const EventDesc vnc_events[] = {
+ { "connect", "a client has connected",
+ "This event occurs whenever a client connects to the builtin VNC server.",
+ "address=host:service", },
+ { "disconnect", "a client has disconnected",
+ "This event occurs whenever a client disconnects to the builtin VNC server.",
+ "client-address=host:service", },
+ { 0 },
+};
+
static const EventClassDesc vm_event_classes[] = {
{ "vm-state", "the VM start/stop state has changed",
"These events occur whenever a VM's state changes.",
vm_state_events, },
+ { "vnc-event", "events from the builtin VNC server",
+ "These events are generated by the builtin VNC server. They include\n"
+ "connection information, authentication information, etc.",
+ vnc_events, },
{ 0 },
};
diff --git a/wait.c b/wait.c
index a976a72..33fb702 100644
--- a/wait.c
+++ b/wait.c
@@ -114,7 +114,7 @@ static int event_in_mask(PendingWaiter *w, WaitEvent *e)
{
int ret;
- if (e->class == NULL)
+ if (w->mask == NULL)
ret = 1;
else
ret = find_string(w->mask, e->class);
@@ -128,20 +128,18 @@ static int event_in_mask(PendingWaiter *w, WaitEvent *e)
static int try_to_process_events(void)
{
int processed_events = 0;
+ WaitEvent *e, *ne;
- while (!TAILQ_EMPTY(&pending_events) && !TAILQ_EMPTY(&pending_waiters)) {
- WaitEvent *e;
+ TAILQ_FOREACH_SAFE(e, &pending_events, node, ne) {
PendingWaiter *w;
- e = TAILQ_FIRST(&pending_events);
- TAILQ_REMOVE(&pending_events, e, node);
-
TAILQ_FOREACH(w, &pending_waiters, node) {
if (event_in_mask(w, e))
break;
}
if (w) {
+ TAILQ_REMOVE(&pending_events, e, node);
TAILQ_REMOVE(&pending_waiters, w, node);
dispatch_event(w, e);
^ permalink raw reply related [flat|nested] 63+ messages in thread
* [Qemu-devel] Re: [PATCH 2/6] Introduce monitor 'wait' command (v2)
2009-04-08 18:34 ` [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
2009-04-08 18:34 ` [Qemu-devel] [PATCH 3/6] Introduce wait filtering (v2) Anthony Liguori
@ 2009-04-08 18:43 ` Anthony Liguori
2009-04-08 19:01 ` [Qemu-devel] " Blue Swirl
2009-04-09 11:01 ` Avi Kivity
3 siblings, 0 replies; 63+ messages in thread
From: Anthony Liguori @ 2009-04-08 18:43 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Jan Kiszka, Hollis Blanchard
Anthony Liguori wrote:
> The wait command will pause the monitor the command was issued in until a new
> event becomes available. Events are queued if there isn't a waiter present.
> The wait command completes after a single event is available.
>
> Today, we queue events indefinitely but in the future, I suspect we'll drop
> events that are older than a certain amount of time to avoid infinitely
> allocating memory for long running VMs.
>
> To make use of the new notification mechanism, this patch introduces a
> qemu_notify_event() API. This API takes three parameters: a class which is
> meant to classify the type of event being generated, a name which is meant to
> distinguish which event in the class that has been generated, and a details
> parameters which is meant to allow events to send arbitrary data with a given
> event.
>
> v1->v2
> - Added a -d flag to poll for events instead of waiting
> - Made old events expire after 10 minutes
>
Shame on me. I meant to rename wait/poll to wait_event/poll_event.
It'll be in v3.
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2)
2009-04-08 18:34 ` [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
2009-04-08 18:34 ` [Qemu-devel] [PATCH 3/6] Introduce wait filtering (v2) Anthony Liguori
2009-04-08 18:43 ` [Qemu-devel] Re: [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
@ 2009-04-08 19:01 ` Blue Swirl
2009-04-08 19:02 ` Anthony Liguori
2009-04-09 11:01 ` Avi Kivity
3 siblings, 1 reply; 63+ messages in thread
From: Blue Swirl @ 2009-04-08 19:01 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
On 4/8/09, Anthony Liguori <aliguori@us.ibm.com> wrote:
> The wait command will pause the monitor the command was issued in until a new
> event becomes available. Events are queued if there isn't a waiter present.
> The wait command completes after a single event is available.
> + if (!w->polling)
> + monitor_resume(w->mon);
CODING_STYLE, chapter 4:
"Every indented statement is braced; even if the block contains just one
statement."
;-)
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2)
2009-04-08 19:01 ` [Qemu-devel] " Blue Swirl
@ 2009-04-08 19:02 ` Anthony Liguori
0 siblings, 0 replies; 63+ messages in thread
From: Anthony Liguori @ 2009-04-08 19:02 UTC (permalink / raw)
To: Blue Swirl; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Blue Swirl wrote:
> On 4/8/09, Anthony Liguori <aliguori@us.ibm.com> wrote:
>
>> The wait command will pause the monitor the command was issued in until a new
>> event becomes available. Events are queued if there isn't a waiter present.
>> The wait command completes after a single event is available.
>>
>
>
>> + if (!w->polling)
>> + monitor_resume(w->mon);
>>
>
> CODING_STYLE, chapter 4:
> "Every indented statement is braced; even if the block contains just one
> statement."
>
> ;-)
>
That's going to take me some time to get used to :-) I've been trying
to stick with it...
Regards,
Anthony Liguori
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-08 18:34 [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2) Anthony Liguori
2009-04-08 18:34 ` [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
@ 2009-04-09 8:19 ` Avi Kivity
2009-04-09 13:28 ` Anthony Liguori
2009-05-11 20:54 ` Hollis Blanchard
2 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 8:19 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
Anthony Liguori wrote:
> Right now only one monitor device can be enabled at a time. In order to support
> asynchronous notification of events, I would like to introduce a 'wait' command
> that waits for an event to occur. This implies that we need an additional
> monitor session to allow commands to still be executed while waiting for an
> asynchronous notification.
>
>
I think this is race prone. For example:
monitor 1: wait
monitor 2: hotunplug dev1
monitor 2: hotplug dev1
monitor 1: event
there is no way to tell whether event (which relates to dev1) happened
the hotunplug or after the hotunplug. In general there is no way to
correlate events to commands.
What's wrong with having async notifications? Sure, we'll need to make
sure notifications don't mix with command responses, and that all
commands are acked (the (qemu) prompt serves that purpose now), but it
seems to me do be a lot easier for the management end.
Multiple monitors would still come in useful for debugging in a managed
environment.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2)
2009-04-08 18:34 ` [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
` (2 preceding siblings ...)
2009-04-08 19:01 ` [Qemu-devel] " Blue Swirl
@ 2009-04-09 11:01 ` Avi Kivity
2009-04-09 13:40 ` Anthony Liguori
3 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 11:01 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
Anthony Liguori wrote:
> The wait command will pause the monitor the command was issued in until a new
> event becomes available. Events are queued if there isn't a waiter present.
> The wait command completes after a single event is available.
>
How do you stop a wait if there are no pending events?
> Today, we queue events indefinitely but in the future, I suspect we'll drop
> events that are older than a certain amount of time to avoid infinitely
> allocating memory for long running VMs.
>
This queueing plug the race where an event happens immediately after a
wait completes. But it could be avoided completely by having
asynchronous notifications on a single monitor.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 8:19 ` [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2) Avi Kivity
@ 2009-04-09 13:28 ` Anthony Liguori
2009-04-09 13:40 ` Avi Kivity
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 13:28 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> Anthony Liguori wrote:
>> Right now only one monitor device can be enabled at a time. In order
>> to support
>> asynchronous notification of events, I would like to introduce a
>> 'wait' command
>> that waits for an event to occur. This implies that we need an
>> additional
>> monitor session to allow commands to still be executed while waiting
>> for an
>> asynchronous notification.
>>
>>
>
> I think this is race prone. For example:
>
> monitor 1: wait
>
> monitor 2: hotunplug dev1
> monitor 2: hotplug dev1
>
> monitor 1: event
>
> there is no way to tell whether event (which relates to dev1) happened
> the hotunplug or after the hotunplug. In general there is no way to
> correlate events to commands.
events don't correlate to commands. Can you give an example of why
you'd want to correlate and event to a command.
> What's wrong with having async notifications?
Isn't this async notifications?
> Sure, we'll need to make sure notifications don't mix with command
> responses, and that all commands are acked (the (qemu) prompt serves
> that purpose now), but it seems to me do be a lot easier for the
> management end.
FWIW, you can have asynchronous completion of monitor commands. See
migration as an example. The (qemu) prompt is the ack that the command
is finished. You can only have one async command per monitor session
which is why you need multiple monitors.
If we had a non-human monitor mode, I think it would be fine to have
many monitors multiplexed over a single channel. The internal monitor
abstraction doesn't change.
I think multiplexing multiple monitor sessions requires a non-human mode
because you need to tag all output, etc. which is what we need for
non-human mode anyway.
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2)
2009-04-09 11:01 ` Avi Kivity
@ 2009-04-09 13:40 ` Anthony Liguori
2009-04-09 13:58 ` Avi Kivity
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 13:40 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> Anthony Liguori wrote:
>> The wait command will pause the monitor the command was issued in
>> until a new
>> event becomes available. Events are queued if there isn't a waiter
>> present.
>> The wait command completes after a single event is available.
>>
>
> How do you stop a wait if there are no pending events?
You mean, cancel a wait? You cannot. I thought about whether it was a
problem or not. I'm not sure.
You could introduce a wait-cancel command, but then you need a way to
identify which wait you want to cancel. I can't think of a simple way
to do that today.
>> Today, we queue events indefinitely but in the future, I suspect
>> we'll drop
>> events that are older than a certain amount of time to avoid infinitely
>> allocating memory for long running VMs.
>>
>
> This queueing plug the race where an event happens immediately after a
> wait completes. But it could be avoided completely by having
> asynchronous notifications on a single monitor.
There are multiple things I think are being confused: asynchronous
completion of monitor commands, events, monitor multiplexing, and
non-human mode.
There can only be one command active at any given time on a Monitor
context. We can have many Monitor contexts. There is currently only
one Monitor context connected to a character device at a given time.
I think what you want to see is something like this:
<input> tag=4: info cpus
<input> tag=5: info kvm
<output> tag=5,rc=0: kvm enabled
<output> tag=4,rc=0: eip = 0x0000000444
<ouput> rc=0,class=vm-state,name=start: vm started
To me, this is a combination of events, which is introduced by this
patch, a non-human monitor mode, and finally multiplexing multiple
monitors into a single session.
Right now, you can have the same functional thing by having three
monitors. In the first monitor you'd see:
(qemu) info cpus
eip = 0x000000444
(qemu)
In the second you'd see:
(qemu) info kvm
kvm enabled
(qemu)
In the third you'd see:
(qemu) wait
23423423.23423: vm-state: start: vm started
(qemu)
Even those the two info commands today are synchronous, there's nothing
requiring them to be (see migrate as an example). So I think we're in
agreement but you just want to jump ahead 6 months ;-)
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 13:28 ` Anthony Liguori
@ 2009-04-09 13:40 ` Avi Kivity
2009-04-09 13:47 ` Anthony Liguori
0 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 13:40 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>> Anthony Liguori wrote:
>>> Right now only one monitor device can be enabled at a time. In
>>> order to support
>>> asynchronous notification of events, I would like to introduce a
>>> 'wait' command
>>> that waits for an event to occur. This implies that we need an
>>> additional
>>> monitor session to allow commands to still be executed while waiting
>>> for an
>>> asynchronous notification.
>>>
>>>
>>
>> I think this is race prone. For example:
>>
>> monitor 1: wait
>>
>> monitor 2: hotunplug dev1
>> monitor 2: hotplug dev1
>>
>> monitor 1: event
>>
>> there is no way to tell whether event (which relates to dev1)
>> happened the hotunplug or after the hotunplug. In general there is
>> no way to correlate events to commands.
>
> events don't correlate to commands. Can you give an example of why
> you'd want to correlate and event to a command.
hotplug disk
-ENOSPC on disk
It's true that events don't correlate directly to commands, but they do
correlate to the state of the system and that is affected by commands.
>
>> What's wrong with having async notifications?
>
> Isn't this async notifications?
I meant, on the good old single monitor.
>
>> Sure, we'll need to make sure notifications don't mix with command
>> responses, and that all commands are acked (the (qemu) prompt serves
>> that purpose now), but it seems to me do be a lot easier for the
>> management end.
>
> FWIW, you can have asynchronous completion of monitor commands. See
> migration as an example. The (qemu) prompt is the ack that the
> command is finished. You can only have one async command per monitor
> session which is why you need multiple monitors.
Migration has the -d switch to be truly async (not to wait). We need an
async notifier to tell us migration has finished or failed.
If you go the multiple monitor route, you need one monitor per
long-running command. That way -> madness. Moreover, having long
running commands block implies there is no way to cancel them.
>
> If we had a non-human monitor mode, I think it would be fine to have
> many monitors multiplexed over a single channel. The internal monitor
> abstraction doesn't change.
I don't understand why we need to multiplex many monitors over one
channel. Let's keep one monitor, but with the ability to send
notifications to the other end.
>
> I think multiplexing multiple monitor sessions requires a non-human
> mode because you need to tag all output, etc. which is what we need
> for non-human mode anyway.
>
I think this is orthogonal.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 13:40 ` Avi Kivity
@ 2009-04-09 13:47 ` Anthony Liguori
2009-04-09 14:03 ` Avi Kivity
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 13:47 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> hotplug disk
> -ENOSPC on disk
>
> It's true that events don't correlate directly to commands, but they
> do correlate to the state of the system and that is affected by commands.
events are time stamped. In non-human mode, I think command responses
should be time stamped too so that a management tool knows when the
event was generated and can correlate the system state to the particular
event.
>>> Sure, we'll need to make sure notifications don't mix with command
>>> responses, and that all commands are acked (the (qemu) prompt serves
>>> that purpose now), but it seems to me do be a lot easier for the
>>> management end.
>>
>> FWIW, you can have asynchronous completion of monitor commands. See
>> migration as an example. The (qemu) prompt is the ack that the
>> command is finished. You can only have one async command per monitor
>> session which is why you need multiple monitors.
>
> Migration has the -d switch to be truly async (not to wait). We need
> an async notifier to tell us migration has finished or failed.
Multiplexing multiple monitor sessions AFAICT is going to require a
non-human mode. But it's totally orthogonal to this patch set. You
could implement it today if you wanted.
>>
>> If we had a non-human monitor mode, I think it would be fine to have
>> many monitors multiplexed over a single channel. The internal
>> monitor abstraction doesn't change.
>
> I don't understand why we need to multiplex many monitors over one
> channel. Let's keep one monitor, but with the ability to send
> notifications to the other end.
I don't understand how you think it would be implemented. Each command
is going to have a unique 'Monitor *' associated with it. How that ends
up being displayed to the user/management tool is irrelevant. Right
now, you can only have one 'Monitor *' active on a single "channel" at a
time. This is mostly a matter of output format. I don't see how we can
keep the monitor output consistent and compatible as it stands today and
still support multiple 'Monitor *'s active in a single channel.
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2)
2009-04-09 13:40 ` Anthony Liguori
@ 2009-04-09 13:58 ` Avi Kivity
2009-04-09 14:19 ` Jan Kiszka
0 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 13:58 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>> Anthony Liguori wrote:
>>> The wait command will pause the monitor the command was issued in
>>> until a new
>>> event becomes available. Events are queued if there isn't a waiter
>>> present.
>>> The wait command completes after a single event is available.
>>>
>>
>> How do you stop a wait if there are no pending events?
>
> You mean, cancel a wait? You cannot. I thought about whether it was
> a problem or not. I'm not sure.
A management agent might want to detach from guests, upgrade, restart,
and reattach.
>
> You could introduce a wait-cancel command, but then you need a way to
> identify which wait you want to cancel. I can't think of a simple way
> to do that today.
This, as well as the queueing that's necessary with this model,
indicates (to me) that it is too complicated.
>
>>> Today, we queue events indefinitely but in the future, I suspect
>>> we'll drop
>>> events that are older than a certain amount of time to avoid infinitely
>>> allocating memory for long running VMs.
>>>
>>
>> This queueing plug the race where an event happens immediately after
>> a wait completes. But it could be avoided completely by having
>> asynchronous notifications on a single monitor.
>
> There are multiple things I think are being confused: asynchronous
> completion of monitor commands, events, monitor multiplexing, and
> non-human mode.
>
> There can only be one command active at any given time on a Monitor
> context. We can have many Monitor contexts. There is currently only
> one Monitor context connected to a character device at a given time.
Don't think of 'migrate -d' as a command to perform migration, instead
it's a command to start migration.
I also object to exposing internal qemu implementation details like
monitor contexts to the user (by forcing them to have multiple
connections). If we can't have more than one monitor command, we need
to fix that.
>
> I think what you want to see is something like this:
>
> <input> tag=4: info cpus
> <input> tag=5: info kvm
> <output> tag=5,rc=0: kvm enabled
> <output> tag=4,rc=0: eip = 0x0000000444
> <ouput> rc=0,class=vm-state,name=start: vm started
>
> To me, this is a combination of events, which is introduced by this
> patch, a non-human monitor mode, and finally multiplexing multiple
> monitors into a single session.
>
> Right now, you can have the same functional thing by having three
> monitors. In the first monitor you'd see:
>
> (qemu) info cpus
> eip = 0x000000444
> (qemu)
>
> In the second you'd see:
>
> (qemu) info kvm
> kvm enabled
> (qemu)
>
> In the third you'd see:
>
> (qemu) wait
> 23423423.23423: vm-state: start: vm started
> (qemu)
>
> Even those the two info commands today are synchronous, there's
> nothing requiring them to be (see migrate as an example). So I think
> we're in agreement but you just want to jump ahead 6 months ;-)
>
Commands which are inherently synchronous should remain so. Commands
which are inherently async should be coded like that. It was a mistake
IMO to have 'migrate' be a synchronous command, it should have always
behaved as if -d is given.
Having tagged replies is a good idea, but IMO, introducing multiple
monitors will create a lot of subtle problems, several of which we've
already identified.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 13:47 ` Anthony Liguori
@ 2009-04-09 14:03 ` Avi Kivity
2009-04-09 14:13 ` Anthony Liguori
2009-04-09 14:15 ` [libvirt] " Gerd Hoffmann
0 siblings, 2 replies; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 14:03 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>> hotplug disk
>> -ENOSPC on disk
>>
>> It's true that events don't correlate directly to commands, but they
>> do correlate to the state of the system and that is affected by
>> commands.
>
> events are time stamped. In non-human mode, I think command responses
> should be time stamped too so that a management tool knows when the
> event was generated and can correlate the system state to the
> particular event.
Timestamping doesn't help since the command could have been delayed in
the monitor socket.
Further, we're now so deep down the complexity spiral that it has now
become the most complicated piece of code in the entire system. Surely
the best way to synchronize events is to keep them on one timeline?
>>>> Sure, we'll need to make sure notifications don't mix with
>>>> command responses, and that all commands are acked (the (qemu)
>>>> prompt serves that purpose now), but it seems to me do be a lot
>>>> easier for the management end.
>>>
>>> FWIW, you can have asynchronous completion of monitor commands. See
>>> migration as an example. The (qemu) prompt is the ack that the
>>> command is finished. You can only have one async command per
>>> monitor session which is why you need multiple monitors.
>>
>> Migration has the -d switch to be truly async (not to wait). We need
>> an async notifier to tell us migration has finished or failed.
>
> Multiplexing multiple monitor sessions AFAICT is going to require a
> non-human mode. But it's totally orthogonal to this patch set. You
> could implement it today if you wanted.
I don't want multiplexed monitor sessions, at all. I want async
notifications added to a single monitor session. That too could be
implemented today (as simple as a term_printf("notification: ...\n");
>>>
>>> If we had a non-human monitor mode, I think it would be fine to have
>>> many monitors multiplexed over a single channel. The internal
>>> monitor abstraction doesn't change.
>>
>> I don't understand why we need to multiplex many monitors over one
>> channel. Let's keep one monitor, but with the ability to send
>> notifications to the other end.
>
> I don't understand how you think it would be implemented. Each
> command is going to have a unique 'Monitor *' associated with it. How
> that ends up being displayed to the user/management tool is
> irrelevant. Right now, you can only have one 'Monitor *' active on a
> single "channel" at a time. This is mostly a matter of output
> format. I don't see how we can keep the monitor output consistent and
> compatible as it stands today and still support multiple 'Monitor *'s
> active in a single channel.
>
Again, I have no interest in multiple Monitor *s on the same channel.
One is quite sufficient.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:03 ` Avi Kivity
@ 2009-04-09 14:13 ` Anthony Liguori
2009-04-09 14:28 ` Avi Kivity
2009-04-09 14:15 ` [libvirt] " Gerd Hoffmann
1 sibling, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 14:13 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> Anthony Liguori wrote:
>> Avi Kivity wrote:
>>> hotplug disk
>>> -ENOSPC on disk
>>>
>>> It's true that events don't correlate directly to commands, but they
>>> do correlate to the state of the system and that is affected by
>>> commands.
>>
>> events are time stamped. In non-human mode, I think command
>> responses should be time stamped too so that a management tool knows
>> when the event was generated and can correlate the system state to
>> the particular event.
>
> Timestamping doesn't help since the command could have been delayed in
> the monitor socket.
>
> Further, we're now so deep down the complexity spiral that it has now
> become the most complicated piece of code in the entire system.
You certainly cannot believe that, can you?
> Surely the best way to synchronize events is to keep them on one
> timeline?
Can you show exactly how you would expect things to work in the monitor
output? I'm having a hard time understanding what you're suggesting.
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:03 ` Avi Kivity
2009-04-09 14:13 ` Anthony Liguori
@ 2009-04-09 14:15 ` Gerd Hoffmann
2009-04-09 14:19 ` Avi Kivity
1 sibling, 1 reply; 63+ messages in thread
From: Gerd Hoffmann @ 2009-04-09 14:15 UTC (permalink / raw)
To: Avi Kivity
Cc: libvir-list, Anthony Liguori, Jan Kiszka, qemu-devel,
Hollis Blanchard
On 04/09/09 16:03, Avi Kivity wrote:
> I don't want multiplexed monitor sessions, at all.
I'm very happy to finally see them. Finally one can run vms with
libvirt and *still* access the monitor for debugging and development
purposes.
> I want async
> notifications added to a single monitor session. That too could be
> implemented today (as simple as a term_printf("notification: ...\n");
No. It is simple on the qemu side only. Parsing notifications poping
up at random places in the stream is more complex.
cheers,
Gerd
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:15 ` [libvirt] " Gerd Hoffmann
@ 2009-04-09 14:19 ` Avi Kivity
2009-04-09 14:56 ` Jan Kiszka
0 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 14:19 UTC (permalink / raw)
To: Gerd Hoffmann
Cc: libvir-list, Anthony Liguori, Jan Kiszka, qemu-devel,
Hollis Blanchard
Gerd Hoffmann wrote:
> On 04/09/09 16:03, Avi Kivity wrote:
>> I don't want multiplexed monitor sessions, at all.
>
> I'm very happy to finally see them. Finally one can run vms with
> libvirt and *still* access the monitor for debugging and development
> purposes.
>
Right, I like them for that purpose as well. But not for ordinary control.
>> I want async
>> notifications added to a single monitor session. That too could be
>> implemented today (as simple as a term_printf("notification: ...\n");
>
> No. It is simple on the qemu side only. Parsing notifications poping
> up at random places in the stream is more complex.
I don't understand why, if there's a common prefix.
Everywhere you expect (qemu), also expect notification:.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2)
2009-04-09 13:58 ` Avi Kivity
@ 2009-04-09 14:19 ` Jan Kiszka
0 siblings, 0 replies; 63+ messages in thread
From: Jan Kiszka @ 2009-04-09 14:19 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Anthony Liguori, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> Anthony Liguori wrote:
>> Avi Kivity wrote:
>>> Anthony Liguori wrote:
>>>> The wait command will pause the monitor the command was issued in
>>>> until a new
>>>> event becomes available. Events are queued if there isn't a waiter
>>>> present.
>>>> The wait command completes after a single event is available.
>>>>
>>>
>>> How do you stop a wait if there are no pending events?
>>
>> You mean, cancel a wait? You cannot. I thought about whether it was
>> a problem or not. I'm not sure.
>
> A management agent might want to detach from guests, upgrade, restart,
> and reattach.
>
>>
>> You could introduce a wait-cancel command, but then you need a way to
>> identify which wait you want to cancel. I can't think of a simple way
>> to do that today.
>
> This, as well as the queueing that's necessary with this model,
> indicates (to me) that it is too complicated.
It should be feasible to handle some key sequence like ^C while the
monitor is suspended (ie. blocked on things like event-wait or migrate).
I thought about such a feature while reworking the involved parts but
postponed it as I saw no urgent need for it.
>
>>
>>>> Today, we queue events indefinitely but in the future, I suspect
>>>> we'll drop
>>>> events that are older than a certain amount of time to avoid infinitely
>>>> allocating memory for long running VMs.
>>>>
>>>
>>> This queueing plug the race where an event happens immediately after
>>> a wait completes. But it could be avoided completely by having
>>> asynchronous notifications on a single monitor.
>>
>> There are multiple things I think are being confused: asynchronous
>> completion of monitor commands, events, monitor multiplexing, and
>> non-human mode.
>>
>> There can only be one command active at any given time on a Monitor
>> context. We can have many Monitor contexts. There is currently only
>> one Monitor context connected to a character device at a given time.
>
> Don't think of 'migrate -d' as a command to perform migration, instead
> it's a command to start migration.
>
> I also object to exposing internal qemu implementation details like
> monitor contexts to the user (by forcing them to have multiple
> connections). If we can't have more than one monitor command, we need
> to fix that.
>
>>
>> I think what you want to see is something like this:
>>
>> <input> tag=4: info cpus
>> <input> tag=5: info kvm
>> <output> tag=5,rc=0: kvm enabled
>> <output> tag=4,rc=0: eip = 0x0000000444
>> <ouput> rc=0,class=vm-state,name=start: vm started
>>
>> To me, this is a combination of events, which is introduced by this
>> patch, a non-human monitor mode, and finally multiplexing multiple
>> monitors into a single session.
>>
>> Right now, you can have the same functional thing by having three
>> monitors. In the first monitor you'd see:
>>
>> (qemu) info cpus
>> eip = 0x000000444
>> (qemu)
>>
>> In the second you'd see:
>>
>> (qemu) info kvm
>> kvm enabled
>> (qemu)
>>
>> In the third you'd see:
>>
>> (qemu) wait
>> 23423423.23423: vm-state: start: vm started
>> (qemu)
>>
>> Even those the two info commands today are synchronous, there's
>> nothing requiring them to be (see migrate as an example). So I think
>> we're in agreement but you just want to jump ahead 6 months ;-)
>>
>
> Commands which are inherently synchronous should remain so. Commands
> which are inherently async should be coded like that. It was a mistake
> IMO to have 'migrate' be a synchronous command, it should have always
> behaved as if -d is given.
>
> Having tagged replies is a good idea, but IMO, introducing multiple
> monitors will create a lot of subtle problems, several of which we've
> already identified.
We do have multiple monitors already, try '-monitor X -serial mon:Y', or
also attach via gdb and issue 'monitor whatever'. And we should continue
to design the monitor interface for this (which means here: event
notification should be configured per monitor session).
Jan
--
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:13 ` Anthony Liguori
@ 2009-04-09 14:28 ` Avi Kivity
2009-04-09 14:30 ` Anthony Liguori
0 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 14:28 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
>>
>> Timestamping doesn't help since the command could have been delayed
>> in the monitor socket.
>>
>> Further, we're now so deep down the complexity spiral that it has now
>> become the most complicated piece of code in the entire system.
>
> You certainly cannot believe that, can you?
It was one of my little exaggerations. But it does look
disproportionatly complicated compared to the problem we're trying to solve.
>> Surely the best way to synchronize events is to keep them on one
>> timeline?
>
> Can you show exactly how you would expect things to work in the
> monitor output? I'm having a hard time understanding what you're
> suggesting.
>
(qemu) notify enospace on
(qemu) notify vnc-connect on
(qemu)
notification: vnc connection ...
(qemu) notify migration-completion on
(qemu) migrate -d ...
notification: enospc on ide0-0
(qemu) migrate_cancel
notification: migration cancelled
(qemu) migrate -d ...
(qemu)
notification: migration completed
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:28 ` Avi Kivity
@ 2009-04-09 14:30 ` Anthony Liguori
2009-04-09 14:37 ` Avi Kivity
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 14:30 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
>
> (qemu) notify enospace on
> (qemu) notify vnc-connect on
> (qemu)
> notification: vnc connection ...
> (qemu) notify migration-completion on
> (qemu) migrate -d ...
> notification: enospc on ide0-0
> (qemu) migrate_cancel
> notification: migration cancelled
> (qemu) migrate -d ...
> (qemu)
> notification: migration completed
What are the rules for printing out 'notification'? Do you want for the
end of the buffer to be '\n' or '\n(qemu )'? If so, if I type:
(qemu) f
But don't hit enter, would that suppress notification?
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:30 ` Anthony Liguori
@ 2009-04-09 14:37 ` Avi Kivity
2009-04-09 14:57 ` Anthony Liguori
0 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 14:37 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>>
>> (qemu) notify enospace on
>> (qemu) notify vnc-connect on
>> (qemu)
>> notification: vnc connection ...
>> (qemu) notify migration-completion on
>> (qemu) migrate -d ...
>> notification: enospc on ide0-0
>> (qemu) migrate_cancel
>> notification: migration cancelled
>> (qemu) migrate -d ...
>> (qemu)
>> notification: migration completed
>
> What are the rules for printing out 'notification'? Do you want for
> the end of the buffer to be '\n' or '\n(qemu )'? If so, if I type:
>
> (qemu) f
>
> But don't hit enter, would that suppress notification?
>
I'd make everything line-oriented. Anything from the user up to \n is
buffered and ignored until the \n arrives.
Once the \n arrives, the command is acted upon atomically, either
completing fully or launching an async notification.
So the rules are: whenever the monitor is idle, a notification can be
printed out.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:19 ` Avi Kivity
@ 2009-04-09 14:56 ` Jan Kiszka
2009-04-09 15:15 ` François Revol
2009-04-09 15:15 ` Avi Kivity
0 siblings, 2 replies; 63+ messages in thread
From: Jan Kiszka @ 2009-04-09 14:56 UTC (permalink / raw)
To: Avi Kivity
Cc: libvir-list, Anthony Liguori, Gerd Hoffmann, Hollis Blanchard,
qemu-devel
Avi Kivity wrote:
> Gerd Hoffmann wrote:
>> On 04/09/09 16:03, Avi Kivity wrote:
>>> I don't want multiplexed monitor sessions, at all.
>>
>> I'm very happy to finally see them. Finally one can run vms with
>> libvirt and *still* access the monitor for debugging and development
>> purposes.
>>
>
> Right, I like them for that purpose as well. But not for ordinary control.
How do you want to differentiate? What further complications would this
bring us?
>
>>> I want async
>>> notifications added to a single monitor session. That too could be
>>> implemented today (as simple as a term_printf("notification: ...\n");
>>
>> No. It is simple on the qemu side only. Parsing notifications poping
>> up at random places in the stream is more complex.
>
> I don't understand why, if there's a common prefix.
>
> Everywhere you expect (qemu), also expect notification:.
Please no more async notifications to the monitors. They are just ugly
to parse, at least for us humans. I don't want to see any notification
in the middle of my half-typed command e.g.
Jan
--
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:37 ` Avi Kivity
@ 2009-04-09 14:57 ` Anthony Liguori
2009-04-09 15:11 ` Avi Kivity
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 14:57 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
>
> I'd make everything line-oriented. Anything from the user up to \n is
> buffered and ignored until the \n arrives.
>
> Once the \n arrives, the command is acted upon atomically, either
> completing fully or launching an async notification.
>
> So the rules are: whenever the monitor is idle, a notification can be
> printed out.
So by idle, you mean, the end of the output buffer ends in either '\n'
or '\n(qemu) '. The input buffer must also be empty.
> (qemu) notify enospace on
> (qemu) notify vnc-connect on
> (qemu)
> notification: vnc connection ...
> (qemu) notify migration-completion on
> (qemu) migrate -d ...
> notification: enospc on ide0-0
> (qemu) migrate_cancel
> notification: migration cancelled
> (qemu) migrate -d ...
> (qemu)
> notification: migration completed
This hurts my eyes. It's not human readable. If we're going to do
this, we might as well have a non-human mode which would oddly enough be
more human readable. If you do this, then your session looks an awful
lot like my session from a previous note.
I think the thing that is missing is that the 'wait' command does not
have to be part of the non-human mode. In non-human mode, you are
always doing an implicit wait.
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:57 ` Anthony Liguori
@ 2009-04-09 15:11 ` Avi Kivity
2009-04-09 15:40 ` Anthony Liguori
2009-04-09 16:01 ` Jamie Lokier
0 siblings, 2 replies; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 15:11 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>>
>> I'd make everything line-oriented. Anything from the user up to \n
>> is buffered and ignored until the \n arrives.
>>
>> Once the \n arrives, the command is acted upon atomically, either
>> completing fully or launching an async notification.
>>
>> So the rules are: whenever the monitor is idle, a notification can be
>> printed out.
>
> So by idle, you mean, the end of the output buffer ends in either '\n'
> or '\n(qemu) '. The input buffer must also be empty.
You don't have to look any buffers. If the monitor is processing a
command, it is busy. An asynchronous command ('migrate -d') is not
processed in the monitor after it is launched, so it doesn't keep the
monitor busy. A monitor enters idle after printing the prompt, and
leaves idle when it starts processing a command.
If you meant from the user side, a notification always follows the prompt.
>
>> (qemu) notify enospace on
>> (qemu) notify vnc-connect on
>> (qemu)
>> notification: vnc connection ...
>> (qemu) notify migration-completion on
>> (qemu) migrate -d ...
>> notification: enospc on ide0-0
>> (qemu) migrate_cancel
>> notification: migration cancelled
>> (qemu) migrate -d ...
>> (qemu)
>> notification: migration completed
>
> This hurts my eyes. It's not human readable.
I'm sorry, I don't see why. It's just like a shell session.
Compare with:
Monitor 1:
(qemu) notify enospace on
(qemu) notify vnc-connect on
(qemu) notify migration-completion on
(qemu) migrate -d ...
(qemu) migrate_cancel
(qemu) migrate -d ...
Monitor 2:
(qemu) wait
vnc connection ...
(qemu) wait
enospc on ide0-0
(qemu) wait
migration cancelled
(qemu) wait
notification: migration completed
There is no way to tell by looking what has happened (well, in this case
you can, but in the general case you cannot). You have to look at two
separate interactive sessions (ctrl-alt-2 ctrl-alt-3 ctrl-alt-3). You
have to keep reissuing the wait command. Oh, and it's racy, so if
you're interested in what really happens you have to issue info commands
on session 1.
That's unusable.
> If we're going to do this, we might as well have a non-human mode
> which would oddly enough be more human readable. If you do this, then
> your session looks an awful lot like my session from a previous note.
I think we should.
>
> I think the thing that is missing is that the 'wait' command does not
> have to be part of the non-human mode. In non-human mode, you are
> always doing an implicit wait.
>
I think 'wait' is unusable for humans. If I want qemu to tell me
something happened, it's enough to enable notifications. There's no
need to tell it to wait every time something happens. That's poll(2),
there's no poll(1).
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:56 ` Jan Kiszka
@ 2009-04-09 15:15 ` François Revol
2009-04-09 15:15 ` Avi Kivity
1 sibling, 0 replies; 63+ messages in thread
From: François Revol @ 2009-04-09 15:15 UTC (permalink / raw)
To: qemu-devel
> >>> I want async
> >>> notifications added to a single monitor session. That too could
> > > > be
> >>> implemented today (as simple as a term_printf("notification: ...\
> > > > n");
> >>
> >> No. It is simple on the qemu side only. Parsing notifications
> > > poping
> >> up at random places in the stream is more complex.
> >
> > I don't understand why, if there's a common prefix.
> >
> > Everywhere you expect (qemu), also expect notification:.
>
> Please no more async notifications to the monitors. They are just
> ugly
> to parse, at least for us humans. I don't want to see any
> notification
> in the middle of my half-typed command e.g.
>
What about acting like what the shell prompt does for jobs ?
It just outputs it after the line is parsed or the command has
returned.
if (monitor_input_empty)
output(foo);
else
queue_output(foo);
François.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 14:56 ` Jan Kiszka
2009-04-09 15:15 ` François Revol
@ 2009-04-09 15:15 ` Avi Kivity
2009-04-09 15:49 ` Jan Kiszka
2009-04-09 16:07 ` Jamie Lokier
1 sibling, 2 replies; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 15:15 UTC (permalink / raw)
To: Jan Kiszka
Cc: libvir-list, Anthony Liguori, Gerd Hoffmann, Hollis Blanchard,
qemu-devel
Jan Kiszka wrote:
> Avi Kivity wrote:
>
>> Gerd Hoffmann wrote:
>>
>>> On 04/09/09 16:03, Avi Kivity wrote:
>>>
>>>> I don't want multiplexed monitor sessions, at all.
>>>>
>>> I'm very happy to finally see them. Finally one can run vms with
>>> libvirt and *still* access the monitor for debugging and development
>>> purposes.
>>>
>>>
>> Right, I like them for that purpose as well. But not for ordinary control.
>>
>
> How do you want to differentiate? What further complications would this
> bring us?
>
I'm not sure I understand your questions. Multiple monitor sessions are
like multiple shell sessions. I don't think a control program should
use more than one session, but it should allow a developer to connect to
issue 'info registers' and 'x/20i' commands. Of course if a developer
issues 'quit' or a hotunplug command, things will break.
>
> Please no more async notifications to the monitors. They are just ugly
> to parse, at least for us humans. I don't want to see any notification
> in the middle of my half-typed command e.g.
>
If we can identify an interactive session, we might redraw the partial
command after the prompt.
btw, why would a human enable notifications? Note notifications enabled
on the management session will only be displayed there.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 15:11 ` Avi Kivity
@ 2009-04-09 15:40 ` Anthony Liguori
2009-04-09 15:57 ` Avi Kivity
2009-04-09 16:01 ` Jamie Lokier
1 sibling, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 15:40 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> I'm sorry, I don't see why. It's just like a shell session.
>
> Compare with:
>
> Monitor 1:
> (qemu) notify enospace on
> (qemu) notify vnc-connect on
> (qemu) notify migration-completion on
> (qemu) migrate -d ...
> (qemu) migrate_cancel
> (qemu) migrate -d ...
>
>
> Monitor 2:
> (qemu) wait
> vnc connection ...
> (qemu) wait
> enospc on ide0-0
> (qemu) wait
> migration cancelled
> (qemu) wait
> notification: migration completed
>
> There is no way to tell by looking what has happened (well, in this
> case you can, but in the general case you cannot). You have to look
> at two separate interactive sessions (ctrl-alt-2 ctrl-alt-3
> ctrl-alt-3). You have to keep reissuing the wait command. Oh, and
> it's racy, so if you're interested in what really happens you have to
> issue info commands on session 1.
How is it less racy?
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 15:15 ` Avi Kivity
@ 2009-04-09 15:49 ` Jan Kiszka
2009-04-09 16:01 ` Avi Kivity
2009-04-09 16:07 ` Jamie Lokier
1 sibling, 1 reply; 63+ messages in thread
From: Jan Kiszka @ 2009-04-09 15:49 UTC (permalink / raw)
To: Avi Kivity
Cc: libvir-list, Anthony Liguori, Gerd Hoffmann, Hollis Blanchard,
qemu-devel
Avi Kivity wrote:
> Jan Kiszka wrote:
>> Avi Kivity wrote:
>>
>>> Gerd Hoffmann wrote:
>>>
>>>> On 04/09/09 16:03, Avi Kivity wrote:
>>>>
>>>>> I don't want multiplexed monitor sessions, at all.
>>>>>
>>>> I'm very happy to finally see them. Finally one can run vms with
>>>> libvirt and *still* access the monitor for debugging and development
>>>> purposes.
>>>>
>>>>
>>> Right, I like them for that purpose as well. But not for ordinary
>>> control.
>>>
>>
>> How do you want to differentiate? What further complications would this
>> bring us?
>>
>
> I'm not sure I understand your questions. Multiple monitor sessions are
> like multiple shell sessions. I don't think a control program should
> use more than one session, but it should allow a developer to connect to
> issue 'info registers' and 'x/20i' commands. Of course if a developer
> issues 'quit' or a hotunplug command, things will break.
We agree if we want decoupled states of the monitor sessions (one
session should definitely not be used to configure the output of another
one). But I see no issues with collecting the events in one session that
happen to be caused by activity in some other session. But maybe I'm
missing your point.
>>
>> Please no more async notifications to the monitors. They are just ugly
>> to parse, at least for us humans. I don't want to see any notification
>> in the middle of my half-typed command e.g.
>>
>
> If we can identify an interactive session, we might redraw the partial
> command after the prompt.
Uhh, please not this kind of terminal reprinting. The terminal user keep
full control over when things can be printed.
>
> btw, why would a human enable notifications? Note notifications enabled
> on the management session will only be displayed there.
It's true that the common use case for events will be monitor
applications. Still, enabling them for testing or simple scripting
should not switch on ugly output mode or complicate the parsing.
Jan
--
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 15:40 ` Anthony Liguori
@ 2009-04-09 15:57 ` Avi Kivity
2009-04-09 16:09 ` Anthony Liguori
0 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 15:57 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>> I'm sorry, I don't see why. It's just like a shell session.
>>
>> Compare with:
>>
>> Monitor 1:
>> (qemu) notify enospace on
>> (qemu) notify vnc-connect on
>> (qemu) notify migration-completion on
>> (qemu) migrate -d ...
>> (qemu) migrate_cancel
>> (qemu) migrate -d ...
>>
>>
>> Monitor 2:
>> (qemu) wait
>> vnc connection ...
>> (qemu) wait
>> enospc on ide0-0
>> (qemu) wait
>> migration cancelled
>> (qemu) wait
>> notification: migration completed
>>
>> There is no way to tell by looking what has happened (well, in this
>> case you can, but in the general case you cannot). You have to look
>> at two separate interactive sessions (ctrl-alt-2 ctrl-alt-3
>> ctrl-alt-3). You have to keep reissuing the wait command. Oh, and
>> it's racy, so if you're interested in what really happens you have to
>> issue info commands on session 1.
>
> How is it less racy?
>
Suppose you have a command which changes the meaning of a notification.
If a notification arrives before the command completion, then it
happened before the command was executed. If it arrives after command
completion, then it happened after the command was executed.
Oh. If the command generates no output (like most), you can't tell when
it completes. I suppose we could have qemu print OK after completing a
command.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 15:49 ` Jan Kiszka
@ 2009-04-09 16:01 ` Avi Kivity
0 siblings, 0 replies; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 16:01 UTC (permalink / raw)
To: Jan Kiszka
Cc: libvir-list, Anthony Liguori, Gerd Hoffmann, Hollis Blanchard,
qemu-devel
Jan Kiszka wrote:
>> I'm not sure I understand your questions. Multiple monitor sessions are
>> like multiple shell sessions. I don't think a control program should
>> use more than one session, but it should allow a developer to connect to
>> issue 'info registers' and 'x/20i' commands. Of course if a developer
>> issues 'quit' or a hotunplug command, things will break.
>>
>
> We agree if we want decoupled states of the monitor sessions (one
> session should definitely not be used to configure the output of another
> one). But I see no issues with collecting the events in one session that
> happen to be caused by activity in some other session. But maybe I'm
> missing your point.
>
The management application will still think the device is plugged in,
and things will break if it isn't.
Of course if you asked for notification X on session Y, then event X
should be delivered to session Y no matter how it originated (but not to
session Z).
>
>>> Please no more async notifications to the monitors. They are just ugly
>>> to parse, at least for us humans. I don't want to see any notification
>>> in the middle of my half-typed command e.g.
>>>
>>>
>> If we can identify an interactive session, we might redraw the partial
>> command after the prompt.
>>
>
> Uhh, please not this kind of terminal reprinting. The terminal user keep
> full control over when things can be printed.
>
Very well. I guess a human user can open another session for
notifications, if they are so inclined.
>
>> btw, why would a human enable notifications? Note notifications enabled
>> on the management session will only be displayed there.
>>
>
> It's true that the common use case for events will be monitor
> applications. Still, enabling them for testing or simple scripting
> should not switch on ugly output mode or complicate the parsing.
>
Fair enough.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 15:11 ` Avi Kivity
2009-04-09 15:40 ` Anthony Liguori
@ 2009-04-09 16:01 ` Jamie Lokier
1 sibling, 0 replies; 63+ messages in thread
From: Jamie Lokier @ 2009-04-09 16:01 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Anthony Liguori, Jan Kiszka, Hollis Blanchard
Avi Kivity wrote:
> >I think the thing that is missing is that the 'wait' command does not
> >have to be part of the non-human mode. In non-human mode, you are
> >always doing an implicit wait.
>
> I think 'wait' is unusable for humans. If I want qemu to tell me
> something happened, it's enough to enable notifications. There's no
> need to tell it to wait every time something happens. That's poll(2),
> there's no poll(1).
For some purposes I'd prefer 'wait' on a separate monitor. For the
same reason that we sometimes redirect the output of background shell
commands to a file :-)
Solution: 'wait -background' for those async notifications.
Or simply 'notify -background event-type', no need for a wait command
if you give that option.
Or conversely 'notify -channel 1 event-type' to direct the events to
channel 1, and 'wait -channel 1' to show events on that channel.
-- Jamie
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 15:15 ` Avi Kivity
2009-04-09 15:49 ` Jan Kiszka
@ 2009-04-09 16:07 ` Jamie Lokier
1 sibling, 0 replies; 63+ messages in thread
From: Jamie Lokier @ 2009-04-09 16:07 UTC (permalink / raw)
To: qemu-devel
Cc: libvir-list, Jan Kiszka, Anthony Liguori, Gerd Hoffmann,
Hollis Blanchard
Avi Kivity wrote:
> I'm not sure I understand your questions. Multiple monitor sessions are
> like multiple shell sessions. I don't think a control program should
> use more than one session, but it should allow a developer to connect to
> issue 'info registers' and 'x/20i' commands. Of course if a developer
> issues 'quit' or a hotunplug command, things will break.
In most cases I think commands like 'stop' or a hotunplug command
shouldn't break libvirt or other control program. As long as there's
a way for libvirt to query the current hotplug state and be notified
of changes, why shouldn't it behave much the same as if you asked
libvirt to do do the same action itself?
-- Jamie
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 15:57 ` Avi Kivity
@ 2009-04-09 16:09 ` Anthony Liguori
2009-04-09 16:30 ` Avi Kivity
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 16:09 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> Suppose you have a command which changes the meaning of a
> notification. If a notification arrives before the command
> completion, then it happened before the command was executed.
If you want to make that reliable, you cannot have multiple monitors.
Since you can mask notifications, there can be an arbitrarily long time
between notification and the event happening. Socket buffering presents
the same problem. Image:
Monitor 1:
time 0: (qemu) hotadd_cpu 2
time 1: (qemu) hello world <no new line>
time 5: <new line>
time 6: notification: cpu 2 added
time 6: (qemu)
Monitor 2:
time 3: (qemu) hotremove_cpu 2
time 4: (qemu)
time 5: notification: cpu 2 removed
time 6: (qemu)
So to eliminate this, you have to ban multiple monitors. Fine, let's
say we did that, it's *still* racy because at time 3, the guest may hot
remove cpu 2 on it's own since the guests VCPUs get to run in parallel
to the monitor.
And even if you somehow eliminate the issue around masking
notifications, you still have socket buffering that introduces the same
problem.
The best you can do is stick a time stamp on a notification and make
sure the management tool understands that the notification is
reflectively of the state when the event happened, not of the current
state. FWIW, this problem is not at all unique to QEMU and is generally
true of most protocols that support an out-of-band notification mechanism.
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 16:09 ` Anthony Liguori
@ 2009-04-09 16:30 ` Avi Kivity
2009-04-09 16:42 ` Anthony Liguori
0 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 16:30 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>> Suppose you have a command which changes the meaning of a
>> notification. If a notification arrives before the command
>> completion, then it happened before the command was executed.
>
> If you want to make that reliable, you cannot have multiple monitors.
Right.
> Since you can mask notifications, there can be an arbitrarily long
> time between notification and the event happening. Socket buffering
> presents the same problem. Image:
>
> Monitor 1:
> time 0: (qemu) hotadd_cpu 2
> time 1: (qemu) hello world <no new line>
> time 5: <new line>
> time 6: notification: cpu 2 added
> time 6: (qemu)
>
> Monitor 2:
> time 3: (qemu) hotremove_cpu 2
> time 4: (qemu)
> time 5: notification: cpu 2 removed
> time 6: (qemu)
>
> So to eliminate this, you have to ban multiple monitors.
Well, not ban multiple monitors, but require that for non-racy operation
commands and notifications be on the same session.
We can still debug on our dev-only monitor.
> Fine, let's say we did that, it's *still* racy because at time 3, the
> guest may hot remove cpu 2 on it's own since the guests VCPUs get to
> run in parallel to the monitor.
A guest can't hotremove a vcpu. It may offline a vcpu, but that's not
the same.
Obviously, if both the guest and the management application can initiate
the same action, then there will be races. But I don't think that's how
things should be -- the guest should request a vcpu to be removed (or
added), management thinks and files forms in triplicate, then hotadds or
hotremoves the vcpu (most likely after it is no longer needed).
With the proper beaurocracy, there is no race.
>
> And even if you somehow eliminate the issue around masking
> notifications, you still have socket buffering that introduces the
> same problem.
If you have one monitor, the problem is much simpler, since events
travelling in the same direction (command acknowledge and a
notification) cannot be reordered. With a command+wait, the problem is
inherent.
>
> The best you can do is stick a time stamp on a notification and make
> sure the management tool understands that the notification is
> reflectively of the state when the event happened, not of the current
> state.
Timestamps are really bad. They don't work at all if the management
application is not on the same host. They work badly if it is on the
same host, since commands and events will be timestamped at different
processes.
> FWIW, this problem is not at all unique to QEMU and is generally true
> of most protocols that support an out-of-band notification mechanism.
>
command+wait makes it worse. Let's stick with established practice.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 16:30 ` Avi Kivity
@ 2009-04-09 16:42 ` Anthony Liguori
2009-04-09 17:00 ` Avi Kivity
2009-04-11 19:11 ` Avi Kivity
0 siblings, 2 replies; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 16:42 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
>> Fine, let's say we did that, it's *still* racy because at time 3, the
>> guest may hot remove cpu 2 on it's own since the guests VCPUs get to
>> run in parallel to the monitor.
>
> A guest can't hotremove a vcpu. It may offline a vcpu, but that's not
> the same.
>
> Obviously, if both the guest and the management application can
> initiate the same action, then there will be races. But I don't think
> that's how things should be -- the guest should request a vcpu to be
> removed (or added), management thinks and files forms in triplicate,
> then hotadds or hotremoves the vcpu (most likely after it is no longer
> needed).
>
> With the proper beaurocracy, there is no race.
You still have the same basic problem:
time 0: (qemu) notify-enable vnc-events
time 1: (qemu) foo <no newline>
time 4: <newline>
time 5: notification: client connected
time 0: vnc client connects
time 2: vnc client disconnects
At time 5, when the management app gets the notification, it cannot make
any assumptions about the state of the system. You still need timestamps.
>>
>> And even if you somehow eliminate the issue around masking
>> notifications, you still have socket buffering that introduces the
>> same problem.
>
> If you have one monitor, the problem is much simpler, since events
> travelling in the same direction (command acknowledge and a
> notification) cannot be reordered. With a command+wait, the problem
> is inherent.
Command acknowledge is not an event. Events are out-of-band. Command
completions are in-band. Right now, they are synchronous and I expect
that in the short term future, we'll have a non-human monitor mode that
allows commands to be asynchronous.
However, it's a mistake to muddle the distinction between an in-band
completion and an out-of-band event. You cannot relate the out-of-band
events commands.
>>
>> The best you can do is stick a time stamp on a notification and make
>> sure the management tool understands that the notification is
>> reflectively of the state when the event happened, not of the current
>> state.
>
> Timestamps are really bad. They don't work at all if the management
> application is not on the same host. They work badly if it is on the
> same host, since commands and events will be timestamped at different
> processes.
Timestamps are relative, not absolutely. They should not be used to
associate anything with the outside world. In fact, I have no problem
making the timestamps relative to QEMU startup just to ensure that noone
tries to do something silly like associate notification timestamps with
system time.
>> FWIW, this problem is not at all unique to QEMU and is generally true
>> of most protocols that support an out-of-band notification mechanism.
>>
>
> command+wait makes it worse. Let's stick with established practice.
What's the established practice? Do you know of any protocol that is
line based that does notifications like this?
IMAP IDLE is pretty close to "wait-forever".
Regards,
Anthony Liguori
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 16:42 ` Anthony Liguori
@ 2009-04-09 17:00 ` Avi Kivity
2009-04-09 17:40 ` Anthony Liguori
2009-04-11 19:11 ` Avi Kivity
1 sibling, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-09 17:00 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>>> Fine, let's say we did that, it's *still* racy because at time 3,
>>> the guest may hot remove cpu 2 on it's own since the guests VCPUs
>>> get to run in parallel to the monitor.
>>
>> A guest can't hotremove a vcpu. It may offline a vcpu, but that's
>> not the same.
>>
>> Obviously, if both the guest and the management application can
>> initiate the same action, then there will be races. But I don't
>> think that's how things should be -- the guest should request a vcpu
>> to be removed (or added), management thinks and files forms in
>> triplicate, then hotadds or hotremoves the vcpu (most likely after it
>> is no longer needed).
>>
>> With the proper beaurocracy, there is no race.
>
> You still have the same basic problem:
>
> time 0: (qemu) notify-enable vnc-events
> time 1: (qemu) foo <no newline>
> time 4: <newline>
> time 5: notification: client connected
>
> time 0: vnc client connects
> time 2: vnc client disconnects
>
> At time 5, when the management app gets the notification, it cannot
> make any assumptions about the state of the system. You still need
> timestamps.
You don't even need the foo <no newline> to trigger this, qemu->user
traffic can be arbitrarily delayed (I don't think we should hold
notifications on partial input anyway). But there's no race here.
The notification at time 5 means that the connect happened sometime
before time 5, and that it may not be true now. The user cannot assume
anything. A race can only happen against something the user initiated.
Suppose we're implementing some kind of single sign on:
(qemu) notify vnc on
... time passes, we want to allow members of group x to log in
(qemu) vnc_set_acl group:x
OK
(qemu)
notification: vnc connect aliguori
(qemu)
with a single monitor, we can be sure that the connect happened the
vnc_set_acl. If the notification arrives on a different session, we
have no way of knowing that.
>
>>>
>>> And even if you somehow eliminate the issue around masking
>>> notifications, you still have socket buffering that introduces the
>>> same problem.
>>
>> If you have one monitor, the problem is much simpler, since events
>> travelling in the same direction (command acknowledge and a
>> notification) cannot be reordered. With a command+wait, the problem
>> is inherent.
>
> Command acknowledge is not an event. Events are out-of-band. Command
> completions are in-band. Right now, they are synchronous and
That's all correct, but I don't see how that changes anything.
> I expect that in the short term future, we'll have a non-human monitor
> mode that allows commands to be asynchronous.
Then let's defer this until then? 'wait' is not useful for humans, they
won't be retyping 'wait' every time something happens.
>
> However, it's a mistake to muddle the distinction between an in-band
> completion and an out-of-band event. You cannot relate the
> out-of-band events commands.
I can, if one happens before the other, and I have a single stream of
command completions and event notifications.
>
>>>
>>> The best you can do is stick a time stamp on a notification and make
>>> sure the management tool understands that the notification is
>>> reflectively of the state when the event happened, not of the
>>> current state.
>>
>> Timestamps are really bad. They don't work at all if the management
>> application is not on the same host. They work badly if it is on the
>> same host, since commands and events will be timestamped at different
>> processes.
>
> Timestamps are relative, not absolutely. They should not be used to
> associate anything with the outside world. In fact, I have no problem
> making the timestamps relative to QEMU startup just to ensure that
> noone tries to do something silly like associate notification
> timestamps with system time.
Dunno, seems totally artificial to me to have to introduce timestamps to
compensate for different delays in multiple sockets that we introduced
five patches earlier.
Please, let's keep this simple.
>
>>> FWIW, this problem is not at all unique to QEMU and is generally
>>> true of most protocols that support an out-of-band notification
>>> mechanism.
>>>
>>
>> command+wait makes it worse. Let's stick with established practice.
>
> What's the established practice? Do you know of any protocol that is
> line based that does notifications like this?
I guess most MUDs?
>
> IMAP IDLE is pretty close to "wait-forever".
IMAP IDLE can be terminated by the client, and so does not require
multiple sessions (though IMAP supports them).
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 17:00 ` Avi Kivity
@ 2009-04-09 17:40 ` Anthony Liguori
2009-04-11 16:25 ` Avi Kivity
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-09 17:40 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> (qemu) notify vnc on
>
> ... time passes, we want to allow members of group x to log in
>
> (qemu) vnc_set_acl group:x
> OK
> (qemu)
> notification: vnc connect aliguori
> (qemu)
>
> with a single monitor, we can be sure that the connect happened the
> vnc_set_acl. If the notification arrives on a different session, we
> have no way of knowing that.
Only because there isn't a time stamp associated with the completion of
the other monitor command. And you can globally replace timestamp with
some sort of incrementing id that's associated with each notification
and command completion.
You'll need this to support multiple monitors even with your model.
IMHO, multiple monitors is a critical feature to support in the long term.
>> I expect that in the short term future, we'll have a non-human
>> monitor mode that allows commands to be asynchronous.
>
> Then let's defer this until then? 'wait' is not useful for humans,
> they won't be retyping 'wait' every time something happens.
But wait is useful for management apps today. A wait-forever, which is
already in the next series, is also useful for humans. It may not be a
perfect interface, but it's a step in the right direction. We have time
before the next release and I expect that we'll have a non-human mode
before then.
>> What's the established practice? Do you know of any protocol that is
>> line based that does notifications like this?
>
> I guess most MUDs?
I've never used a MUD before, I think that qualifies as before my time :-)
>>
>> IMAP IDLE is pretty close to "wait-forever".
>
> IMAP IDLE can be terminated by the client, and so does not require
> multiple sessions (though IMAP supports them).
Most modern clients use multiple sessions. If you look at IMAP, it
doesn't multiplex commands so multiple sessions are necessary to
maintain usefulness while performing a long running task.
Anyway, I think terminating a wait is a perfectly reasonable requirement.
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 17:40 ` Anthony Liguori
@ 2009-04-11 16:25 ` Avi Kivity
2009-04-11 20:18 ` Anthony Liguori
2009-04-11 23:16 ` Zachary Amsden
0 siblings, 2 replies; 63+ messages in thread
From: Avi Kivity @ 2009-04-11 16:25 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>> (qemu) notify vnc on
>>
>> ... time passes, we want to allow members of group x to log in
>>
>> (qemu) vnc_set_acl group:x
>> OK
>> (qemu)
>> notification: vnc connect aliguori
>> (qemu)
>>
>> with a single monitor, we can be sure that the connect happened the
>> vnc_set_acl. If the notification arrives on a different session, we
>> have no way of knowing that.
>
> Only because there isn't a time stamp associated with the completion
> of the other monitor command. And you can globally replace timestamp
> with some sort of incrementing id that's associated with each
> notification and command completion.
Sure, you can fix the problem, but why introduce it in the first place?
I understand the urge for a simple command/response, but introducing
multiple sessions breaks the "simple" and introduces new problems.
>
> You'll need this to support multiple monitors even with your model.
Can you explain why? As far as I can tell, if you have async
notifications, you can do everything from one monitor.
> IMHO, multiple monitors is a critical feature to support in the long
> term.
Multiple monitors are nice to have (for developers), but I don't see
them as critical.
>>> I expect that in the short term future, we'll have a non-human
>>> monitor mode that allows commands to be asynchronous.
>>
>> Then let's defer this until then? 'wait' is not useful for humans,
>> they won't be retyping 'wait' every time something happens.
>
> But wait is useful for management apps today. A wait-forever, which
> is already in the next series, is also useful for humans. It may not
> be a perfect interface, but it's a step in the right direction. We
> have time before the next release and I expect that we'll have a
> non-human mode before then.
I disagree, I think requiring multiple sessions for controlling a single
application is clumsy. I can't think of one protocol which uses it. I
don't think IMAP requires multiple sessions (and I don't think commands
from one session can affect the other, except through the mail store).
>
>>> What's the established practice? Do you know of any protocol that
>>> is line based that does notifications like this?
>>
>> I guess most MUDs?
>
> I've never used a MUD before, I think that qualifies as before my time
> :-)
Well I haven't either. Maybe time to start.
>>>
>>> IMAP IDLE is pretty close to "wait-forever".
>>
>> IMAP IDLE can be terminated by the client, and so does not require
>> multiple sessions (though IMAP supports them).
>
> Most modern clients use multiple sessions. If you look at IMAP, it
> doesn't multiplex commands so multiple sessions are necessary to
> maintain usefulness while performing a long running task.
But commands in one session don't affect others.
>
> Anyway, I think terminating a wait is a perfectly reasonable requirement.
It breaks you command/response, though.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-09 16:42 ` Anthony Liguori
2009-04-09 17:00 ` Avi Kivity
@ 2009-04-11 19:11 ` Avi Kivity
2009-04-11 21:47 ` Andreas Färber
1 sibling, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-11 19:11 UTC (permalink / raw)
To: Anthony Liguori; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Anthony Liguori wrote:
>
> What's the established practice? Do you know of any protocol that is
> line based that does notifications like this?
>
Actually there is one line oriented protocol that does asynchronous
notifications.
http://faqs.org/rfcs/rfc1459.html
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-11 16:25 ` Avi Kivity
@ 2009-04-11 20:18 ` Anthony Liguori
2009-04-11 21:14 ` Avi Kivity
2009-04-11 23:16 ` Zachary Amsden
1 sibling, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-04-11 20:18 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Jan Kiszka, Hollis Blanchard
Avi Kivity wrote:
> Anthony Liguori wrote:
>
>> IMHO, multiple monitors is a critical feature to support in the long
>> term.
>
> Multiple monitors are nice to have (for developers), but I don't see
> them as critical.
If you live in a world where there is a single management application
that provides the only interface to interact with a QEMU instance, then
yes, they aren't critical.
The problem with this is that most management applications are lossy by
their nature. They expose only a subset of functionality supported by QEMU.
Currently, the monitor is the "management interface" for QEMU. If we
only every support one instance of that management interface, then it
means if multiple management applications are to interact with a given
QEMU instance, they must all use a single API to do that then allows for
multiplexing. I see no reason that QEMU shouldn't do the multiplexing
itself though.
To put it another way, a user that uses libvirt today cannot see QEMU
instances that are run manually. That is not true when a user uses
libvirt with Xen today because Xend provides a management interface that
is capable of supporting multiple clients. I think it's important to
get the same level of functionality for QEMU.
N.B. yes, Xend is a horrendous example especially when your argument has
been simplicity vs. complexity.
At the end of the day, I want to be able to run a QEMU instance from the
command line, and have virt-manager be able to see it remotely and
connect to it. That means multiple monitors and it means that all
commands that change VM state must generate some sort of notification
such that libvirt can keep track of the changing state of a VM.
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-11 20:18 ` Anthony Liguori
@ 2009-04-11 21:14 ` Avi Kivity
2009-04-12 18:42 ` Jamie Lokier
0 siblings, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-11 21:14 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Jan Kiszka, Hollis Blanchard
Anthony Liguori wrote:
> Avi Kivity wrote:
>> Anthony Liguori wrote:
>>
>>> IMHO, multiple monitors is a critical feature to support in the long
>>> term.
>>
>> Multiple monitors are nice to have (for developers), but I don't see
>> them as critical.
>
> If you live in a world where there is a single management application
> that provides the only interface to interact with a QEMU instance,
> then yes, they aren't critical.
>
I do (or at least I hope I do). Exposing the monitor to users is a
layering violation.
> The problem with this is that most management applications are lossy
> by their nature. They expose only a subset of functionality supported
> by QEMU.
What if they don't expose a feature because they don't want to make the
feature available to the user?
What happens when the user changes something that the management
application thinks it controls? Do we add notifiers on everything?
The qemu monitor is a different privilege level from being a virtual
machine owner. Sure, we could theoritically plug all the holes with,
for example the user filling up the disk with screendumps. But do we
want to reduce security this way?
You're taking away control from the management application, due to what
are the management application's misfeatures. You should instead tell
the vendor of your management application to add the missing feature.
Oh, and don't expect users of a management application to connect to the
qemu monitor to administer their virtual machines. They expect the
management application to do that for them. The qemu monitor is an
excellent way to control a single VM, but not for controlling many.
>
> Currently, the monitor is the "management interface" for QEMU. If we
> only every support one instance of that management interface, then it
> means if multiple management applications are to interact with a given
> QEMU instance, they must all use a single API to do that then allows
> for multiplexing. I see no reason that QEMU shouldn't do the
> multiplexing itself though.
Again, I don't oppose multiplexing (though I do oppose the wait command
which requires it, and I oppose this "management apps suck, let's telnet
to qemu directly" use you propose.
>
> To put it another way, a user that uses libvirt today cannot see QEMU
> instances that are run manually. That is not true when a user uses
> libvirt with Xen today because Xend provides a management interface
> that is capable of supporting multiple clients. I think it's
> important to get the same level of functionality for QEMU.
>
> N.B. yes, Xend is a horrendous example especially when your argument
> has been simplicity vs. complexity.
I'm sure libvirt really enjoys it when users use xm commands to change
the VM state. What happens when you migrate it, for example? Or add a
few dozen vcpus?
>
> At the end of the day, I want to be able to run a QEMU instance from
> the command line, and have virt-manager be able to see it remotely and
> connect to it. That means multiple monitors and it means that all
> commands that change VM state must generate some sort of notification
> such that libvirt can keep track of the changing state of a VM.
I don't think most management application authors would expose the qemu
monitor to users. It sounds like a huge risk, and for what benefit? If
there's something interesting you can do with the monitor, add it to the
management interface so people can actually use it. They don't buy this
stuff so they can telnet into the monitor.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-11 19:11 ` Avi Kivity
@ 2009-04-11 21:47 ` Andreas Färber
2009-04-12 18:44 ` Jamie Lokier
0 siblings, 1 reply; 63+ messages in thread
From: Andreas Färber @ 2009-04-11 21:47 UTC (permalink / raw)
To: qemu-devel
Am 11.04.2009 um 21:11 schrieb Avi Kivity:
> Anthony Liguori wrote:
>>
>> What's the established practice? Do you know of any protocol that
>> is line based that does notifications like this?
>>
>
> Actually there is one line oriented protocol that does asynchronous
> notifications.
>
> http://faqs.org/rfcs/rfc1459.html
Great! Then if everyone else is afk, I can at least chat to my VMs. ;)
Andreas
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-11 16:25 ` Avi Kivity
2009-04-11 20:18 ` Anthony Liguori
@ 2009-04-11 23:16 ` Zachary Amsden
2009-04-12 8:23 ` Zachary Amsden
1 sibling, 1 reply; 63+ messages in thread
From: Zachary Amsden @ 2009-04-11 23:16 UTC (permalink / raw)
To: Avi Kivity
Cc: libvir-list, Anthony Liguori, Jan Kiszka, qemu-devel,
Hollis Blanchard
Avi Kivity wrote:
> I disagree, I think requiring multiple sessions for controlling a single
> application is clumsy. I can't think of one protocol which uses it. I
> don't think IMAP requires multiple sessions (and I don't think commands
> from one session can affect the other, except through the mail store).
I agree, multiple sessions is silly. IMAP uses multiple sessions
because the session is stateful, and only one mailbox can be selected,
or to do multiple search operations. IMAP servers hate this btw, the
number of users per server for IMAP is something like 10x less dense
than POP (or at least was years ago when I actually worked on POP and IMAP).
>>>> What's the established practice? Do you know of any protocol that
>>>> is line based that does notifications like this?
I worked on an appliance type server product for a while that had
something similar to a monitor control port for issuing all general
commands to the machine. The protocol was tagged, line oriented
commands, and untagged (*) responses for asynchronous notifications.
Bulk data transfers were a bit more complex than they needed to be, as
the protocol had a base64 type encoding which required the size to be
specified in the transfer command (thus not permitting streaming), but
other than that it worked great.
ANSI color is also an option to encode and highlight async notices.
>>>
>>> I guess most MUDs?
>>
>> I've never used a MUD before, I think that qualifies as before my time
>> :-)
>
> Well I haven't either. Maybe time to start.
What? Why have you guys not been using MUDs? I did some development
work (obviously not for pay) on a Circle based MUD implementation for a
while. Here's an example of mud protocol, showing the prompt... it
works over just telnet and is line based with async notifications.. any
time a notification comes, it reprints a blank prompt; the client line
buffers the input and a better client than telnet would show your entire
line.
It is highly desirable if you can control and monitor everything from a
single telnet session.
To share this experience,
telnet hrmud.com 4000
...
| 24H 100M 82V > kill fido
You tickle the beastly fido as you pierce him.
| 24H 100M 82V >
The beastly fido tries to bite you but bites his tongue instead!
You tickle the beastly fido as you pierce him.
The beastly fido is incapacitated and will slowly die, if not aided.
| 24H 100M 82V >
You tickle the beastly fido as you pierce him.
The beastly fido is mortally wounded, and will die soon, if not aided.
| 24H 100M 82V >
You pierce the beastly fido's heart, you heartbreaker you...
The beastly fido is dead!
You receive 8 experience points.
Your blood freezes as you hear the beastly fido's death cry.
| 24H 100M 82V >
The green gelatinous blob has arrived.
The janitor picks up some trash.
| 24H 100M 82V > sacrifice corpse
You sacrifice the corpse of the beastly fido.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-11 23:16 ` Zachary Amsden
@ 2009-04-12 8:23 ` Zachary Amsden
2009-04-14 8:28 ` Gerd Hoffmann
0 siblings, 1 reply; 63+ messages in thread
From: Zachary Amsden @ 2009-04-12 8:23 UTC (permalink / raw)
To: Avi Kivity
Cc: libvir-list, Anthony Liguori, Jan Kiszka, qemu-devel,
Hollis Blanchard
Zachary Amsden wrote:
> | 24H 100M 82V >
> You pierce the beastly fido's heart, you heartbreaker you...
> The beastly fido is dead!
> You receive 8 experience points.
> Your blood freezes as you hear the beastly fido's death cry.
>
> | 24H 100M 82V >
> The green gelatinous blob has arrived.
> The janitor picks up some trash.
You know, as silly as this little exercise is, it actually has some
interesting points. MUDs present a prompt showing the current status of
the player; hit points, mana, and V (movement points) are the default
display here, but typically you can customize the prompt to include many
variables and syntax to make it easy for you to parse... and simply
sending a NULL cmd (CR/LF) gets you a status update whenever you want.
Now, that's sort of the same thing a virtualization management tool
might want to monitor in the event of out-of-band asynchronous events -
number of online CPUs, RAM, and VM power status. Add command tagging so
you can associate responses to specific commands, and you've got a very
powerful monitor in a single I/O channel.
Personally, I think relying on asynchronous events to provide reliable
status is a bad idea. Management connections can and will get
disconnected, buffers will get filled and event notifications will be
dropped. Having a status line that is pollable by the client allows
easy access to all this information whenever it is needed.. such as an
error condition. Trying to stop an already stopped VM might confuse a
management program when it fails, and leaving the online status
indeterminate isn't a good thing to present to the user, but if a status
line is available, it is very convenient, easy to use, and never loses
information.
And it's really useful when your cleric's job is to hit enter to get
leader status as quickly as possible so they can recall the berzerker
who is buffing the mob before HP run out and they end up dead. Losing
XP from dying sucks, it takes days to get that back.
Zach
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-11 21:14 ` Avi Kivity
@ 2009-04-12 18:42 ` Jamie Lokier
2009-04-14 8:30 ` [libvirt] " Daniel P. Berrange
0 siblings, 1 reply; 63+ messages in thread
From: Jamie Lokier @ 2009-04-12 18:42 UTC (permalink / raw)
To: qemu-devel; +Cc: libvir-list, Jan Kiszka, Hollis Blanchard
Avi Kivity wrote:
> Anthony Liguori wrote:
> >At the end of the day, I want to be able to run a QEMU instance from
> >the command line, and have virt-manager be able to see it remotely and
> >connect to it. That means multiple monitors and it means that all
> >commands that change VM state must generate some sort of notification
> >such that libvirt can keep track of the changing state of a VM.
>
> I don't think most management application authors would expose the qemu
> monitor to users. It sounds like a huge risk, and for what benefit? If
> there's something interesting you can do with the monitor, add it to the
> management interface so people can actually use it. They don't buy this
> stuff so they can telnet into the monitor.
I want the same as Anthony. I want to do unusual things that libvirt
doesn't support and shouldn't have to support itself, such as sending
keystrokes to a running VM (from a script), attaching a debugger, and
hotplugging network devices that are configured differently to how
libvirt would like to do it. I also want these VMs to show in the
nice GUI along with other non-debugging VMs, show their resources,
start and stop them easily, catch them when they attempt to reboot,
and let me do these things remotely.
My solutionat the moment is to put a monitor multiplexer outside QEMU
(it's a small Perl script). It accepts multiple monitor connections
and forwards to QEMU's single monitor, parsing the "^\(qemu\) "
prompt. This is obviously silly but it's what we have to do to get
this functionality.
I don't see how adding those low-level monitory things to libvirt is
an improvement - debugging and scripted keystrokes are not the sort of
functionality libvirt is for - or is it?
The other alternative is not to use libvirt for these VMs, but that
means losing functionality that's useful to me (visibility in the
GUI), and more importantly it means I have to configure nearly
identical VMs in a completely different way (totally different
configuration syntax between libvirt and QEMU direct) depending on
what I'm going to do with them.
Hence multiplexing monitors, either outside or inside QEMU. Inside is
better because its behaviour is more well-defined.
-- Jamie
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-11 21:47 ` Andreas Färber
@ 2009-04-12 18:44 ` Jamie Lokier
0 siblings, 0 replies; 63+ messages in thread
From: Jamie Lokier @ 2009-04-12 18:44 UTC (permalink / raw)
To: qemu-devel
Andreas Färber wrote:
> >http://faqs.org/rfcs/rfc1459.html
>
> Great! Then if everyone else is afk, I can at least chat to my VMs. ;)
Seriously, there are quite a few application protocols which run over IRC.
Not that I recommend adding to them.
-- Jamie
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-12 8:23 ` Zachary Amsden
@ 2009-04-14 8:28 ` Gerd Hoffmann
2009-04-14 18:20 ` Jamie Lokier
0 siblings, 1 reply; 63+ messages in thread
From: Gerd Hoffmann @ 2009-04-14 8:28 UTC (permalink / raw)
To: qemu-devel
Cc: libvir-list, Anthony Liguori, Jan Kiszka, Avi Kivity,
Hollis Blanchard
Hi,
> Personally, I think relying on asynchronous events to provide reliable
> status is a bad idea. Management connections can and will get
> disconnected, buffers will get filled and event notifications will be
> dropped.
I somehow like the idea from someone (Jamie?) somewhere in this thread
to model the notification like unix signals. Just flag that something
changed. Don't carry the actual info, just ping the management app,
which in turn must use "info <whatever>" to get the details.
That solves the queuing issue. I also closes the command vs.
notification races. Management apps don't need new parsers, the
existing "info <foo>" parser(s) will do just fine.
cheers,
Gerd
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-12 18:42 ` Jamie Lokier
@ 2009-04-14 8:30 ` Daniel P. Berrange
2009-04-14 9:15 ` Avi Kivity
0 siblings, 1 reply; 63+ messages in thread
From: Daniel P. Berrange @ 2009-04-14 8:30 UTC (permalink / raw)
To: Jamie Lokier; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
On Sun, Apr 12, 2009 at 07:42:17PM +0100, Jamie Lokier wrote:
> Avi Kivity wrote:
> > Anthony Liguori wrote:
> > >At the end of the day, I want to be able to run a QEMU instance from
> > >the command line, and have virt-manager be able to see it remotely and
> > >connect to it. That means multiple monitors and it means that all
> > >commands that change VM state must generate some sort of notification
> > >such that libvirt can keep track of the changing state of a VM.
> >
> > I don't think most management application authors would expose the qemu
> > monitor to users. It sounds like a huge risk, and for what benefit? If
> > there's something interesting you can do with the monitor, add it to the
> > management interface so people can actually use it. They don't buy this
> > stuff so they can telnet into the monitor.
>
> I want the same as Anthony. I want to do unusual things that libvirt
> doesn't support and shouldn't have to support itself, such as sending
> keystrokes to a running VM (from a script), attaching a debugger, and
> hotplugging network devices that are configured differently to how
> libvirt would like to do it. I also want these VMs to show in the
> nice GUI along with other non-debugging VMs, show their resources,
> start and stop them easily, catch them when they attempt to reboot,
> and let me do these things remotely.
>
> My solutionat the moment is to put a monitor multiplexer outside QEMU
> (it's a small Perl script). It accepts multiple monitor connections
> and forwards to QEMU's single monitor, parsing the "^\(qemu\) "
> prompt. This is obviously silly but it's what we have to do to get
> this functionality.
Yes indeed its a little crazy :-) As anthony mentioned if libvirt were
able to be notified of changes a user makes in the monitor, there's no
reason we could not allow end users to access the monitor of a VM
libvirt is managing. We just need to make sure libvirt doesn't miss
changes like attaching or detaching block devices, etc, because that'll
cause crash/data loss later when libvirt migrates or does save/restore,
etc because it'll launch QEMU with wrong args
> I don't see how adding those low-level monitory things to libvirt is
> an improvement - debugging and scripted keystrokes are not the sort of
> functionality libvirt is for - or is it?
I think it could probably be argued that sending fake keystrokes could
be within scope. Random ad-hoc debugging probably out of scope.
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-14 8:30 ` [libvirt] " Daniel P. Berrange
@ 2009-04-14 9:15 ` Avi Kivity
2009-04-14 9:17 ` Daniel P. Berrange
2009-04-14 18:19 ` Jamie Lokier
0 siblings, 2 replies; 63+ messages in thread
From: Avi Kivity @ 2009-04-14 9:15 UTC (permalink / raw)
To: Daniel P. Berrange, qemu-devel; +Cc: libvir-list, Jan Kiszka, Hollis Blanchard
Daniel P. Berrange wrote:
> Yes indeed its a little crazy :-) As anthony mentioned if libvirt were
> able to be notified of changes a user makes in the monitor, there's no
> reason we could not allow end users to access the monitor of a VM
> libvirt is managing. We just need to make sure libvirt doesn't miss
> changes like attaching or detaching block devices, etc, because that'll
> cause crash/data loss later when libvirt migrates or does save/restore,
> etc because it'll launch QEMU with wrong args
>
You still have an inherent race here.
user: plug in disk
libvirt: start migration, still without disk
qemu: libvirt, a disk has been plugged in.
>> I don't see how adding those low-level monitory things to libvirt is
>> an improvement - debugging and scripted keystrokes are not the sort of
>> functionality libvirt is for - or is it?
>>
>
> I think it could probably be argued that sending fake keystrokes could
> be within scope. Random ad-hoc debugging probably out of scope.
>
That means that to debug a problem in the field you have to locate a
guest's host, and follow it around as it migrates (or disable migration).
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-14 9:15 ` Avi Kivity
@ 2009-04-14 9:17 ` Daniel P. Berrange
2009-04-14 9:29 ` Jan Kiszka
2009-04-14 9:38 ` Avi Kivity
2009-04-14 18:19 ` Jamie Lokier
1 sibling, 2 replies; 63+ messages in thread
From: Daniel P. Berrange @ 2009-04-14 9:17 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
On Tue, Apr 14, 2009 at 12:15:23PM +0300, Avi Kivity wrote:
> Daniel P. Berrange wrote:
> >Yes indeed its a little crazy :-) As anthony mentioned if libvirt were
> >able to be notified of changes a user makes in the monitor, there's no
> >reason we could not allow end users to access the monitor of a VM
> >libvirt is managing. We just need to make sure libvirt doesn't miss
> >changes like attaching or detaching block devices, etc, because that'll
> >cause crash/data loss later when libvirt migrates or does save/restore,
> >etc because it'll launch QEMU with wrong args
> >
>
> You still have an inherent race here.
>
> user: plug in disk
> libvirt: start migration, still without disk
> qemu: libvirt, a disk has been plugged in.
That is true, but we'd still be considering direct monitor access to
be a 'expert' user mode of use. If they wish to shoot themselves in
the foot by triggering a migration at same time they are hotplugging
I'm fine if their whole leg gets blown away.
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-14 9:17 ` Daniel P. Berrange
@ 2009-04-14 9:29 ` Jan Kiszka
2009-04-14 9:36 ` Avi Kivity
2009-04-14 9:38 ` Avi Kivity
1 sibling, 1 reply; 63+ messages in thread
From: Jan Kiszka @ 2009-04-14 9:29 UTC (permalink / raw)
To: Daniel P. Berrange
Cc: Hollis Blanchard, libvir-list, qemu-devel, Jan Kiszka, Avi Kivity
Daniel P. Berrange wrote:
> On Tue, Apr 14, 2009 at 12:15:23PM +0300, Avi Kivity wrote:
>> Daniel P. Berrange wrote:
>>> Yes indeed its a little crazy :-) As anthony mentioned if libvirt were
>>> able to be notified of changes a user makes in the monitor, there's no
>>> reason we could not allow end users to access the monitor of a VM
>>> libvirt is managing. We just need to make sure libvirt doesn't miss
>>> changes like attaching or detaching block devices, etc, because that'll
>>> cause crash/data loss later when libvirt migrates or does save/restore,
>>> etc because it'll launch QEMU with wrong args
>>>
>> You still have an inherent race here.
>>
>> user: plug in disk
>> libvirt: start migration, still without disk
>> qemu: libvirt, a disk has been plugged in.
>
> That is true, but we'd still be considering direct monitor access to
> be a 'expert' user mode of use. If they wish to shoot themselves in
> the foot by triggering a migration at same time they are hotplugging
> I'm fine if their whole leg gets blown away.
...while there is also nothing that speaks against blocking any device
hot-plugging while migration is ongoing. Independent of if there is some
management app involved or the user himself plays with multiple monitors.
Jan
--
Siemens AG, Corporate Technology, CT SE 2
Corporate Competence Center Embedded Linux
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-14 9:29 ` Jan Kiszka
@ 2009-04-14 9:36 ` Avi Kivity
0 siblings, 0 replies; 63+ messages in thread
From: Avi Kivity @ 2009-04-14 9:36 UTC (permalink / raw)
To: Jan Kiszka; +Cc: Hollis Blanchard, libvir-list, qemu-devel, Jan Kiszka
Jan Kiszka wrote:
>> That is true, but we'd still be considering direct monitor access to
>> be a 'expert' user mode of use. If they wish to shoot themselves in
>> the foot by triggering a migration at same time they are hotplugging
>> I'm fine if their whole leg gets blown away.
>>
>
> ...while there is also nothing that speaks against blocking any device
> hot-plugging while migration is ongoing. Independent of if there is some
> management app involved or the user himself plays with multiple monitors.
>
>
If the management is doing the hotplugging, it should just to it on both
sides.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-14 9:17 ` Daniel P. Berrange
2009-04-14 9:29 ` Jan Kiszka
@ 2009-04-14 9:38 ` Avi Kivity
2009-04-14 18:21 ` Jamie Lokier
1 sibling, 1 reply; 63+ messages in thread
From: Avi Kivity @ 2009-04-14 9:38 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Daniel P. Berrange wrote:
> On Tue, Apr 14, 2009 at 12:15:23PM +0300, Avi Kivity wrote:
>
>> Daniel P. Berrange wrote:
>>
>>> Yes indeed its a little crazy :-) As anthony mentioned if libvirt were
>>> able to be notified of changes a user makes in the monitor, there's no
>>> reason we could not allow end users to access the monitor of a VM
>>> libvirt is managing. We just need to make sure libvirt doesn't miss
>>> changes like attaching or detaching block devices, etc, because that'll
>>> cause crash/data loss later when libvirt migrates or does save/restore,
>>> etc because it'll launch QEMU with wrong args
>>>
>>>
>> You still have an inherent race here.
>>
>> user: plug in disk
>> libvirt: start migration, still without disk
>> qemu: libvirt, a disk has been plugged in.
>>
>
> That is true, but we'd still be considering direct monitor access to
> be a 'expert' user mode of use. If they wish to shoot themselves in
> the foot by triggering a migration at same time they are hotplugging
> I'm fine if their whole leg gets blown away.
>
What if the system triggers migration automatically (as you'd expect).
And that's just one example. I'm sure there are more. libvirt issues
commands expecting some state in qemu. It can't learn of that state from
listening on another monitor, because there are delays between the state
changing and the notification.
If you want things to work reliably, you have to follow the chain of
command.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-14 9:15 ` Avi Kivity
2009-04-14 9:17 ` Daniel P. Berrange
@ 2009-04-14 18:19 ` Jamie Lokier
2009-04-16 9:03 ` Avi Kivity
1 sibling, 1 reply; 63+ messages in thread
From: Jamie Lokier @ 2009-04-14 18:19 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> Daniel P. Berrange wrote:
> >Yes indeed its a little crazy :-) As anthony mentioned if libvirt were
> >able to be notified of changes a user makes in the monitor, there's no
> >reason we could not allow end users to access the monitor of a VM
> >libvirt is managing. We just need to make sure libvirt doesn't miss
> >changes like attaching or detaching block devices, etc, because that'll
> >cause crash/data loss later when libvirt migrates or does save/restore,
> >etc because it'll launch QEMU with wrong args
> >
>
> You still have an inherent race here.
>
> user: plug in disk
> libvirt: start migration, still without disk
> qemu: libvirt, a disk has been plugged in.
Then fix it. The race is not necessary.
user: plug in a disk
libvirt: lock VM against user changes incompatible with migration
qemu: libvirt, lock granted
libvirt: query for current disk state
libvirt: start migration, knows about the disk
The "libvirt, a disk has been plugged in" will be delivered but it's
not important. libvirt queries the state of things after it acquires
the lock and before it starts migration.
> That means that to debug a problem in the field you have to locate a
> guest's host, and follow it around as it migrates (or disable migration).
That's right you do. Is there any way to debug a guest without
disabling migration? I don't think there is at present, so of course
you have to disable migration when you debug. Another reason for that
"lock against migration" mentioned above.
-- Jamie
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-14 8:28 ` Gerd Hoffmann
@ 2009-04-14 18:20 ` Jamie Lokier
0 siblings, 0 replies; 63+ messages in thread
From: Jamie Lokier @ 2009-04-14 18:20 UTC (permalink / raw)
To: qemu-devel
Cc: libvir-list, Anthony Liguori, Jan Kiszka, Avi Kivity,
Hollis Blanchard
Gerd Hoffmann wrote:
> Management apps don't need new parsers, the existing "info <foo>"
> parser(s) will do just fine.
And QEMU doesn't need new printers. Less code to go wrong :-)
-- Jamie
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-14 9:38 ` Avi Kivity
@ 2009-04-14 18:21 ` Jamie Lokier
0 siblings, 0 replies; 63+ messages in thread
From: Jamie Lokier @ 2009-04-14 18:21 UTC (permalink / raw)
To: Avi Kivity; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Avi Kivity wrote:
> If you want things to work reliably, you have to follow the chain of
> command.
Or use locks and/or transactions like everything else :-)
-- Jamie
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [libvirt] Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-14 18:19 ` Jamie Lokier
@ 2009-04-16 9:03 ` Avi Kivity
0 siblings, 0 replies; 63+ messages in thread
From: Avi Kivity @ 2009-04-16 9:03 UTC (permalink / raw)
To: Jamie Lokier; +Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard
Jamie Lokier wrote:
> Avi Kivity wrote:
>
>> Daniel P. Berrange wrote:
>>
>>> Yes indeed its a little crazy :-) As anthony mentioned if libvirt were
>>> able to be notified of changes a user makes in the monitor, there's no
>>> reason we could not allow end users to access the monitor of a VM
>>> libvirt is managing. We just need to make sure libvirt doesn't miss
>>> changes like attaching or detaching block devices, etc, because that'll
>>> cause crash/data loss later when libvirt migrates or does save/restore,
>>> etc because it'll launch QEMU with wrong args
>>>
>>>
>> You still have an inherent race here.
>>
>> user: plug in disk
>> libvirt: start migration, still without disk
>> qemu: libvirt, a disk has been plugged in.
>>
>
> Then fix it. The race is not necessary.
>
> user: plug in a disk
> libvirt: lock VM against user changes incompatible with migration
> qemu: libvirt, lock granted
> libvirt: query for current disk state
> libvirt: start migration, knows about the disk
>
> The "libvirt, a disk has been plugged in" will be delivered but it's
> not important. libvirt queries the state of things after it acquires
> the lock and before it starts migration.
>
>
Migration is supposed to be transparent. You're reducing quality of
service if you're disabling features while migrating.
>> That means that to debug a problem in the field you have to locate a
>> guest's host, and follow it around as it migrates (or disable migration).
>>
>
> That's right you do. Is there any way to debug a guest without
> disabling migration? I don't think there is at present, so of course
> you have to disable migration when you debug. Another reason for that
> "lock against migration" mentioned above.
>
Nothing prevents you from debugging a guest during migration. You'll
have to reconnect to the monitor, but that's it.
--
Do not meddle in the internals of kernels, for they are subtle and quick to panic.
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-04-08 18:34 [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2) Anthony Liguori
2009-04-08 18:34 ` [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
2009-04-09 8:19 ` [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2) Avi Kivity
@ 2009-05-11 20:54 ` Hollis Blanchard
2009-05-11 21:51 ` Anthony Liguori
2 siblings, 1 reply; 63+ messages in thread
From: Hollis Blanchard @ 2009-05-11 20:54 UTC (permalink / raw)
To: qemu-devel
Cc: libvir-list, Anthony Liguori, Jan Kiszka, Avi Kivity,
Richard W.M. Jones
On Wed, 2009-04-08 at 13:34 -0500, Anthony Liguori wrote:
> Right now only one monitor device can be enabled at a time. In order to support
> asynchronous notification of events, I would like to introduce a 'wait' command
> that waits for an event to occur. This implies that we need an additional
> monitor session to allow commands to still be executed while waiting for an
> asynchronous notification.
Was there any consensus reached in this thread? I'm once again looking
for ways to communicate qemu watchdog events to libvirt.
With these patches, libvirt could open a second monitor connection to
qemu, and in the second one execute "wait_event". When the watchdog
triggers, the wait command would print the event, libvirt would get the
fd "data available" notification, and create a domain event. Right?
--
Hollis Blanchard
IBM Linux Technology Center
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-05-11 20:54 ` Hollis Blanchard
@ 2009-05-11 21:51 ` Anthony Liguori
2009-05-12 8:48 ` Avi Kivity
0 siblings, 1 reply; 63+ messages in thread
From: Anthony Liguori @ 2009-05-11 21:51 UTC (permalink / raw)
To: Hollis Blanchard
Cc: libvir-list, Richard W.M. Jones, Jan Kiszka, qemu-devel,
Avi Kivity
Hollis Blanchard wrote:
> On Wed, 2009-04-08 at 13:34 -0500, Anthony Liguori wrote:
>
>> Right now only one monitor device can be enabled at a time. In order to support
>> asynchronous notification of events, I would like to introduce a 'wait' command
>> that waits for an event to occur. This implies that we need an additional
>> monitor session to allow commands to still be executed while waiting for an
>> asynchronous notification.
>>
>
> Was there any consensus reached in this thread? I'm once again looking
> for ways to communicate qemu watchdog events to libvirt.
>
We can do multiple monitors as a debugging tool, but to support events,
a proper machine monitor mode is a prerequisite.
The real requirement is that events are obtainable via a single
communication channel instead of requiring two separate communication
channels. Internal implementation will look at lot like these patches.
The reasoning for requiring a single channel is that coordinating
between the two channels is expected to be prohibitively difficult. To
have a single channel, we need a machine mode. It cannot be done in a
human readable fashion.
I think this summarizes the consensus we reached. I don't agree fully
with the above but I'm okay with it. Would you agree Avi?
--
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 63+ messages in thread
* Re: [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2)
2009-05-11 21:51 ` Anthony Liguori
@ 2009-05-12 8:48 ` Avi Kivity
0 siblings, 0 replies; 63+ messages in thread
From: Avi Kivity @ 2009-05-12 8:48 UTC (permalink / raw)
To: Anthony Liguori
Cc: libvir-list, Jan Kiszka, qemu-devel, Hollis Blanchard,
Richard W.M. Jones
Anthony Liguori wrote:
> Hollis Blanchard wrote:
>> On Wed, 2009-04-08 at 13:34 -0500, Anthony Liguori wrote:
>>
>>> Right now only one monitor device can be enabled at a time. In
>>> order to support
>>> asynchronous notification of events, I would like to introduce a
>>> 'wait' command
>>> that waits for an event to occur. This implies that we need an
>>> additional
>>> monitor session to allow commands to still be executed while waiting
>>> for an
>>> asynchronous notification.
>>>
>>
>> Was there any consensus reached in this thread? I'm once again looking
>> for ways to communicate qemu watchdog events to libvirt.
>>
>
> We can do multiple monitors as a debugging tool, but to support
> events, a proper machine monitor mode is a prerequisite.
>
> The real requirement is that events are obtainable via a single
> communication channel instead of requiring two separate communication
> channels. Internal implementation will look at lot like these patches.
>
> The reasoning for requiring a single channel is that coordinating
> between the two channels is expected to be prohibitively difficult.
> To have a single channel, we need a machine mode. It cannot be done
> in a human readable fashion.
>
> I think this summarizes the consensus we reached. I don't agree fully
> with the above but I'm okay with it.
If you don't agree with it, it isn't a consensus.
> Would you agree Avi?
It represents my views fairly accurately. I'm not convinced that you
can't to event notifications without machine mode, but on the other hand
I do think introducing machine mode and layering notifications on top of
that is the best way to proceed, so I can't complain.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 63+ messages in thread
end of thread, other threads:[~2009-05-12 8:49 UTC | newest]
Thread overview: 63+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-08 18:34 [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2) Anthony Liguori
2009-04-08 18:34 ` [Qemu-devel] [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
2009-04-08 18:34 ` [Qemu-devel] [PATCH 3/6] Introduce wait filtering (v2) Anthony Liguori
2009-04-08 18:35 ` [Qemu-devel] [PATCH 4/6] Document new events (v2) Anthony Liguori
2009-04-08 18:35 ` [Qemu-devel] [PATCH 5/6] Implement vm-state notifications (v2) Anthony Liguori
2009-04-08 18:35 ` [Qemu-devel] [PATCH 6/6] Implement vnc-event " Anthony Liguori
2009-04-08 18:43 ` [Qemu-devel] Re: [PATCH 2/6] Introduce monitor 'wait' command (v2) Anthony Liguori
2009-04-08 19:01 ` [Qemu-devel] " Blue Swirl
2009-04-08 19:02 ` Anthony Liguori
2009-04-09 11:01 ` Avi Kivity
2009-04-09 13:40 ` Anthony Liguori
2009-04-09 13:58 ` Avi Kivity
2009-04-09 14:19 ` Jan Kiszka
2009-04-09 8:19 ` [Qemu-devel] [PATCH 1/6] Allow multiple monitor devices (v2) Avi Kivity
2009-04-09 13:28 ` Anthony Liguori
2009-04-09 13:40 ` Avi Kivity
2009-04-09 13:47 ` Anthony Liguori
2009-04-09 14:03 ` Avi Kivity
2009-04-09 14:13 ` Anthony Liguori
2009-04-09 14:28 ` Avi Kivity
2009-04-09 14:30 ` Anthony Liguori
2009-04-09 14:37 ` Avi Kivity
2009-04-09 14:57 ` Anthony Liguori
2009-04-09 15:11 ` Avi Kivity
2009-04-09 15:40 ` Anthony Liguori
2009-04-09 15:57 ` Avi Kivity
2009-04-09 16:09 ` Anthony Liguori
2009-04-09 16:30 ` Avi Kivity
2009-04-09 16:42 ` Anthony Liguori
2009-04-09 17:00 ` Avi Kivity
2009-04-09 17:40 ` Anthony Liguori
2009-04-11 16:25 ` Avi Kivity
2009-04-11 20:18 ` Anthony Liguori
2009-04-11 21:14 ` Avi Kivity
2009-04-12 18:42 ` Jamie Lokier
2009-04-14 8:30 ` [libvirt] " Daniel P. Berrange
2009-04-14 9:15 ` Avi Kivity
2009-04-14 9:17 ` Daniel P. Berrange
2009-04-14 9:29 ` Jan Kiszka
2009-04-14 9:36 ` Avi Kivity
2009-04-14 9:38 ` Avi Kivity
2009-04-14 18:21 ` Jamie Lokier
2009-04-14 18:19 ` Jamie Lokier
2009-04-16 9:03 ` Avi Kivity
2009-04-11 23:16 ` Zachary Amsden
2009-04-12 8:23 ` Zachary Amsden
2009-04-14 8:28 ` Gerd Hoffmann
2009-04-14 18:20 ` Jamie Lokier
2009-04-11 19:11 ` Avi Kivity
2009-04-11 21:47 ` Andreas Färber
2009-04-12 18:44 ` Jamie Lokier
2009-04-09 16:01 ` Jamie Lokier
2009-04-09 14:15 ` [libvirt] " Gerd Hoffmann
2009-04-09 14:19 ` Avi Kivity
2009-04-09 14:56 ` Jan Kiszka
2009-04-09 15:15 ` François Revol
2009-04-09 15:15 ` Avi Kivity
2009-04-09 15:49 ` Jan Kiszka
2009-04-09 16:01 ` Avi Kivity
2009-04-09 16:07 ` Jamie Lokier
2009-05-11 20:54 ` Hollis Blanchard
2009-05-11 21:51 ` Anthony Liguori
2009-05-12 8:48 ` Avi Kivity
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).