On Thu, Jun 09, 2011 at 12:37:47PM +0900, Taku Izumi wrote: > > This patch introduces a new libvirt API (virDomainPinVcpuFlags). > > Signd-off-by: Taku Izumi <izumi.taku@xxxxxxxxxxxxxx> > --- > include/libvirt/libvirt.h.in | 5 ++ > src/driver.h | 7 +++ > src/libvirt.c | 76 > +++++++++++++++++++++++++++++++++++++++++++ > src/libvirt_public.syms | 1 > 4 files changed, 89 insertions(+) > > Index: libvirt/include/libvirt/libvirt.h.in > =================================================================== > --- libvirt.orig/include/libvirt/libvirt.h.in > +++ libvirt/include/libvirt/libvirt.h.in > @@ -1049,6 +1049,11 @@ int virDomainPinVcpu > unsigned int vcpu, > unsigned char *cpumap, > int maplen); > +int virDomainPinVcpuFlags (virDomainPtr domain, > + unsigned int vcpu, > + unsigned char *cpumap, > + int maplen, > + unsigned int flags); > > /** > * VIR_USE_CPU: > Index: libvirt/src/driver.h > =================================================================== > --- libvirt.orig/src/driver.h > +++ libvirt/src/driver.h > @@ -230,6 +230,12 @@ typedef int > unsigned char *cpumap, > int maplen); > typedef int > + (*virDrvDomainPinVcpuFlags) (virDomainPtr domain, > + unsigned int vcpu, > + unsigned char *cpumap, > + int maplen, > + unsigned int flags); > +typedef int > (*virDrvDomainGetVcpus) (virDomainPtr domain, > virVcpuInfoPtr info, > int maxinfo, > @@ -671,6 +677,7 @@ struct _virDriver { > virDrvDomainSetVcpusFlags domainSetVcpusFlags; > virDrvDomainGetVcpusFlags domainGetVcpusFlags; > virDrvDomainPinVcpu domainPinVcpu; > + virDrvDomainPinVcpuFlags domainPinVcpuFlags; > virDrvDomainGetVcpus domainGetVcpus; > virDrvDomainGetMaxVcpus domainGetMaxVcpus; > virDrvDomainGetSecurityLabel domainGetSecurityLabel; > Index: libvirt/src/libvirt.c > =================================================================== > --- libvirt.orig/src/libvirt.c > +++ libvirt/src/libvirt.c > @@ -6709,6 +6709,82 @@ error: > } > > /** > + * virDomainPinVcpuFlags: > + * @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) (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 virDomainModificationImpac > + * > + * Dynamically change the real CPUs which can be allocated to a virtual > CPU. > + * This function requires privileged access to the hypervisor. > + * > + * @flags may include VIR_DOMAIN_PIN_VCPU_LIVE or > VIR_DOMAIN_PIN_VCPU_CONFIG. VIR_DOMAIN_AFFECT_LIVE, VIRDOMAIN_AFFECT_CONFIG. > + * Both flags may be set. > + * If VIR_DOMAIN_PIN_VCPU_LIVE is set, the change affects a running domain Likewise. > + * and may fail if domain is not alive. > + * If VIR_DOMAIN_PIN_VCPU_CONFIG is set, the change affects persistent Likewise. > state, > + * and will fail for transient domains. If neither flag is specified (that > is, > + * @flags is VIR_DOMAIN_PIN_VCPU_CURRENT), then an inactive domain modifies VIR_DOMAIN_AFFECT_CURRENT. > + * 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. > + * > + * Returns 0 in case of success, -1 in case of failure. > + * > + */ > +int > +virDomainPinVcpuFlags(virDomainPtr domain, unsigned int vcpu, > + unsigned char *cpumap, int maplen, unsigned int > flags) > +{ > + virConnectPtr conn; > + > + VIR_DOMAIN_DEBUG(domain, "vcpu=%u, cpumap=%p, maplen=%d, flags=%u", > + vcpu, cpumap, maplen, flags); > + > + virResetLastError(); > + > + if (!VIR_IS_CONNECTED_DOMAIN(domain)) { > + virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); > + virDispatchError(NULL); > + return -1; > + } > + > + if (domain->conn->flags & VIR_CONNECT_RO) { > + virLibDomainError(VIR_ERR_OPERATION_DENIED, __FUNCTION__); > + goto error; > + } > + > + if ((vcpu > 32000) || (cpumap == NULL) || (maplen < 1)) { > + virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__); > + goto error; > + } > + > + conn = domain->conn; > + > + if (conn->driver->domainPinVcpuFlags) { > + int ret; > + ret = conn->driver->domainPinVcpuFlags (domain, vcpu, cpumap, > maplen, flags); > + if (ret < 0) > + goto error; > + return ret; > + } > + > + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__); > + > +error: > + virDispatchError(domain->conn); > + return -1; > + > +} > + > +/** > * virDomainGetVcpus: > * @domain: pointer to domain object, or NULL for Domain0 > * @info: pointer to an array of virVcpuInfo structures (OUT) > Index: libvirt/src/libvirt_public.syms > =================================================================== > --- libvirt.orig/src/libvirt_public.syms > +++ libvirt/src/libvirt_public.syms > @@ -448,6 +448,7 @@ LIBVIRT_0.9.2 { > virInterfaceChangeBegin; > virInterfaceChangeCommit; > virInterfaceChangeRollback; > + virDomainPinVcpuFlags; > } LIBVIRT_0.9.0; Will this be LIBVIRT_0.9.3 { global: virDomainPinVcpuFlags; } LIBVIRT_0.9.2; because 0.9.2 is already released. > > # .... define new API here using predicted next version number .... > > > -- > libvir-list mailing list > libvir-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list