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

Michal Prívozník mprivozn at redhat.com
Thu Oct 13 15:46:20 UTC 2022


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.

>  };
>  

Michal



More information about the libvir-list mailing list