[libvirt] [PATCH v2 7/8] qemu: Implement VIR_DOMAIN_MIGRATE_MAX_SPEED_POSTCOPY flag

John Ferlan jferlan at redhat.com
Sat Feb 9 12:45:58 UTC 2019



On 2/7/19 10:11 AM, Jiri Denemark wrote:
> This flag tells virDomainMigrateSetMaxSpeed and
> virDomainMigrateGetMaxSpeed APIs to work on post-copy migration
> bandwidth.
> 
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
> 
> Notes:
>     Version 2:
>     - if (postcopy) branch from qemuDomainMigrateGetMaxSpeed separated
>       into a helper function

[...]

> +
> +static int
> +qemuDomainMigrationGetPostcopyBandwidth(virQEMUDriverPtr driver,
> +                                        virDomainObjPtr vm,
> +                                        unsigned long *bandwidth)
> +{
> +    VIR_AUTOPTR(qemuMigrationParams) migParams = NULL;
> +    unsigned long long bw;
> +    int rc;
> +    int ret = -1;
> +
> +    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
> +        return -1;
> +
> +    if (virDomainObjCheckActive(vm) < 0)
> +        goto cleanup;
> +
> +    if (qemuMigrationParamsFetch(driver, vm, QEMU_ASYNC_JOB_NONE,
> +                                 &migParams) < 0)
> +        goto cleanup;
> +
> +    if ((rc = qemuMigrationParamsGetULL(migParams,
> +                                        QEMU_MIGRATION_PARAM_MAX_POSTCOPY_BANDWIDTH,
> +                                        &bw)) < 0)
> +        goto cleanup;
> +
> +    if (rc == 1) {
> +        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +                       _("querying maximum post-copy migration speed is "
> +                         "not supported by QEMU binary"));
> +        goto cleanup;
> +    }
> +
> +    /* QEMU reports B/s while we use MiB/s */
> +    bw /= 1024 * 1024;
> +
> +    if (bw > ULONG_MAX) {

FWIW: Coverity generates a complaint here:

1) Event result_independent_of_operands:	"bw > 18446744073709551615ULL
/* 9223372036854775807L * 2UL + 1UL */" is always false regardless of
the values of its operands. This occurs as the logical operand of "if".

John

> +        virReportError(VIR_ERR_OVERFLOW,
> +                       _("bandwidth %llu is greater than %lu which is the "
> +                         "maximum value supported by this API"),
> +                       bw, ULONG_MAX);
> +        goto cleanup;
> +    }
> +
> +    *bandwidth = bw;
> +    ret = 0;
> +
> + cleanup:
> +    qemuDomainObjEndJob(driver, vm);
> +    return ret;
> +}
> +
> +

[...]




More information about the libvir-list mailing list