[libvirt] [PATCH 13/15] Async event handling in QEMU monitor text protocol

Daniel Veillard veillard at redhat.com
Wed Nov 4 17:37:40 UTC 2009


On Tue, Nov 03, 2009 at 02:50:07PM -0500, Daniel P. Berrange wrote:
> Start for on detecting & dispatching async events fed into the
> QEMU monitor.
> 
> In RHEL-5 fork of QEMU, the 'notify' command turns on events,
> and events are prefixed with a leading '#' character.

  hum, and that's likely to match upstream ? we have conditional support
for rhel at configure time maybe this shoudl show up if not the case.

> * src/qemu/qemu_monitor_text.h, src/qemu/qemu_monitor_text.c:
>   Detect and filter any async events
> ---
>  src/qemu/qemu_conf.c         |    5 +++--
>  src/qemu/qemu_monitor.c      |    4 ++++
>  src/qemu/qemu_monitor_text.c |   33 +++++++++++++++++++++++++++++++++
>  src/qemu/qemu_monitor_text.h |    2 ++
>  4 files changed, 42 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index 59873d7..b01fddc 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -1885,8 +1885,9 @@ int qemudBuildCommandLine(virConnectPtr conn,
>                  break;
>              }
>  
> -            virBufferVSprintf(&opt, "file=%s", disk->src ? disk->src : "");
> -            virBufferVSprintf(&opt, ",if=%s", bus);
> +            if (disk->src)
> +                virBufferVSprintf(&opt, "file=%s,", disk->src ? disk->src : "");
> +            virBufferVSprintf(&opt, "if=%s", bus);
>              if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
>                  virBufferAddLit(&opt, ",media=cdrom");
>              virBufferVSprintf(&opt, ",index=%d", idx);
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index 3e6a490..501cb3f 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -499,6 +499,10 @@ qemuMonitorOpen(virDomainObjPtr vm,
>  
>      virDomainObjRef(vm);
>  
> +    if (qemuMonitorTextNotifyEnable(mon) < 0) {
> +        VIR_INFO0("This QEMU does not support notifications");
> +    }
> +
>      VIR_DEBUG("New mon %p fd =%d watch=%d", mon, mon->fd, mon->watch);
>      qemuMonitorUnlock(mon);
>  
> diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
> index db7ff57..e250abc 100644
> --- a/src/qemu/qemu_monitor_text.c
> +++ b/src/qemu/qemu_monitor_text.c
> @@ -146,6 +146,7 @@ static char *qemuMonitorEscapeShell(const char *in)
>  #define DISK_ENCRYPTION_PREFIX "("
>  #define DISK_ENCRYPTION_POSTFIX ") is encrypted."
>  #define LINE_ENDING "\r\n"
> +#define EVENT_PREFIX "# "
>  
>  int qemuMonitorTextIOProcess(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>                               const char *data,
> @@ -174,6 +175,25 @@ int qemuMonitorTextIOProcess(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>      /*VIR_DEBUG("Process data %d byts of data [%s]", len - used, data + used);*/
>      VIR_DEBUG("Process data %d byts of data", len - used);
>  
> +    while (STRPREFIX(data + used, EVENT_PREFIX)) {
> +        const char *start = data + used + strlen(EVENT_PREFIX);
> +        const char *end = strstr(start, LINE_ENDING);
> +        int want;
> +        char *event;
> +
> +        if (!end)
> +            goto cleanup;
> +
> +        want = end - start;
> +
> +        event = strndup(start, want);
> +
> +        VIR_DEBUG("Woooo event [%s]", event);
> +        VIR_FREE(event);
> +
> +        used += strlen(EVENT_PREFIX) + want + strlen(LINE_ENDING);
> +    }
> +
>      /* Look for a non-zero reply followed by prompt */
>      if (msg && !msg->finished) {
>          const char *end;
> @@ -236,6 +256,7 @@ int qemuMonitorTextIOProcess(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>          }
>      }
>  
> +cleanup:
>      VIR_DEBUG("Total used %d", used);
>      return used;
>  }
> @@ -380,6 +401,18 @@ qemuMonitorSendDiskPassphrase(qemuMonitorPtr mon,
>  }
>  
>  int
> +qemuMonitorTextNotifyEnable(qemuMonitorPtr mon)
> +{
> +    char *reply;
> +
> +    if (qemuMonitorCommand(mon, "notify all on", &reply) < 0)
> +        return -1;
> +
> +    VIR_FREE(reply);
> +    return 0;
> +}
> +
> +int
>  qemuMonitorTextStartCPUs(qemuMonitorPtr mon,
>                           virConnectPtr conn) {
>      char *reply;
> diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h
> index 6bca07a..abba90b 100644
> --- a/src/qemu/qemu_monitor_text.h
> +++ b/src/qemu/qemu_monitor_text.h
> @@ -29,6 +29,8 @@
>  
>  #include "qemu_monitor.h"
>  
> +int qemuMonitorTextNotifyEnable(qemuMonitorPtr mon);
> +
>  int qemuMonitorTextIOProcess(qemuMonitorPtr mon,
>                               const char *data,
>                               size_t len,

  ACK,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list