[Libvir] New (last ?) virtual cpu functions proposal

Jim Fehlig jfehlig at novell.com
Wed Aug 2 23:46:57 UTC 2006


Thanks for the proposal! Just a few questions inline, otherwise looks 
good for my use cases.

Philippe Berthault wrote:
> 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);
>

How do I get the "size of CPU map in underlying virtualization system" 
described in maplen comments?

> /* 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);

If there is no physical cpu affinity (e.g. the default - vcpus can float 
among any pcpu), does each cpumap in cpumaps have all bits set?  Do we 
indicate no affinity by having all possible pcpus marked as bound?

>
> /* 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))
>
> ------------------------------------------------------------------------
>
> --
> Libvir-list mailing list
> Libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
>   




More information about the libvir-list mailing list