
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@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
+ * @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