[libvirt] [Spice-devel] [RFC PATCH] qemu: Use heads parameter for QXL driver

Christophe Fergeau cfergeau at redhat.com
Thu Jun 11 14:26:39 UTC 2015


Hey,

On Thu, Jun 11, 2015 at 12:39:50PM +0100, Frediano Ziglio wrote:
> Allow to specify maximum number of head to QXL driver.

I've tested this with an older qemu without qxl-vga.max_outputs, and
with a newer one with support for it, and in both cases this is doing
the right thing.

> 
> Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> ---
>  src/qemu/qemu_capabilities.c                     |  2 ++
>  src/qemu/qemu_capabilities.h                     |  1 +
>  src/qemu/qemu_command.c                          | 11 +++++++++++
>  tests/qemucapabilitiesdata/caps_1.2.2-1.caps     |  1 +
>  tests/qemucapabilitiesdata/caps_1.2.2-1.replies  |  8 ++++++++
>  tests/qemucapabilitiesdata/caps_1.3.1-1.caps     |  1 +
>  tests/qemucapabilitiesdata/caps_1.3.1-1.replies  |  8 ++++++++
>  tests/qemucapabilitiesdata/caps_1.4.2-1.caps     |  1 +
>  tests/qemucapabilitiesdata/caps_1.4.2-1.replies  |  8 ++++++++
>  tests/qemucapabilitiesdata/caps_1.5.3-1.caps     |  1 +
>  tests/qemucapabilitiesdata/caps_1.5.3-1.replies  |  8 ++++++++
>  tests/qemucapabilitiesdata/caps_1.6.0-1.caps     |  1 +
>  tests/qemucapabilitiesdata/caps_1.6.0-1.replies  |  8 ++++++++
>  tests/qemucapabilitiesdata/caps_1.6.50-1.caps    |  1 +
>  tests/qemucapabilitiesdata/caps_1.6.50-1.replies |  8 ++++++++
>  tests/qemucapabilitiesdata/caps_2.1.1-1.caps     |  1 +
>  tests/qemucapabilitiesdata/caps_2.1.1-1.replies  |  8 ++++++++
>  17 files changed, 77 insertions(+)
> 
> The patch to support the "max_outputs" in Qemu is still not merged but
> I got agreement on the name of the argument.
> 
> Actually can be a compatiblity problem as heads in the XML configuration
> was set by default to '1'.
> 
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index ca7a7c2..cdc2575 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -285,6 +285,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
>                "dea-key-wrap",
>                "pci-serial",
>                "aarch64-off",
> +              "qxl-vga.max_outputs",
>      );


In order to be consistent with the rest of the file, this should be

+
+              "qxl-vga.max_outputs", /* 190 */
 

>  
>  
> @@ -1643,6 +1644,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsQxl[] = {
>  
>  static struct virQEMUCapsStringFlags virQEMUCapsObjectPropsQxlVga[] = {
>      { "vgamem_mb", QEMU_CAPS_QXL_VGA_VGAMEM },
> +    { "max_outputs", QEMU_CAPS_QXL_VGA_MAX_OUTPUTS },
>  };
>  
>  struct virQEMUCapsObjectTypeProps {
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index b5a7770..a2ea84b 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -229,6 +229,7 @@ typedef enum {
>      QEMU_CAPS_DEA_KEY_WRAP       = 187, /* -machine dea_key_wrap */
>      QEMU_CAPS_DEVICE_PCI_SERIAL  = 188, /* -device pci-serial */
>      QEMU_CAPS_CPU_AARCH64_OFF    = 189, /* -cpu ...,aarch64=off */
> +    QEMU_CAPS_QXL_VGA_MAX_OUTPUTS = 190, /* qxl-vga.max_outputs */
>  
>      QEMU_CAPS_LAST,                   /* this must always be the last item */
>  } virQEMUCapsFlags;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 0a6d92f..2bd63e1 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -5610,6 +5610,11 @@ qemuBuildDeviceVideoStr(virDomainDefPtr def,
>              /* QEMU accepts mebibytes for vgamem_mb. */
>              virBufferAsprintf(&buf, ",vgamem_mb=%u", video->vgamem / 1024);
>          }
> +
> +        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QXL_VGA_MAX_OUTPUTS) &&
> +            video->heads > 0) {
> +            virBufferAsprintf(&buf, ",max_outputs=%u", video->heads);
> +        }
>      } else if (video->vram &&
>          ((video->type == VIR_DOMAIN_VIDEO_TYPE_VGA &&
>            virQEMUCapsGet(qemuCaps, QEMU_CAPS_VGA_VGAMEM)) ||
> @@ -10234,6 +10239,7 @@ qemuBuildCommandLine(virConnectPtr conn,
>                      unsigned int ram = def->videos[0]->ram;
>                      unsigned int vram = def->videos[0]->vram;
>                      unsigned int vgamem = def->videos[0]->vgamem;
> +                    unsigned int heads = def->videos[0]->heads;
>  
>                      if (vram > (UINT_MAX / 1024)) {
>                          virReportError(VIR_ERR_OVERFLOW,
> @@ -10264,6 +10270,11 @@ qemuBuildCommandLine(virConnectPtr conn,
>                          virCommandAddArgFormat(cmd, "%s.vgamem_mb=%u",
>                                                 dev, vgamem / 1024);
>                      }
> +                    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QXL_VGA_MAX_OUTPUTS) && heads > 0) {
> +                        virCommandAddArg(cmd, "-global");
> +                        virCommandAddArgFormat(cmd, "%s.max_outputs=%u",
> +                                               dev, heads);
> +                    }

This part of the code is a fallback for QEMU not supporting -device. As
the max_outputs option is new, I'm not sure this will ever be triggered.

>                  }
>  
>                  if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE) &&
> diff --git a/tests/qemucapabilitiesdata/caps_1.2.2-1.caps b/tests/qemucapabilitiesdata/caps_1.2.2-1.caps
> index 30239df..7791e42 100644
> --- a/tests/qemucapabilitiesdata/caps_1.2.2-1.caps
> +++ b/tests/qemucapabilitiesdata/caps_1.2.2-1.caps
> @@ -120,4 +120,5 @@
>      <flag name='vmware-svga.vgamem_mb'/>
>      <flag name='qxl.vgamem_mb'/>
>      <flag name='qxl-vga.vgamem_mb'/>
> +    <flag name='qxl-vga.max_outputs'/>
>    </qemuCaps>
> diff --git a/tests/qemucapabilitiesdata/caps_1.2.2-1.replies b/tests/qemucapabilitiesdata/caps_1.2.2-1.replies
> index f501218..aa1d3f9 100644
> --- a/tests/qemucapabilitiesdata/caps_1.2.2-1.replies
> +++ b/tests/qemucapabilitiesdata/caps_1.2.2-1.replies
> @@ -1488,6 +1488,10 @@
>              "type": "pci-devfn"
>          },
>          {
> +            "name": "max_outputs",
> +            "type": "uint16"
> +        },
> +        {
>              "name": "vgamem_mb",
>              "type": "uint32"
>          },
> @@ -1554,6 +1558,10 @@
>              "type": "pci-devfn"
>          },
>          {
> +            "name": "max_outputs",
> +            "type": "uint16"
> +        },
> +        {
>              "name": "vgamem_mb",
>              "type": "uint32"
>          },

I have no idea how all these tests work, so I have only took a quick
look, and checked that make check still passes. I find it odd to have
qxl-vga.max_outputs be listed for older qemu releases, but maybe this is
how it's meant to be done.

All in all, looks good to me.

Christophe
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150611/83af2ebb/attachment-0001.sig>


More information about the libvir-list mailing list