[libvirt] [PATCH v3 5/9] Implement public API for virDomainSetIOThreads
John Ferlan
jferlan at redhat.com
Thu Mar 5 13:13:35 UTC 2015
On 03/04/2015 01:00 PM, Ján Tomko wrote:
> On Tue, Feb 17, 2015 at 04:03:54PM -0500, John Ferlan wrote:
>> https://bugzilla.redhat.com/show_bug.cgi?id=1135491
>>
>> Add the libvirt API infrastructure to support setting IOThread data.
>> For now this is the pinned CPU information, but eventually will also
>> support hot plug add/del
>>
>> The API will support the LIVE, CONFIG, or CURRENT flags. If the
>> VIR_DOMAIN_IOTHREADS_PIN flag is not provided, it's left up to the
>> hypervisor to handle, but when not provided the cpumap/maplen arguments
>> are not checked.
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>> include/libvirt/libvirt-domain.h | 16 ++++++++++
>> src/driver-hypervisor.h | 8 +++++
>> src/libvirt-domain.c | 69 ++++++++++++++++++++++++++++++++++++++++
>> src/libvirt_public.syms | 1 +
>> 4 files changed, 94 insertions(+)
>>
>> diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
>> index 9dcc424..e07db16 100644
>> --- a/include/libvirt/libvirt-domain.h
>> +++ b/include/libvirt/libvirt-domain.h
>> @@ -1582,11 +1582,27 @@ struct _virDomainIOThreadsInfo {
>> char **resources; /* array of resources using IOThread */
>> };
>>
>> +/* Flags for controlling virtual IOThread pinning. */
>> +typedef enum {
>> + /* See virDomainModificationImpact for these flags. */
>> + VIR_DOMAIN_IOTHREADS_CURRENT = VIR_DOMAIN_AFFECT_CURRENT,
>> + VIR_DOMAIN_IOTHREADS_LIVE = VIR_DOMAIN_AFFECT_LIVE,
>> + VIR_DOMAIN_IOTHREADS_CONFIG = VIR_DOMAIN_AFFECT_CONFIG,
>> +
>> + /* Additionally, these flags may be bitwise-OR'd in. */
>> + VIR_DOMAIN_IOTHREADS_PIN = (1 << 2), /* thread_id to pin using cpumap */
>> +} virDomainIOThreadsFlags;
>> +
>> void virDomainIOThreadsInfoFree(virDomainIOThreadsInfoPtr info);
>>
>> int virDomainGetIOThreadsInfo(virDomainPtr domain,
>> virDomainIOThreadsInfoPtr **info,
>> unsigned int flags);
>> +int virDomainSetIOThreads(virDomainPtr domain,
>> + unsigned int iothread_val,
>> + unsigned char *cpumap,
>> + int maplen,
>> + unsigned int flags);
>>
>> /**
>> * VIR_USE_CPU:
>> diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
>> index 2ce1a51..120d761 100644
>> --- a/src/driver-hypervisor.h
>> +++ b/src/driver-hypervisor.h
>> @@ -386,6 +386,13 @@ typedef int
>> unsigned int flags);
>>
>> typedef int
>> +(*virDrvDomainSetIOThreads)(virDomainPtr domain,
>> + unsigned int iothread_val,
>> + unsigned char *cpumap,
>> + int maplen,
>> + unsigned int flags);
>> +
>> +typedef int
>> (*virDrvDomainGetSecurityLabel)(virDomainPtr domain,
>> virSecurityLabelPtr seclabel);
>>
>> @@ -1260,6 +1267,7 @@ struct _virHypervisorDriver {
>> virDrvDomainGetVcpus domainGetVcpus;
>> virDrvDomainGetMaxVcpus domainGetMaxVcpus;
>> virDrvDomainGetIOThreadsInfo domainGetIOThreadsInfo;
>> + virDrvDomainSetIOThreads domainSetIOThreads;
>> virDrvDomainGetSecurityLabel domainGetSecurityLabel;
>> virDrvDomainGetSecurityLabelList domainGetSecurityLabelList;
>> virDrvNodeGetSecurityModel nodeGetSecurityModel;
>> diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
>> index f893b35..bf73773 100644
>> --- a/src/libvirt-domain.c
>> +++ b/src/libvirt-domain.c
>> @@ -7969,6 +7969,75 @@ virDomainIOThreadsInfoFree(virDomainIOThreadsInfoPtr info)
>>
>>
>> /**
>> + * virDomainSetIOThreads:
>> + * @domain: a domain object
>> + * @iothread_val: either the thread_id to modify or a count of IOThreads
>> + * to be added or removed from the domain depending on the @flags setting
>
> IMO this would look nicer as two separate APIs:
> virDomainSetIOThreadPin
> virDomainSetIOThreadCount
>
OK - fair enough. I was hoping to be able to "reuse" code, but changing
this to SetIOThreadPin is fine.
The other API will end up being the Add/Remove an IOThread, but will
require a bit of internal plumbing changes to allow for a removal of a
thread in the middle of the array.
Tks -
John
>> + * @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 supported virDomainIOThreadsFlags
>> + *
>> + * If the VIR_DOMAIN_IOTHREADS_PIN flag is set, the @iothread_val will be
>> + * an existing IOThread to be pinned
>
> This doesn't feel like a flag. It changes what the API does, not how it
> does it.
>
> Jan
>
More information about the libvir-list
mailing list