Patchwork hmp/qxl: info spice: add qxl info

login
register
mail settings
Submitter Alon Levy
Date May 24, 2012, 3:09 p.m.
Message ID <1337872191-22104-1-git-send-email-alevy@redhat.com>
Download mbox | patch
Permalink /patch/161150/
State New
Headers show

Comments

Alon Levy - May 24, 2012, 3:09 p.m.
For all devices print id, mode and guest_bug status.

Known problems: Prints devices from highest id to lowest.

Signed-off-by: Alon Levy <alevy@redhat.com>
---
Fixed the documentation to match the command (no more qxl0).

Sending to QMP maintainers per Kraxel's request for an additional ack.

Alon

 hmp.c            |   11 +++++++++++
 hw/qxl.c         |   22 ++++++++++++++++++++++
 qapi-schema.json |   45 +++++++++++++++++++++++++++++++++++++++++++--
 ui/qemu-spice.h  |    5 +++++
 ui/spice-core.c  |   48 +++++++++++++++++++++++++++++++++++++++++++++++-
 5 files changed, 128 insertions(+), 3 deletions(-)
Alon Levy - May 24, 2012, 3:19 p.m.
On Thu, May 24, 2012 at 06:09:51PM +0300, Alon Levy wrote:
> For all devices print id, mode and guest_bug status.
> 
> Known problems: Prints devices from highest id to lowest.
> 
> Signed-off-by: Alon Levy <alevy@redhat.com>
> ---
> Fixed the documentation to match the command (no more qxl0).
> 
> Sending to QMP maintainers per Kraxel's request for an additional ack.
> 
> Alon

Self NACK.

Missing a previous patch, this thing won't compile even, sorry. I'll
send a second revision.

> 
>  hmp.c            |   11 +++++++++++
>  hw/qxl.c         |   22 ++++++++++++++++++++++
>  qapi-schema.json |   45 +++++++++++++++++++++++++++++++++++++++++++--
>  ui/qemu-spice.h  |    5 +++++
>  ui/spice-core.c  |   48 +++++++++++++++++++++++++++++++++++++++++++++++-
>  5 files changed, 128 insertions(+), 3 deletions(-)
> 
> diff --git a/hmp.c b/hmp.c
> index bb0952e..5126921 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -331,6 +331,7 @@ void hmp_info_spice(Monitor *mon)
>  {
>      SpiceChannelList *chan;
>      SpiceInfo *info;
> +    QXLInfoList *qxl;
>  
>      info = qmp_query_spice(NULL);
>  
> @@ -353,6 +354,16 @@ void hmp_info_spice(Monitor *mon)
>      monitor_printf(mon, "  mouse-mode: %s\n",
>                     SpiceQueryMouseMode_lookup[info->mouse_mode]);
>  
> +    for (qxl = info->qxl; qxl; qxl = qxl->next) {
> +        if (qxl->value->guest_bug == -1 || qxl->value->mode == -1) {
> +            continue;
> +        }
> +        monitor_printf(mon, "qxl-%"PRId64":\n", qxl->value->id);
> +        monitor_printf(mon, "        mode: %s\n",
> +                SpiceQueryQXLMode_lookup[qxl->value->mode]);
> +        monitor_printf(mon, "   guest_bug: %"PRIu64"\n", qxl->value->guest_bug);
> +    }
> +
>      if (!info->has_channels || info->channels == NULL) {
>          monitor_printf(mon, "Channels: none\n");
>      } else {
> diff --git a/hw/qxl.c b/hw/qxl.c
> index 5a7be60..05ff176 100644
> --- a/hw/qxl.c
> +++ b/hw/qxl.c
> @@ -1701,6 +1701,28 @@ static DisplayChangeListener display_listener = {
>      .dpy_refresh = display_refresh,
>  };
>  
> +/* helpers for spice_info */
> +int qxl_get_guest_bug(DeviceState *dev)
> +{
> +    PCIQXLDevice *qxl = DO_UPCAST(PCIQXLDevice, pci.qdev, dev);
> +
> +    return qxl->guest_bug;
> +}
> +
> +int qxl_get_mode(DeviceState *dev)
> +{
> +    PCIQXLDevice *qxl = DO_UPCAST(PCIQXLDevice, pci.qdev, dev);
> +
> +    return qxl->mode;
> +}
> +
> +int qxl_get_id(DeviceState *dev)
> +{
> +    PCIQXLDevice *qxl = DO_UPCAST(PCIQXLDevice, pci.qdev, dev);
> +
> +    return qxl->id;
> +}
> +
>  static void qxl_init_ramsize(PCIQXLDevice *qxl, uint32_t ram_min_mb)
>  {
>      /* vga ram (bar 0) */
> diff --git a/qapi-schema.json b/qapi-schema.json
> index 2ca7195..22a9034 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -638,7 +638,7 @@
>  ##
>  # @SpiceQueryMouseMode
>  #
> -# An enumation of Spice mouse states.
> +# An enumeration of Spice mouse states.
>  #
>  # @client: Mouse cursor position is determined by the client.
>  #
> @@ -655,6 +655,44 @@
>    'data': [ 'client', 'server', 'unknown' ] }
>  
>  ##
> +# @SpiceQueryQXLMode
> +#
> +# An enumeration of QXL States.
> +#
> +# @undefined: guest driver in control but no primary device. Reached after a destroy primary IO
> +#             from native mode.
> +#
> +# @vga: no device driver in control. default mode, returns to it after any vga port access.
> +#
> +# @compat: No information is available about mouse mode used by
> +#           the spice server.
> +#
> +# @native: guest driver in control of device. Reached after a create primary IO.
> +#
> +# Note: hw/qxl.h has a qxl_mode enum, name chose to not confuse the two.
> +#
> +# Since: 1.1
> +##
> +{ 'enum': 'SpiceQueryQXLMode',
> +  'data': [ 'undefined', 'vga', 'compat', 'native' ] }
> +
> +##
> +# @QXLInfo
> +#
> +# Information about a QXL device.
> +#
> +# @id: qxl id, non negative integer, 0 for primary device.
> +#
> +# @guest_bug: Has a guest error been detected.
> +#
> +# @mode: Mode of device, based on guest activity.
> +#
> +# Since: 1.1
> +##
> +{ 'type': 'QXLInfo',
> +  'data': {'id': 'int', 'guest_bug': 'int', 'mode': 'SpiceQueryQXLMode'} }
> +
> +##
>  # @SpiceInfo
>  #
>  # Information about the SPICE session.
> @@ -683,12 +721,15 @@
>  #
>  # @channels: a list of @SpiceChannel for each active spice channel
>  #
> +# @qxl: a list of @QXLInfo for each qxl device.
> +#
>  # Since: 0.14.0
>  ##
>  { 'type': 'SpiceInfo',
>    'data': {'enabled': 'bool', '*host': 'str', '*port': 'int',
>             '*tls-port': 'int', '*auth': 'str', '*compiled-version': 'str',
> -           'mouse-mode': 'SpiceQueryMouseMode', '*channels': ['SpiceChannel']} }
> +           'mouse-mode': 'SpiceQueryMouseMode', '*channels': ['SpiceChannel'],
> +           'qxl': ['QXLInfo']} }
>  
>  ##
>  # @query-spice
> diff --git a/ui/qemu-spice.h b/ui/qemu-spice.h
> index 3299da8..edcf3a5 100644
> --- a/ui/qemu-spice.h
> +++ b/ui/qemu-spice.h
> @@ -47,6 +47,11 @@ void do_info_spice(Monitor *mon, QObject **ret_data);
>  
>  CharDriverState *qemu_chr_open_spice(QemuOpts *opts);
>  
> +/* implemented in hw/qxl.c */
> +int qxl_get_guest_bug(DeviceState *dev);
> +int qxl_get_mode(DeviceState *dev);
> +int qxl_get_id(DeviceState *dev);
> +
>  #else  /* CONFIG_SPICE */
>  #include "monitor.h"
>  
> diff --git a/ui/spice-core.c b/ui/spice-core.c
> index 4fc48f8..25833e5 100644
> --- a/ui/spice-core.c
> +++ b/ui/spice-core.c
> @@ -22,7 +22,6 @@
>  #include "sysemu.h"
>  
>  #include "qemu-common.h"
> -#include "qemu-spice.h"
>  #include "qemu-thread.h"
>  #include "qemu-timer.h"
>  #include "qemu-queue.h"
> @@ -37,6 +36,8 @@
>  #include "migration.h"
>  #include "monitor.h"
>  #include "hw/hw.h"
> +#include "hw/qdev.h"
> +#include "qemu-spice.h"
>  
>  /* core bits */
>  
> @@ -419,6 +420,50 @@ static SpiceChannelList *qmp_query_spice_channels(void)
>      return head;
>  }
>  
> +static int qdev_walk_qxl(DeviceState *dev, void *opaque)
> +{
> +    QXLInfoList **cur = opaque;
> +    QXLInfoList *qxl_info;
> +    int first = 0;
> +    const char *class_name = object_get_typename(OBJECT(dev));
> +
> +    if (strcmp(class_name, "qxl") != 0 &&
> +        strcmp(class_name, "qxl-vga") != 0) {
> +        return 0;
> +    }
> +    if ((*cur)->value == NULL) {
> +        first = 1;
> +        qxl_info = *cur;
> +    } else {
> +        qxl_info = g_malloc(sizeof(*qxl_info));
> +    }
> +    qxl_info->next = NULL;
> +    qxl_info->value = g_malloc(sizeof(*qxl_info->value));
> +    qxl_info->value->id = qxl_get_id(dev);
> +    qxl_info->value->guest_bug = qxl_get_guest_bug(dev);
> +    qxl_info->value->mode = qxl_get_mode(dev);
> +    if (!first) {
> +        (*cur)->next = qxl_info;
> +        *cur = qxl_info;
> +    }
> +    return 0;
> +}
> +
> +static int qbus_walk_all(BusState *bus, void *opaque)
> +{
> +    return 0;
> +}
> +
> +static QXLInfoList *qmp_query_qxl(void)
> +{
> +    QXLInfoList *root = g_malloc0(sizeof(*root));
> +    QXLInfoList *cur = root;
> +    BusState *default_bus = sysbus_get_default();
> +
> +    qbus_walk_children(default_bus, qdev_walk_qxl, qbus_walk_all, &cur);
> +    return root;
> +}
> +
>  SpiceInfo *qmp_query_spice(Error **errp)
>  {
>      QemuOpts *opts = QTAILQ_FIRST(&qemu_spice_opts.head);
> @@ -461,6 +506,7 @@ SpiceInfo *qmp_query_spice(Error **errp)
>          info->has_tls_port = true;
>          info->tls_port = tls_port;
>      }
> +    info->qxl = qmp_query_qxl();
>  
>  #if SPICE_SERVER_VERSION >= 0x000a03 /* 0.10.3 */
>      info->mouse_mode = spice_server_is_server_mouse(spice_server) ?
> -- 
> 1.7.10.1
> 
>

Patch

diff --git a/hmp.c b/hmp.c
index bb0952e..5126921 100644
--- a/hmp.c
+++ b/hmp.c
@@ -331,6 +331,7 @@  void hmp_info_spice(Monitor *mon)
 {
     SpiceChannelList *chan;
     SpiceInfo *info;
+    QXLInfoList *qxl;
 
     info = qmp_query_spice(NULL);
 
@@ -353,6 +354,16 @@  void hmp_info_spice(Monitor *mon)
     monitor_printf(mon, "  mouse-mode: %s\n",
                    SpiceQueryMouseMode_lookup[info->mouse_mode]);
 
+    for (qxl = info->qxl; qxl; qxl = qxl->next) {
+        if (qxl->value->guest_bug == -1 || qxl->value->mode == -1) {
+            continue;
+        }
+        monitor_printf(mon, "qxl-%"PRId64":\n", qxl->value->id);
+        monitor_printf(mon, "        mode: %s\n",
+                SpiceQueryQXLMode_lookup[qxl->value->mode]);
+        monitor_printf(mon, "   guest_bug: %"PRIu64"\n", qxl->value->guest_bug);
+    }
+
     if (!info->has_channels || info->channels == NULL) {
         monitor_printf(mon, "Channels: none\n");
     } else {
diff --git a/hw/qxl.c b/hw/qxl.c
index 5a7be60..05ff176 100644
--- a/hw/qxl.c
+++ b/hw/qxl.c
@@ -1701,6 +1701,28 @@  static DisplayChangeListener display_listener = {
     .dpy_refresh = display_refresh,
 };
 
+/* helpers for spice_info */
+int qxl_get_guest_bug(DeviceState *dev)
+{
+    PCIQXLDevice *qxl = DO_UPCAST(PCIQXLDevice, pci.qdev, dev);
+
+    return qxl->guest_bug;
+}
+
+int qxl_get_mode(DeviceState *dev)
+{
+    PCIQXLDevice *qxl = DO_UPCAST(PCIQXLDevice, pci.qdev, dev);
+
+    return qxl->mode;
+}
+
+int qxl_get_id(DeviceState *dev)
+{
+    PCIQXLDevice *qxl = DO_UPCAST(PCIQXLDevice, pci.qdev, dev);
+
+    return qxl->id;
+}
+
 static void qxl_init_ramsize(PCIQXLDevice *qxl, uint32_t ram_min_mb)
 {
     /* vga ram (bar 0) */
diff --git a/qapi-schema.json b/qapi-schema.json
index 2ca7195..22a9034 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -638,7 +638,7 @@ 
 ##
 # @SpiceQueryMouseMode
 #
-# An enumation of Spice mouse states.
+# An enumeration of Spice mouse states.
 #
 # @client: Mouse cursor position is determined by the client.
 #
@@ -655,6 +655,44 @@ 
   'data': [ 'client', 'server', 'unknown' ] }
 
 ##
+# @SpiceQueryQXLMode
+#
+# An enumeration of QXL States.
+#
+# @undefined: guest driver in control but no primary device. Reached after a destroy primary IO
+#             from native mode.
+#
+# @vga: no device driver in control. default mode, returns to it after any vga port access.
+#
+# @compat: No information is available about mouse mode used by
+#           the spice server.
+#
+# @native: guest driver in control of device. Reached after a create primary IO.
+#
+# Note: hw/qxl.h has a qxl_mode enum, name chose to not confuse the two.
+#
+# Since: 1.1
+##
+{ 'enum': 'SpiceQueryQXLMode',
+  'data': [ 'undefined', 'vga', 'compat', 'native' ] }
+
+##
+# @QXLInfo
+#
+# Information about a QXL device.
+#
+# @id: qxl id, non negative integer, 0 for primary device.
+#
+# @guest_bug: Has a guest error been detected.
+#
+# @mode: Mode of device, based on guest activity.
+#
+# Since: 1.1
+##
+{ 'type': 'QXLInfo',
+  'data': {'id': 'int', 'guest_bug': 'int', 'mode': 'SpiceQueryQXLMode'} }
+
+##
 # @SpiceInfo
 #
 # Information about the SPICE session.
@@ -683,12 +721,15 @@ 
 #
 # @channels: a list of @SpiceChannel for each active spice channel
 #
+# @qxl: a list of @QXLInfo for each qxl device.
+#
 # Since: 0.14.0
 ##
 { 'type': 'SpiceInfo',
   'data': {'enabled': 'bool', '*host': 'str', '*port': 'int',
            '*tls-port': 'int', '*auth': 'str', '*compiled-version': 'str',
-           'mouse-mode': 'SpiceQueryMouseMode', '*channels': ['SpiceChannel']} }
+           'mouse-mode': 'SpiceQueryMouseMode', '*channels': ['SpiceChannel'],
+           'qxl': ['QXLInfo']} }
 
 ##
 # @query-spice
diff --git a/ui/qemu-spice.h b/ui/qemu-spice.h
index 3299da8..edcf3a5 100644
--- a/ui/qemu-spice.h
+++ b/ui/qemu-spice.h
@@ -47,6 +47,11 @@  void do_info_spice(Monitor *mon, QObject **ret_data);
 
 CharDriverState *qemu_chr_open_spice(QemuOpts *opts);
 
+/* implemented in hw/qxl.c */
+int qxl_get_guest_bug(DeviceState *dev);
+int qxl_get_mode(DeviceState *dev);
+int qxl_get_id(DeviceState *dev);
+
 #else  /* CONFIG_SPICE */
 #include "monitor.h"
 
diff --git a/ui/spice-core.c b/ui/spice-core.c
index 4fc48f8..25833e5 100644
--- a/ui/spice-core.c
+++ b/ui/spice-core.c
@@ -22,7 +22,6 @@ 
 #include "sysemu.h"
 
 #include "qemu-common.h"
-#include "qemu-spice.h"
 #include "qemu-thread.h"
 #include "qemu-timer.h"
 #include "qemu-queue.h"
@@ -37,6 +36,8 @@ 
 #include "migration.h"
 #include "monitor.h"
 #include "hw/hw.h"
+#include "hw/qdev.h"
+#include "qemu-spice.h"
 
 /* core bits */
 
@@ -419,6 +420,50 @@  static SpiceChannelList *qmp_query_spice_channels(void)
     return head;
 }
 
+static int qdev_walk_qxl(DeviceState *dev, void *opaque)
+{
+    QXLInfoList **cur = opaque;
+    QXLInfoList *qxl_info;
+    int first = 0;
+    const char *class_name = object_get_typename(OBJECT(dev));
+
+    if (strcmp(class_name, "qxl") != 0 &&
+        strcmp(class_name, "qxl-vga") != 0) {
+        return 0;
+    }
+    if ((*cur)->value == NULL) {
+        first = 1;
+        qxl_info = *cur;
+    } else {
+        qxl_info = g_malloc(sizeof(*qxl_info));
+    }
+    qxl_info->next = NULL;
+    qxl_info->value = g_malloc(sizeof(*qxl_info->value));
+    qxl_info->value->id = qxl_get_id(dev);
+    qxl_info->value->guest_bug = qxl_get_guest_bug(dev);
+    qxl_info->value->mode = qxl_get_mode(dev);
+    if (!first) {
+        (*cur)->next = qxl_info;
+        *cur = qxl_info;
+    }
+    return 0;
+}
+
+static int qbus_walk_all(BusState *bus, void *opaque)
+{
+    return 0;
+}
+
+static QXLInfoList *qmp_query_qxl(void)
+{
+    QXLInfoList *root = g_malloc0(sizeof(*root));
+    QXLInfoList *cur = root;
+    BusState *default_bus = sysbus_get_default();
+
+    qbus_walk_children(default_bus, qdev_walk_qxl, qbus_walk_all, &cur);
+    return root;
+}
+
 SpiceInfo *qmp_query_spice(Error **errp)
 {
     QemuOpts *opts = QTAILQ_FIRST(&qemu_spice_opts.head);
@@ -461,6 +506,7 @@  SpiceInfo *qmp_query_spice(Error **errp)
         info->has_tls_port = true;
         info->tls_port = tls_port;
     }
+    info->qxl = qmp_query_qxl();
 
 #if SPICE_SERVER_VERSION >= 0x000a03 /* 0.10.3 */
     info->mouse_mode = spice_server_is_server_mouse(spice_server) ?