[libvirt] [PATCH 05/12] vcpu: implement the public APIs

Daniel Veillard veillard at redhat.com
Fri Oct 1 14:33:15 UTC 2010


On Wed, Sep 29, 2010 at 06:02:09PM -0600, Eric Blake wrote:
> * src/libvirt.c (virDomainSetVcpusFlags, virDomainGetVcpusFlags):
> New functions.
> ---
> 
> Pretty mechanical.
> 
>  src/libvirt.c |  125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 files changed, 122 insertions(+), 3 deletions(-)
> 
> diff --git a/src/libvirt.c b/src/libvirt.c
> index ca383ba..3a29d70 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -5111,13 +5111,132 @@ error:
>  }
> 
>  /**
> + * virDomainSetVcpusFlags:
> + * @domain: pointer to domain object, or NULL for Domain0
> + * @nvcpus: the new number of virtual CPUs for this domain, must be at least 1
> + * @flags: an OR'ed set of virDomainVcpuFlags
> + *
> + * Dynamically change the number of virtual CPUs used by the domain.
> + * Note that this call may fail if the underlying virtualization hypervisor
> + * does not support it or if growing the number is arbitrary limited.
> + * This function requires privileged access to the hypervisor.
> + *
> + * @flags must include VIR_DOMAIN_VCPU_ACTIVE to affect a running
> + * domain (which will fail if domain is not active), or
> + * VIR_DOMAIN_VCPU_PERSISTENT to affect the next boot via the XML
> + * description of the domain.  Both flags may be set.
> + *
> + * If @flags includes VIR_DOMAIN_VCPU_MAXIMUM, then
> + * VIR_DOMAIN_VCPU_ACTIVE must be clear, and only the maximum virtual
> + * CPU limit is altered; generally, this value must be less than or
> + * equal to virConnectGetMaxVcpus().  Otherwise, this call affects the
> + * current virtual CPU limit, which must be less than or equal to the
> + * maximum limit.
> + *
> + * Returns 0 in case of success, -1 in case of failure.
> + */
> +
> +int
> +virDomainSetVcpusFlags(virDomainPtr domain, unsigned int nvcpus,
> +                       unsigned int flags)
> +{
> +    virConnectPtr conn;
> +    DEBUG("domain=%p, nvcpus=%u, flags=%u", domain, nvcpus, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
> +        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return (-1);
> +    }
> +    if (domain->conn->flags & VIR_CONNECT_RO) {
> +        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
> +        goto error;
> +    }
> +
> +    if (nvcpus < 1) {
> +        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
> +        goto error;
> +    }
> +    conn = domain->conn;
> +
> +    if (conn->driver->domainSetVcpusFlags) {
> +        int ret;
> +        ret = conn->driver->domainSetVcpusFlags (domain, nvcpus, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(domain->conn);
> +    return -1;
> +}
> +
> +/**
> + * virDomainGetVcpusFlags:
> + * @domain: pointer to domain object, or NULL for Domain0
> + * @flags: an OR'ed set of virDomainVcpuFlags
> + *
> + * Query the number of virtual CPUs used by the domain.  Note that
> + * this call may fail if the underlying virtualization hypervisor does
> + * not support it.  This function requires privileged access to the
> + * hypervisor.
> + *
> + * @flags must include either VIR_DOMAIN_VCPU_ACTIVE to query a
> + * running domain (which will fail if domain is not active), or
> + * VIR_DOMAIN_VCPU_PERSISTENT to query the XML description of the
> + * domain.  It is an error to set both flags.
> + *
> + * If @flags includes VIR_DOMAIN_VCPU_MAXIMUM, then the maximum
> + * virtual CPU limit is queried.  Otherwise, this call queries the
> + * current virtual CPU limit.
> + *
> + * Returns 0 in case of success, -1 in case of failure.
> + */
> +
> +int
> +virDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
> +{
> +    virConnectPtr conn;
> +    DEBUG("domain=%p, flags=%u", domain, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
> +        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return (-1);
> +    }
> +
> +    conn = domain->conn;
> +
> +    if (conn->driver->domainGetVcpusFlags) {
> +        int ret;
> +        ret = conn->driver->domainGetVcpusFlags (domain, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    virDispatchError(domain->conn);
> +    return -1;
> +}
> +
> +/**
>   * virDomainPinVcpu:
>   * @domain: pointer to domain object, or NULL for Domain0
>   * @vcpu: virtual CPU number
>   * @cpumap: pointer to a bit map of real CPUs (in 8-bit bytes) (IN)
> - * 	Each bit set to 1 means that corresponding CPU is usable.
> - * 	Bytes are stored in little-endian order: CPU0-7, 8-15...
> - * 	In each byte, lowest CPU number is least significant bit.
> + *      Each bit set to 1 means that corresponding CPU is usable.
> + *      Bytes are stored in little-endian order: CPU0-7, 8-15...
> + *      In each byte, lowest CPU number is least significant bit.
>   * @maplen: number of bytes in cpumap, from 1 up to size of CPU map in
>   *	underlying virtualization system (Xen...).
>   *	If maplen < size, missing bytes are set to zero.

  Well one could argue that the flags set could be checked upfront here
instead of waiting for the individual drivers (for example you error
immediately instead of doing a round-trip when talking to libvirtd),
but the check will have to be done in the driver too, so that's fine.

 ACK

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list