[libvirt] [PATCH v2 5/5] RFC qemu: add spice opengl support

Marc-André Lureau marcandre.lureau at gmail.com
Thu Feb 18 16:17:18 UTC 2016


Hi

On Fri, Nov 27, 2015 at 2:10 PM, Michal Privoznik <mprivozn at redhat.com> wrote:
> On 25.11.2015 09:42, Marc-André Lureau wrote:
>> Add Spice graphics gl attribute. qemu 2.6 should have -spice gl=on
>> argument to enable opengl rendering context. This is necessary
>> to actually enable virgl rendering.
>>
>> Add a qemuxml2argv test for virtio-gpu + spice with virgl.
>>
>> Signed-off-by: Marc-André Lureau <marcandre.lureau at gmail.com>
>> ---
>>  docs/formatdomain.html.in                          |  6 ++++
>>  docs/schemas/domaincommon.rng                      |  5 +++
>>  src/conf/domain_conf.c                             | 18 +++++++++++
>>  src/conf/domain_conf.h                             |  1 +
>>  src/qemu/qemu_capabilities.c                       |  2 ++
>>  src/qemu/qemu_capabilities.h                       |  1 +
>>  src/qemu/qemu_command.c                            | 11 +++++++
>>  tests/qemucapabilitiesdata/caps_2.5.0-1.caps       |  1 +
>>  tests/qemucapabilitiesdata/caps_2.5.0-1.replies    |  4 +++
>>  .../qemuxml2argv-video-virtio-gpu-spice-gl.args    | 23 ++++++++++++++
>>  .../qemuxml2argv-video-virtio-gpu-spice-gl.xml     | 36 ++++++++++++++++++++++
>>  tests/qemuxml2argvtest.c                           |  6 ++++
>>  tests/qemuxml2xmltest.c                            |  1 +
>>  13 files changed, 115 insertions(+)
>>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args
>>  create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.xml
>>
>
> The idea looks good. ACK to it. However, some changes in the code are
> required IMO.

I am fixing it and sending a new non-rfc patch.

>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index 23d8ac9..d39f7d0 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -4979,6 +4979,12 @@ qemu-kvm -net nic,model=? /dev/null
>>                0.8.8</span>); and <code>usbredir</code>
>>                (<span class="since">since 0.9.12</span>).
>>              </p>
>> +            <p>
>> +              Spice may provide accelerated server-side rendering with
>> +              OpenGL. You can enable or disable OpenGL support explicitly with
>> +              the <code>gl</code> attribute.
>> +              (<span class="since">since FIXME</span>).
>> +            </p>
>>              <pre>
>>    <graphics type='spice' port='-1' tlsPort='-1' autoport='yes'>
>>      <channel name='main' mode='secure'/>
>> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
>> index 228f062..8f4d2ac 100644
>> --- a/docs/schemas/domaincommon.rng
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -2711,6 +2711,11 @@
>>                </choice>
>>              </attribute>
>>            </optional>
>> +          <optional>
>> +            <attribute name="gl">
>> +              <ref name="virYesNo"/>
>> +            </attribute>
>> +          </optional>
>>            <interleave>
>>              <ref name="listenElements"/>
>>              <zeroOrMore>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index e1692ef..d738e71 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -10918,6 +10918,7 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
>>          char *port = virXMLPropString(node, "port");
>>          char *tlsPort;
>>          char *autoport;
>> +        char *gl;
>>          char *defaultMode;
>>          int defaultModeVal;
>>
>> @@ -10952,6 +10953,19 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
>>              VIR_FREE(autoport);
>>          }
>>
>> +        if ((gl = virXMLPropString(node, "gl")) != NULL) {
>> +            int glVal;
>> +
>> +            if ((glVal = virTristateBoolTypeFromString(gl)) <= 0) {
>> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> +                               _("unknown gl value '%s'"), gl);
>> +                goto error;
>
> @gl is leaked here.

fixed

>> +            }
>> +
>> +            def->data.spice.gl = glVal;
>> +            VIR_FREE(gl);
>> +        }
>> +
>>          def->data.spice.defaultMode = VIR_DOMAIN_GRAPHICS_SPICE_CHANNEL_MODE_ANY;
>>
>>          if ((defaultMode = virXMLPropString(node, "defaultMode")) != NULL) {
>> @@ -21201,6 +21215,10 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
>>          break;
>>
>>      case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
>> +        if (def->data.spice.gl)
>> +            virBufferAsprintf(buf, " gl='%s'",
>> +                              virTristateBoolTypeToString(def->data.spice.gl));
>> +
>>          if (def->data.spice.port)
>>              virBufferAsprintf(buf, " port='%d'",
>>                                def->data.spice.port);
>> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
>> index a47d8ee..ccd9376 100644
>> --- a/src/conf/domain_conf.h
>> +++ b/src/conf/domain_conf.h
>> @@ -1579,6 +1579,7 @@ struct _virDomainGraphicsDef {
>>              int streaming;
>>              int copypaste; /* enum virTristateBool */
>>              int filetransfer; /* enum virTristateBool */
>> +            int gl; /* enum virTristateBool */
>>          } spice;
>>      } data;
>>      /* nListens, listens, and *port are only useful if type is vnc,
>> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
>> index 4d76c40..64804c8 100644
>> --- a/src/qemu/qemu_capabilities.c
>> +++ b/src/qemu/qemu_capabilities.c
>> @@ -303,6 +303,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
>>                "incoming-defer", /* 200 */
>>                "virtio-gpu",
>>                "virtio-gpu.virgl",
>> +              "spice-gl",
>>      );
>>
>>
>> @@ -2587,6 +2588,7 @@ static struct virQEMUCapsCommandLineProps virQEMUCapsCommandLine[] = {
>>      { "drive", "throttling.bps-total-max", QEMU_CAPS_DRIVE_IOTUNE_MAX},
>>      { "machine", "aes-key-wrap", QEMU_CAPS_AES_KEY_WRAP },
>>      { "machine", "dea-key-wrap", QEMU_CAPS_DEA_KEY_WRAP },
>> +    { "spice", "gl", QEMU_CAPS_SPICE_GL },
>>  };
>>
>>  static int
>> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
>> index ab711ff..ecd61d2 100644
>> --- a/src/qemu/qemu_capabilities.h
>> +++ b/src/qemu/qemu_capabilities.h
>> @@ -329,6 +329,7 @@ typedef enum {
>>      QEMU_CAPS_INCOMING_DEFER, /* -incoming defer and migrate_incoming */
>>      QEMU_CAPS_DEVICE_VIRTIO_GPU, /* -device virtio-gpu-* & virtio-vga */
>>      QEMU_CAPS_DEVICE_VIRTIO_GPU_VIRGL, /* -device virtio-gpu-*.virgl */
>> +    QEMU_CAPS_SPICE_GL, /* -spice gl */
>>
>>      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 2808960..5f6a8fe 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -8447,6 +8447,17 @@ qemuBuildGraphicsSPICECommandLine(virQEMUDriverConfigPtr cfg,
>>          }
>>      }
>>
>> +    if (graphics->data.spice.gl) {
>> +        if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SPICE_GL)) {
>> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                           _("This QEMU doesn't support spice OpenGL"));
>> +            goto error;
>> +        } else {
>> +            virBufferAsprintf(&opt, ",gl=%s",
>> +                              virTristateSwitchTypeToString(graphics->data.spice.gl));
>> +        }
>
> 'else' feels kind of redundant but I don't hesitate to leave it there.

ok, dropped

>
>> +    }
>> +
>>      if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_SEAMLESS_MIGRATION)) {
>>          /* If qemu supports seamless migration turn it
>>           * unconditionally on. If migration destination
>> diff --git a/tests/qemucapabilitiesdata/caps_2.5.0-1.caps b/tests/qemucapabilitiesdata/caps_2.5.0-1.caps
>> index 975ed0c..1d6b5aa 100644
>> --- a/tests/qemucapabilitiesdata/caps_2.5.0-1.caps
>> +++ b/tests/qemucapabilitiesdata/caps_2.5.0-1.caps
>> @@ -164,4 +164,5 @@
>>      <flag name='incoming-defer'/>
>>      <flag name='virtio-gpu'/>
>>      <flag name='virtio-gpu.virgl'/>
>> +    <flag name='spice-gl'/>
>>    </qemuCaps>
>> diff --git a/tests/qemucapabilitiesdata/caps_2.5.0-1.replies b/tests/qemucapabilitiesdata/caps_2.5.0-1.replies
>> index d90a74b..5452c0f 100644
>> --- a/tests/qemucapabilitiesdata/caps_2.5.0-1.replies
>> +++ b/tests/qemucapabilitiesdata/caps_2.5.0-1.replies
>> @@ -3120,6 +3120,10 @@
>>      {
>>        "parameters": [
>>          {
>> +          "name": "gl",
>> +          "type": "boolean"
>> +        },
>> +        {
>>            "name": "seamless-migration",
>>            "type": "boolean"
>>          },
>> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args
>> new file mode 100644
>> index 0000000..9751ee3
>> --- /dev/null
>> +++ b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.args
>> @@ -0,0 +1,23 @@
>> +LC_ALL=C \
>> +PATH=/bin \
>> +HOME=/home/test \
>> +USER=test \
>> +LOGNAME=test \
>> +QEMU_AUDIO_DRV=spice \
>> +/usr/bin/qemu \
>> +-name QEMUGuest1 \
>> +-S \
>> +-M pc \
>> +-m 1024 \
>> +-smp 1 \
>> +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
>> +-nodefaults \
>> +-monitor unix:/tmp/test-monitor,server,nowait \
>> +-no-acpi \
>> +-boot c \
>> +-usb \
>> +-drive file=/var/lib/libvirt/images/QEMUGuest1,if=none,id=drive-ide0-0-0,format=qcow2,cache=none \
>
> Long line.
>

fixed

>> +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \
>> +-spice port=0,gl=on \
>> +-device virtio-vga,id=video0,virgl=on,bus=pci.0,addr=0x2 \
>> +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
>> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.xml b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.xml
>> new file mode 100644
>> index 0000000..07afad2
>> --- /dev/null
>> +++ b/tests/qemuxml2argvdata/qemuxml2argv-video-virtio-gpu-spice-gl.xml
>> @@ -0,0 +1,36 @@
>> +<domain type='qemu'>
>> +  <name>QEMUGuest1</name>
>> +  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
>> +  <memory unit='KiB'>1048576</memory>
>> +  <currentMemory unit='KiB'>1048576</currentMemory>
>> +  <vcpu placement='static'>1</vcpu>
>> +  <os>
>> +    <type arch='i686' machine='pc'>hvm</type>
>> +    <boot dev='hd'/>
>> +  </os>
>> +  <clock offset='utc'/>
>> +  <on_poweroff>destroy</on_poweroff>
>> +  <on_reboot>restart</on_reboot>
>> +  <on_crash>destroy</on_crash>
>> +  <devices>
>> +    <emulator>/usr/bin/qemu</emulator>
>> +    <disk type='file' device='disk'>
>> +      <driver name='qemu' type='qcow2' cache='none'/>
>> +      <source file='/var/lib/libvirt/images/QEMUGuest1'/>
>> +      <target dev='hda' bus='ide'/>
>> +      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
>> +    </disk>
>> +    <controller type='ide' index='0'/>
>> +    <controller type='usb' index='0'/>
>> +    <controller type='pci' index='0' model='pci-root'/>
>> +    <input type='mouse' bus='ps2'/>
>> +    <input type='keyboard' bus='ps2'/>
>> +    <graphics type='spice' gl='yes' autoport='no'/>
>> +    <video>
>> +      <model type='virtio' heads='1'>
>> +        <acceleration accel3d='yes'/>
>> +      </model>
>> +    </video>
>> +    <memballoon model='virtio'/>
>> +  </devices>
>> +</domain>
>> diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
>> index 4baadb7..060c646 100644
>> --- a/tests/qemuxml2argvtest.c
>> +++ b/tests/qemuxml2argvtest.c
>> @@ -1755,6 +1755,12 @@ mymain(void)
>>              QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_VIRTIO_GPU,
>>              QEMU_CAPS_DEVICE_VIRTIO_GPU_VIRGL,
>>              QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
>> +    DO_TEST("video-virtio-gpu-spice-gl", QEMU_CAPS_DEVICE,
>> +            QEMU_CAPS_DEVICE_VIRTIO_GPU,
>> +            QEMU_CAPS_DEVICE_VIRTIO_GPU_VIRGL,
>> +            QEMU_CAPS_SPICE,
>> +            QEMU_CAPS_SPICE_GL,
>> +            QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
>
> Move this few lines up.

where to?

>
>>
>>      qemuTestDriverFree(&driver);
>>
>> diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
>> index a4fefef..23cc549 100644
>> --- a/tests/qemuxml2xmltest.c
>> +++ b/tests/qemuxml2xmltest.c
>> @@ -628,6 +628,7 @@ mymain(void)
>>
>>      DO_TEST("video-virtio-gpu-device");
>>      DO_TEST("video-virtio-gpu-virgl");
>> +    DO_TEST("video-virtio-gpu-spice-gl");
>>
>>      qemuTestDriverFree(&driver);
>>
>>
>
> Michal

thanks

-- 
Marc-André Lureau




More information about the libvir-list mailing list