[libvirt] [PATCH 3/7] qemu: check iotune params same for all disk in group

Daniel P. Berrangé berrange at redhat.com
Tue Jan 28 14:14:40 UTC 2020


On Wed, Jan 08, 2020 at 09:49:27AM +0300, Nikolay Shirokovskiy wrote:
> Currently it is possible to start a domain which have disks
> in same iotune group and at the same time having different iotune
> params. Both params set are passed to qemu in command line and the one
> that is passed later down command line is get actually set.
> Let's prohibit such configurations.
> 
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---
>  src/conf/domain_conf.c   | 29 ++++++++++++++++++++++++++++
>  src/conf/domain_conf.h   |  4 ++++
>  src/libvirt_private.syms |  1 +
>  src/qemu/qemu_command.c  | 41 +++++++++++++++++++++++++++++++++-------
>  src/qemu/qemu_command.h  |  3 +++
>  src/qemu/qemu_driver.c   |  2 +-
>  src/qemu/qemu_hotplug.c  |  2 +-
>  tests/qemublocktest.c    |  2 +-
>  8 files changed, 74 insertions(+), 10 deletions(-)
> 

> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 29928ac1c8..94a49b7e4f 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -1156,6 +1156,7 @@ qemuDiskConfigBlkdeviotuneEnabled(virDomainDiskDefPtr disk)
>   */
>  static int
>  qemuCheckDiskConfigBlkdeviotune(virDomainDiskDefPtr disk,
> +                                const virDomainDef *def,
>                                  virQEMUCapsPtr qemuCaps)
>  {
>      /* group_name by itself is ignored by qemu */
> @@ -1167,6 +1168,27 @@ qemuCheckDiskConfigBlkdeviotune(virDomainDiskDefPtr disk,
>          return -1;
>      }
>  
> +    /* checking def here is only for calling from tests */
> +    if (disk->blkdeviotune.group_name && def) {

I'm not a fan of special casing for the test suite

> +        size_t i;
> +
> +        for (i = 0; i < def->ndisks; i++) {
> +            virDomainDiskDefPtr d = def->disks[i];
> +
> +            if (!d->blkdeviotune.group_name ||
> +                STRNEQ(disk->blkdeviotune.group_name, d->blkdeviotune.group_name))
> +                continue;
> +
> +            if (!virDomainBlockIoTuneInfoEqual(&disk->blkdeviotune,
> +                                              &d->blkdeviotune)) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                               _("different iotunes for disks %s and %s"),
> +                               disk->dst, d->dst);
> +                return -1;
> +            }
> +        }
> +    }
> +
>      if (disk->blkdeviotune.total_bytes_sec > QEMU_BLOCK_IOTUNE_MAX ||
>          disk->blkdeviotune.read_bytes_sec > QEMU_BLOCK_IOTUNE_MAX ||
>          disk->blkdeviotune.write_bytes_sec > QEMU_BLOCK_IOTUNE_MAX ||

> diff --git a/tests/qemublocktest.c b/tests/qemublocktest.c
> index 3e9edb85f0..670e5bfab1 100644
> --- a/tests/qemublocktest.c
> +++ b/tests/qemublocktest.c
> @@ -204,7 +204,7 @@ testQemuDiskXMLToProps(const void *opaque)
>                                         VIR_DOMAIN_DEF_PARSE_STATUS)))
>          goto cleanup;
>  
> -    if (qemuCheckDiskConfig(disk, data->qemuCaps) < 0 ||
> +    if (qemuCheckDiskConfig(disk, NULL, data->qemuCaps) < 0 ||

Passing invalid parameters to an API, only in the test suite, has tended
to cause pain for us in the long term.

Can we create a valid virDomainDef to pass in - it doens't have to
contain a full VM really - just enough functionality to satisify the
method

>          qemuDomainDeviceDefValidateDisk(disk, data->qemuCaps) < 0) {
>          VIR_TEST_VERBOSE("invalid configuration for disk");
>          goto cleanup;

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list