[libvirt] [PATCH v4 5/9] Implement public API for getting/setting specific IOThread pinning

John Ferlan jferlan at redhat.com
Fri Mar 6 11:06:49 UTC 2015



On 03/06/2015 04:46 AM, Daniel P. Berrange wrote:
> On Thu, Mar 05, 2015 at 09:03:02PM -0500, John Ferlan wrote:
>> Add virDomainGetIOThreadPin to fetch the pinned CPU affinity map
>> for one IOThread.
>>
>> Add virDomainPinIOThread to allow setting the CPU affinity for a
>> specific IOThread.
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>  include/libvirt/libvirt-domain.h |  10 +++
>>  src/driver-hypervisor.h          |  16 +++++
>>  src/libvirt-domain.c             | 152 +++++++++++++++++++++++++++++++++++++++
>>  src/libvirt_public.syms          |   2 +
>>  4 files changed, 180 insertions(+)
>>
>> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
>> index 9487b80..fc35cd2 100644
>> --- a/include/libvirt/libvirt-domain.h
>> +++ b/include/libvirt/libvirt-domain.h
>> @@ -1609,6 +1609,16 @@ void                 virDomainIOThreadsInfoFree(virDomainIOThreadInfoPtr info);
>>  int                  virDomainGetIOThreadsInfo(virDomainPtr domain,
>>                                                 virDomainIOThreadInfoPtr **info,
>>                                                 unsigned int flags);
>> +int                  virDomainGetIOThreadPin (virDomainPtr domain,
>> +                                              unsigned int iothread_id,
>> +                                              unsigned char *cpumap,
>> +                                              int maplen,
>> +                                              unsigned int flags);
> 
> Isn't the GetIOThreadsInfo method & struct already reporting the pinning
> info for all current IO threads ? I'm not sure what the difference is
> between what  GetIOThreadsInfo and GetIOThreadPin is ?
> 
>   +struct _virDomainIOThreadInfo {
>   +    unsigned int iothread_id;          /* IOThread ID */
>   +    unsigned char *cpumap;             /* CPU map for thread. A pointer to an */
>   +                                       /* array of real CPUs (in 8-bit bytes) */
>   +    int cpumaplen;                     /* cpumap size */
>   +};
> 
> These fields match all the parameters in GetIOThreadPin, so it seems adding a
> GetIOThreadPin is redundant,
> 
> 

Yes - although based on reviews from yesterday it wasn't totally clear
if having a GetIOThreadPin in addition to GetIOThreadsInfo was
requested, so I added it to be "safe", but can remove it.

There is a GetVcpus and a GetVcpuPinInfo and the IOThreads code mirrors
that.

Tks -

John

>> +int                  virDomainPinIOThread(virDomainPtr domain,
>> +                                          unsigned int iothread_id,
>> +                                          unsigned char *cpumap,
>> +                                          int maplen,
>> +                                          unsigned int flags);
> 
> This is fine though
> 
> 
>> +/**
>> + * virDomainPinIOThread:
>> + * @domain: a domain object
>> + * @iothread_id: either the thread_id to modify or a count of IOThreads
>> + *      to be added or removed from the domain depending on the @flags setting
> 
> This can be updated now.
> 
>> + * @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.
>> + * @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.
>> + *      If maplen > size, failure code is returned.
>> + * @flags: bitwise-OR of virDomainModificationImpact
>> + *
>> + * Dynamically change the real CPUs which can be allocated to an IOThread.
>> + * This function may require privileged access to the hypervisor.
>> + *
>> + * @flags may include VIR_DOMAIN_AFFECT_LIVE or VIR_DOMAIN_AFFECT_CONFIG.
>> + * Both flags may be set.
>> + * If VIR_DOMAIN_AFFECT_LIVE is set, the change affects a running domain
>> + * and may fail if domain is not alive.
>> + * If VIR_DOMAIN_AFFECT_CONFIG is set, the change affects persistent state,
>> + * and will fail for transient domains. 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 also virDomainGetIOThreadsInfo for querying this information.
>> + *
>> + * Returns 0 in case of success, -1 in case of failure.
>> + */
>> +int
>> +virDomainPinIOThread(virDomainPtr domain,
>> +                     unsigned int iothread_id,
>> +                     unsigned char *cpumap,
>> +                     int maplen,
>> +                     unsigned int flags)
>> +{
>> +    virConnectPtr conn;
>> +
>> +    VIR_DOMAIN_DEBUG(domain, "iothread_id=%u, cpumap=%p, maplen=%d",
>> +                     iothread_id, cpumap, maplen);
>> +
>> +    virResetLastError();
>> +
>> +    virCheckDomainReturn(domain, -1);
>> +    conn = domain->conn;
>> +
>> +    virCheckReadOnlyGoto(conn->flags, error);
>> +    if ((unsigned short) iothread_id != iothread_id) {
>> +        virReportError(VIR_ERR_OVERFLOW, _("input too large: %u"),
>> +                       iothread_id);
>> +        goto error;
>> +    }
>> +    virCheckPositiveArgGoto(iothread_id, error);
>> +    virCheckNonNullArgGoto(cpumap, error);
>> +    virCheckPositiveArgGoto(maplen, error);
>> +
>> +    if (conn->driver->domainPinIOThread) {
>> +        int ret;
>> +        ret = conn->driver->domainPinIOThread(domain, iothread_id,
>> +                                              cpumap, maplen, flags);
>> +        if (ret < 0)
>> +            goto error;
>> +        return ret;
>> +    }
>> +
>> +    virReportUnsupportedError();
>> +
>> + error:
>> +    virDispatchError(domain->conn);
>> +    return -1;
>> +}
> 
> Regards,
> Daniel
> 




More information about the libvir-list mailing list