Here the new virtual cpu functions proposal.
What do you think about it ?
/**
* *virVcpuInfo*: structure for information about a virtual CPU in a domain.
*/
typedef enum {
VIR_VCPU_OFFLINE = 0, /* the virtual CPU is offline */
VIR_VCPU_RUNNING = 1, /* the virtual CPU is running */
VIR_VCPU_BLOCKED = 2, /* the virtual CPU is blocked on resource */
*} virVcpuState*;
typedef struct _virVcpuInfo virVcpuInfo;
struct _virVcpuInfo {
unsigned int number; /* virtual CPU number */
int state; /* value from virVcpuState */
unsigned long long cpuTime; /* CPU time used, in nanoseconds */
int cpu; /* real CPU number, or -1 if offline */
};
typedef virVcpuInfo **virVcpuInfoPtr*;
/**
* *virDomainSetVcpus*:
* @*domain*: pointer to domain object, or NULL for Domain0
* @*nvcpus*: the new number of virtual CPUs for this domain
*
* 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 priviledged access to the hypervisor.
*
* Returns 0 in case of success, -1 in case of failure.
*/
int *virDomainSetVcpus* (virDomainPtr domain,
unsigned int nvcpus);
/**
* *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).
* 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.
*
* Dynamically change the real CPUs which can be allocated to a virtual CPU.
* This function requires priviledged access to the hypervisor.
*
* Returns 0 in case of success, -1 in case of failure.
*/
int *virDomainPinVcpu* (virDomainPtr domain,
unsigned int vcpu,
unsigned char *cpumap,
int maplen);
/* Macros for bit manipulation in cpumap */
#define *USE_CPU*(cpumap,cpu) (cpumap[(cpu)/8] |= (1<<((cpu)%8)))
#define *UNUSE_CPU*(cpumap,cpu) (cpumap[(cpu)/8] &= ~(1<<((cpu)%8)))
/**
* *virDomainGetVcpus*:
* @*domain*: pointer to domain object, or NULL for Domain0
* @*info*: pointer to an array of virVcpuInfo structures
* @*maxinfo*: number of structures in info array
* @*cpumaps*: pointer to a bit map of real CPUs for all vcpus of this
domain.
* If cpumaps is NULL, then no cpumap information is returned by
the API.
* It's assumed there is <maxinfo> cpumap in cpumaps.
* The memory allocated to cpumaps must be (maxinfo * maplen) bytes.
* One cpumap inside cupmaps have the format described in
virDomainPinVcpu API.
* @*maplen*: number of bytes in one cpumap, from 1 up to size of CPU map in
* underlying virtualization system (Xen...).
*
* Extract information about virtual CPUs of domain, store it in info array.
*
* Returns the number of info filled in case of success, -1 in case of
failure.
*/
int *virDomainGetVcpus* (virDomainPtr domain,
virVcpuInfoPtr info,
int maxinfo,
unsigned char *cpumaps, /* may be NULL */
int maplen);
/* Macros for bit testing in cpumaps */
#define *CPU_USABLE*(cpumaps,maplen,vcpu,cpu) \
(cpumaps[((vcpu)*(maplen))+((cpu)/8)] & (1<<((cpu)%8)))
/*
* Macro for copying the cpumap of a vcpu from cupmaps inside a
standalone cpumap.
* This macro is useful in case of using virDomainPinVcpu() after
virDomainGetVcpus().
* cpumap must be previously allocated.
*/
#define *COPY_CPUMAP*(cpumaps,maplen,vcpu,cpumap) \
memcpy(cpumap, &(cpumaps[(vcpu)*(maplen)]), (maplen))