[libvirt] [PATCH v2 6/9] Implement virDomainAddIOThread and virDomainDelIOThread

Peter Krempa pkrempa at redhat.com
Mon Apr 13 13:07:46 UTC 2015


On Fri, Apr 10, 2015 at 17:36:24 -0400, John Ferlan wrote:
> Add libvirt API's to manage adding and deleting IOThreads to/from the
> domain
> 
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
>  include/libvirt/libvirt-domain.h |   7 +++
>  src/driver-hypervisor.h          |  13 ++++
>  src/libvirt-domain.c             | 132 +++++++++++++++++++++++++++++++++++++++
>  src/libvirt_public.syms          |   6 ++
>  4 files changed, 158 insertions(+)
> 
> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
> index 7be4219..472258c 100644
> --- a/include/libvirt/libvirt-domain.h
> +++ b/include/libvirt/libvirt-domain.h
> @@ -1615,6 +1615,13 @@ int                  virDomainPinIOThread(virDomainPtr domain,
>                                            unsigned char *cpumap,
>                                            int maplen,
>                                            unsigned int flags);
> +int                  virDomainAddIOThread(virDomainPtr domain,
> +                                          unsigned int iothread_id,
> +                                          const char *name,
> +                                          unsigned int flags);
> +int                  virDomainDelIOThread(virDomainPtr domain,
> +                                          unsigned int iothread_id,
> +                                          unsigned int flags);
>  
>  /**
>   * VIR_USE_CPU:
> diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
> index 1b92460..283562f 100644
> --- a/src/driver-hypervisor.h
> +++ b/src/driver-hypervisor.h
> @@ -393,6 +393,17 @@ typedef int
>                             unsigned int flags);
>  
>  typedef int
> +(*virDrvDomainAddIOThread)(virDomainPtr domain,
> +                           unsigned int iothread_id,
> +                           const char *name,
> +                           unsigned int flags);
> +
> +typedef int
> +(*virDrvDomainDelIOThread)(virDomainPtr domain,
> +                           unsigned int iothread_id,
> +                           unsigned int flags);
> +
> +typedef int
>  (*virDrvDomainGetSecurityLabel)(virDomainPtr domain,
>                                  virSecurityLabelPtr seclabel);
>  
> @@ -1273,6 +1284,8 @@ struct _virHypervisorDriver {
>      virDrvDomainGetMaxVcpus domainGetMaxVcpus;
>      virDrvDomainGetIOThreadInfo domainGetIOThreadInfo;
>      virDrvDomainPinIOThread domainPinIOThread;
> +    virDrvDomainAddIOThread domainAddIOThread;
> +    virDrvDomainDelIOThread domainDelIOThread;
>      virDrvDomainGetSecurityLabel domainGetSecurityLabel;
>      virDrvDomainGetSecurityLabelList domainGetSecurityLabelList;
>      virDrvNodeGetSecurityModel nodeGetSecurityModel;
> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
> index 0acfd13..ffd50b3 100644
> --- a/src/libvirt-domain.c
> +++ b/src/libvirt-domain.c
> @@ -8020,6 +8020,138 @@ virDomainPinIOThread(virDomainPtr domain,
>  
>  
>  /**
> + * virDomainAddIOThread:
> + * @domain: a domain object
> + * @iothread_id: the specific IOThread ID value to add
> + * @name: optional additional naming string (NUL terminated)
> + * @flags: bitwise-OR of virDomainModificationImpact
> + *
> + * Dynamically add an IOThread to the domain. If @iothread_id is a positive
> + * non-zero value, then attempt to add the specific IOThread ID and error
> + * out if the iothread id already exists. If the @name is NULL, then only
> + * the default naming scheme is used. Any name containing "iothread" will
> + * be rejected.
> + *
> + * Note that this call can fail if the underlying virtualization hypervisor
> + * does not support it or if growing the number is arbitrarily limited.
> + * This function may require privileged access to the hypervisor.

It requires, not may require.

> + *
> + * @flags may include VIR_DOMAIN_AFFECT_LIVE to affect a running
> + * domain (which may fail if domain is not active), or
> + * VIR_DOMAIN_AFFECT_CONFIG to affect the next boot via the XML
> + * description of the domain.  Both flags may be set.
> + * If neither flag is specified (that is, @flags is VIR_DOMAIN_AFFECT_CURRENT),
> + * then an inactive domain modifies persistent setup, while an active domain
> + * is hypervisor-dependent on whether just live or both live and persistent
> + * state is changed.

I'd opt for a more sane explanation, where CURRENT with active VM means
the live definiton is modified.

> + *
> + * Not all hypervisors can support all flag combinations.

There are no flags this could potentially apply to yet.

> + *
> + * Returns 0 in case of success, -1 in case of failure.
> + */
> +int
> +virDomainAddIOThread(virDomainPtr domain,
> +                     unsigned int iothread_id,
> +                     const char *name,
> +                     unsigned int flags)
> +{
> +    virConnectPtr conn;
> +
> +    VIR_DOMAIN_DEBUG(domain, "iothread_id=%u, name=%p flags=%x",
> +                     iothread_id, name, flags);
> +
> +    virResetLastError();
> +
> +    virCheckDomainReturn(domain, -1);
> +    virCheckReadOnlyGoto(domain->conn->flags, error);
> +
> +    if ((unsigned short) iothread_id != iothread_id) {
> +        virReportError(VIR_ERR_OVERFLOW, _("input too large: %u"), iothread_id);
> +        goto error;

Just store it as a full unsigned integer and kill this check.

> +    }
> +    conn = domain->conn;
> +
> +    if (conn->driver->domainAddIOThread) {
> +        int ret;
> +        ret = conn->driver->domainAddIOThread(domain, iothread_id, name, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virReportUnsupportedError();
> +
> + error:
> +    virDispatchError(domain->conn);
> +    return -1;
> +}
> +
> +
> +/**
> + * virDomainDelIOThread:
> + * @domain: a domain object
> + * @iothread_id: the specific IOThread ID value to delete
> + * @flags: bitwise-OR of virDomainModificationImpact
> + *
> + * Dynamically delete an IOThread from the domain. The @iothread_id to be
> + * deleted must not have a resource associated with it and can be any of
> + * the currently valid IOThread ID's.
> + *
> + * Note that this call can fail if the underlying virtualization hypervisor
> + * does not support it or if reducing the number is arbitrarily limited.
> + * This function may require privileged access to the hypervisor.

This function requires privileged access.

> + *
> + * @flags may include VIR_DOMAIN_AFFECT_LIVE to affect a running
> + * domain (which may fail if domain is not active), or
> + * VIR_DOMAIN_AFFECT_CONFIG to affect the next boot via the XML
> + * description of the domain.  Both flags may be set.
> + * If neither flag is specified (that is, @flags is VIR_DOMAIN_AFFECT_CURRENT),
> + * then an inactive domain modifies persistent setup, while an active domain
> + * is hypervisor-dependent on whether just live or both live and persistent
> + * state is changed.
> + *
> + * Not all hypervisors can support all flag combinations.

... see above.

> + *
> + * Returns 0 in case of success, -1 in case of failure.
> + */
> +int
> +virDomainDelIOThread(virDomainPtr domain,
> +                     unsigned int iothread_id,
> +                     unsigned int flags)
> +{
> +    virConnectPtr conn;
> +
> +    VIR_DOMAIN_DEBUG(domain, "iothread_id=%u, flags=%x", iothread_id, flags);
> +
> +    virResetLastError();
> +
> +    virCheckDomainReturn(domain, -1);
> +    virCheckReadOnlyGoto(domain->conn->flags, error);
> +    virCheckNonZeroArgGoto(iothread_id, error);
> +
> +    if ((unsigned short) iothread_id != iothread_id) {
> +        virReportError(VIR_ERR_OVERFLOW, _("input too large: %u"), iothread_id);
> +        goto error;

See above.

> +    }
> +    conn = domain->conn;
> +
> +    if (conn->driver->domainDelIOThread) {
> +        int ret;
> +        ret = conn->driver->domainDelIOThread(domain, iothread_id, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virReportUnsupportedError();
> +
> + error:
> +    virDispatchError(domain->conn);
> +    return -1;
> +}
> +
> +
> +/**
>   * virDomainGetSecurityLabel:
>   * @domain: a domain object
>   * @seclabel: pointer to a virSecurityLabel structure

Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150413/aec5e43e/attachment-0001.sig>


More information about the libvir-list mailing list