[PATCH V2 2/3] conf: Add channel devices to domain capabilities

Jim Fehlig jfehlig at suse.com
Thu Oct 13 20:18:16 UTC 2022


On 10/13/22 09:46, Michal Prívozník wrote:
> On 10/13/22 01:24, Jim Fehlig wrote:
>> As qemu becomes more modularized, it is important for libvirt to advertise
>> availability of the modularized functionality through capabilities. This
>> change adds channel devices to domain capabilities, allowing clients such
>> as virt-install to avoid using spicevmc channel devices when not supported
>> by the target qemu.
>>
>> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
>> ---
>>   docs/formatdomaincaps.rst                     | 24 +++++++++++++++++++
>>   src/conf/domain_capabilities.c                | 13 ++++++++++
>>   src/conf/domain_capabilities.h                |  8 +++++++
>>   src/conf/schemas/domaincaps.rng               | 10 ++++++++
>>   src/qemu/qemu_capabilities.c                  | 16 +++++++++++++
>>   src/qemu/qemu_capabilities.h                  |  3 +++
>>   .../domaincapsdata/qemu_4.2.0-q35.x86_64.xml  |  7 ++++++
>>   .../domaincapsdata/qemu_4.2.0-tcg.x86_64.xml  |  7 ++++++
>>   .../qemu_4.2.0-virt.aarch64.xml               |  6 +++++
>>   tests/domaincapsdata/qemu_4.2.0.aarch64.xml   |  6 +++++
>>   tests/domaincapsdata/qemu_4.2.0.ppc64.xml     |  6 +++++
>>   tests/domaincapsdata/qemu_4.2.0.s390x.xml     |  6 +++++
>>   tests/domaincapsdata/qemu_4.2.0.x86_64.xml    |  7 ++++++
>>   .../domaincapsdata/qemu_5.0.0-q35.x86_64.xml  |  7 ++++++
>>   .../domaincapsdata/qemu_5.0.0-tcg.x86_64.xml  |  7 ++++++
>>   .../qemu_5.0.0-virt.aarch64.xml               |  6 +++++
>>   tests/domaincapsdata/qemu_5.0.0.aarch64.xml   |  6 +++++
>>   tests/domaincapsdata/qemu_5.0.0.ppc64.xml     |  6 +++++
>>   tests/domaincapsdata/qemu_5.0.0.x86_64.xml    |  7 ++++++
>>   .../domaincapsdata/qemu_5.1.0-q35.x86_64.xml  |  7 ++++++
>>   .../domaincapsdata/qemu_5.1.0-tcg.x86_64.xml  |  7 ++++++
>>   tests/domaincapsdata/qemu_5.1.0.sparc.xml     |  7 ++++++
>>   tests/domaincapsdata/qemu_5.1.0.x86_64.xml    |  7 ++++++
>>   .../domaincapsdata/qemu_5.2.0-q35.x86_64.xml  |  7 ++++++
>>   .../domaincapsdata/qemu_5.2.0-tcg.x86_64.xml  |  7 ++++++
>>   .../qemu_5.2.0-virt.aarch64.xml               |  6 +++++
>>   tests/domaincapsdata/qemu_5.2.0.aarch64.xml   |  6 +++++
>>   tests/domaincapsdata/qemu_5.2.0.ppc64.xml     |  6 +++++
>>   tests/domaincapsdata/qemu_5.2.0.s390x.xml     |  6 +++++
>>   tests/domaincapsdata/qemu_5.2.0.x86_64.xml    |  7 ++++++
>>   .../domaincapsdata/qemu_6.0.0-q35.x86_64.xml  |  7 ++++++
>>   .../domaincapsdata/qemu_6.0.0-tcg.x86_64.xml  |  7 ++++++
>>   .../qemu_6.0.0-virt.aarch64.xml               |  6 +++++
>>   tests/domaincapsdata/qemu_6.0.0.aarch64.xml   |  6 +++++
>>   tests/domaincapsdata/qemu_6.0.0.s390x.xml     |  6 +++++
>>   tests/domaincapsdata/qemu_6.0.0.x86_64.xml    |  7 ++++++
>>   .../domaincapsdata/qemu_6.1.0-q35.x86_64.xml  |  7 ++++++
>>   .../domaincapsdata/qemu_6.1.0-tcg.x86_64.xml  |  7 ++++++
>>   tests/domaincapsdata/qemu_6.1.0.x86_64.xml    |  7 ++++++
>>   .../domaincapsdata/qemu_6.2.0-q35.x86_64.xml  |  7 ++++++
>>   .../domaincapsdata/qemu_6.2.0-tcg.x86_64.xml  |  7 ++++++
>>   .../qemu_6.2.0-virt.aarch64.xml               |  7 ++++++
>>   tests/domaincapsdata/qemu_6.2.0.aarch64.xml   |  7 ++++++
>>   tests/domaincapsdata/qemu_6.2.0.ppc64.xml     |  6 +++++
>>   tests/domaincapsdata/qemu_6.2.0.x86_64.xml    |  7 ++++++
>>   .../domaincapsdata/qemu_7.0.0-q35.x86_64.xml  |  7 ++++++
>>   .../domaincapsdata/qemu_7.0.0-tcg.x86_64.xml  |  7 ++++++
>>   .../qemu_7.0.0-virt.aarch64.xml               |  7 ++++++
>>   tests/domaincapsdata/qemu_7.0.0.aarch64.xml   |  7 ++++++
>>   tests/domaincapsdata/qemu_7.0.0.ppc64.xml     |  6 +++++
>>   tests/domaincapsdata/qemu_7.0.0.x86_64.xml    |  7 ++++++
>>   .../domaincapsdata/qemu_7.1.0-q35.x86_64.xml  |  7 ++++++
>>   .../domaincapsdata/qemu_7.1.0-tcg.x86_64.xml  |  7 ++++++
>>   tests/domaincapsdata/qemu_7.1.0.x86_64.xml    |  7 ++++++
>>   .../caps_4.2.0.x86_64.xml                     |  1 +
>>   .../caps_5.0.0.riscv64.xml                    |  1 +
>>   .../caps_5.0.0.x86_64.xml                     |  1 +
>>   .../qemucapabilitiesdata/caps_5.1.0.sparc.xml |  1 +
>>   .../caps_5.1.0.x86_64.xml                     |  1 +
>>   .../caps_5.2.0.riscv64.xml                    |  1 +
>>   .../caps_5.2.0.x86_64.xml                     |  1 +
>>   .../caps_6.0.0.x86_64.xml                     |  1 +
>>   .../caps_6.1.0.x86_64.xml                     |  1 +
>>   .../caps_6.2.0.aarch64.xml                    |  1 +
>>   .../caps_6.2.0.x86_64.xml                     |  1 +
>>   .../caps_7.0.0.aarch64.xml                    |  1 +
>>   .../caps_7.0.0.x86_64.xml                     |  1 +
>>   .../caps_7.1.0.x86_64.xml                     |  1 +
>>   68 files changed, 408 insertions(+)
>>
>> diff --git a/docs/formatdomaincaps.rst b/docs/formatdomaincaps.rst
>> index 93d36f2702..f95d3a7083 100644
>> --- a/docs/formatdomaincaps.rst
>> +++ b/docs/formatdomaincaps.rst
>> @@ -565,6 +565,30 @@ USB redirdev device capabilities are exposed under the ``redirdev`` element. For
>>   ``bus``
>>      Options for the ``bus`` attribute of the ``<redirdev/>`` element.
>>   
>> +Channel device
>> +^^^^^^^^^^^^^^
>> +
>> +Channel device capabilities are exposed under the ``channel`` element. For instance:
>> +
>> +::
>> +
>> +  <domainCapabilities>
>> +    ...
>> +    <devices>
>> +      <channel supported='yes'>
>> +        <enum name='type'>
>> +          <value>pty</value>
>> +          <value>unix</value>
>> +          <value>spicevmc</value>
>> +        </enum>
>> +      </channel
>> +      ...
>> +    </devices>
>> +  </domainCapabilities>
>> +
>> +``type``
>> +   Options for the ``type`` attribute of the ``<channel/>`` element.
>> +
>>   Features
>>   ~~~~~~~~
>>   
>> diff --git a/src/conf/domain_capabilities.c b/src/conf/domain_capabilities.c
>> index f8b2f88376..a7f256e4ec 100644
>> --- a/src/conf/domain_capabilities.c
>> +++ b/src/conf/domain_capabilities.c
>> @@ -574,6 +574,18 @@ virDomainCapsDeviceRedirdevFormat(virBuffer *buf,
>>   }
>>   
>>   
>> +static void
>> +virDomainCapsDeviceChannelFormat(virBuffer *buf,
>> +                                 const virDomainCapsDeviceChannel *channel)
>> +{
>> +    FORMAT_PROLOGUE(channel);
>> +
>> +    ENUM_PROCESS(channel, type, virDomainChrTypeToString);
>> +
>> +    FORMAT_EPILOGUE(channel);
>> +}
>> +
>> +
>>   /**
>>    * virDomainCapsFeatureGICFormat:
>>    * @buf: target buffer
>> @@ -688,6 +700,7 @@ virDomainCapsFormat(const virDomainCaps *caps)
>>       virDomainCapsDeviceFilesystemFormat(&buf, &caps->filesystem);
>>       virDomainCapsDeviceTPMFormat(&buf, &caps->tpm);
>>       virDomainCapsDeviceRedirdevFormat(&buf, &caps->redirdev);
>> +    virDomainCapsDeviceChannelFormat(&buf, &caps->channel);
>>   
>>       virBufferAdjustIndent(&buf, -2);
>>       virBufferAddLit(&buf, "</devices>\n");
>> diff --git a/src/conf/domain_capabilities.h b/src/conf/domain_capabilities.h
>> index ba7c2a5e42..e0cfa75531 100644
>> --- a/src/conf/domain_capabilities.h
>> +++ b/src/conf/domain_capabilities.h
>> @@ -137,6 +137,13 @@ struct _virDomainCapsDeviceRedirdev {
>>       virDomainCapsEnum bus;   /* virDomainRedirdevBus */
>>   };
>>   
>> +STATIC_ASSERT_ENUM(VIR_DOMAIN_CHR_TYPE_LAST);
>> +typedef struct _virDomainCapsDeviceChannel virDomainCapsDeviceChannel;
>> +struct _virDomainCapsDeviceChannel {
>> +    virTristateBool supported;
>> +    virDomainCapsEnum type;   /* virDomainChrType */
>> +};
>> +
>>   STATIC_ASSERT_ENUM(VIR_DOMAIN_FS_DRIVER_TYPE_LAST);
>>   typedef struct _virDomainCapsDeviceFilesystem virDomainCapsDeviceFilesystem;
>>   struct _virDomainCapsDeviceFilesystem {
>> @@ -234,6 +241,7 @@ struct _virDomainCaps {
>>       virDomainCapsDeviceFilesystem filesystem;
>>       virDomainCapsDeviceTPM tpm;
>>       virDomainCapsDeviceRedirdev redirdev;
>> +    virDomainCapsDeviceChannel channel;
>>       /* add new domain devices here */
>>   
>>       virDomainCapsFeatureGIC gic;
>> diff --git a/src/conf/schemas/domaincaps.rng b/src/conf/schemas/domaincaps.rng
>> index cf7a1d1d89..a6747b20ef 100644
>> --- a/src/conf/schemas/domaincaps.rng
>> +++ b/src/conf/schemas/domaincaps.rng
>> @@ -201,6 +201,9 @@
>>         <optional>
>>           <ref name="redirdev"/>
>>         </optional>
>> +      <optional>
>> +        <ref name="channel"/>
>> +      </optional>
>>       </element>
>>     </define>
>>   
>> @@ -260,6 +263,13 @@
>>       </element>
>>     </define>
>>   
>> +  <define name="channel">
>> +    <element name="channel">
>> +      <ref name="supported"/>
>> +      <ref name="enum"/>
>> +    </element>
>> +  </define>
>> +
>>     <define name="features">
>>       <element name="features">
>>         <optional>
>> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
>> index 5a664ec628..98849daf4c 100644
>> --- a/src/qemu/qemu_capabilities.c
>> +++ b/src/qemu/qemu_capabilities.c
>> @@ -1392,6 +1392,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
>>       { "s390-pv-guest", QEMU_CAPS_S390_PV_GUEST },
>>       { "virtio-mem-pci", QEMU_CAPS_DEVICE_VIRTIO_MEM_PCI },
>>       { "virtio-iommu-pci", QEMU_CAPS_DEVICE_VIRTIO_IOMMU_PCI },
>> +    { "chardev-spicevmc", X_QEMU_CAPS_CHARDEV_SPICEVMC },
> 
> The X_ prefix means that the capability was retired beause we are sure
> QEMU has it, always. Or another capability reflects the same. In this
> specific case I'd say QEMU_CAPS_SPICE is sufficient.

If you mean s/X_QEMU_CAPS_CHARDEV_SPICEVMC/QEMU_CAPS_SPICE/, it doesn't work. 
'spicevmc' is not shown as a supported channel type in domcapabilities. I 
thought it was safe to use the X_ variant since it is already included in CapsFlags

https://gitlab.com/libvirt/libvirt/-/blob/master/src/qemu/qemu_capabilities.h#L121

Regards,
Jim



More information about the libvir-list mailing list