On Fri, Jun 24, 2011 at 05:56:21PM +0900, Taku Izumi wrote: > > This patch introduces a new libvirt API (virDomainGetVcpupinInfo). > > We can use virDomainGetVcpus API to retrieve CPU affinity information, > but can't use this API against inactive domains (at least in case of KVM). > There is the companion API of this, whose name is virDomainGetVcpusFlags. > However its signature is different from what everyone expect, so we can't use > this to retrieve it either. > > The virDomainGetVcpupinInfo is the new API to retrieve CPU affinity information > of active and inactive domains. > > > Signed-off-by: Taku Izumi <izumi.taku@xxxxxxxxxxxxxx> > --- > include/libvirt/libvirt.h.in | 6 +++ > src/driver.h | 8 ++++ > src/libvirt.c | 69 +++++++++++++++++++++++++++++++++++++++++++ > src/libvirt_public.syms | 1 > 4 files changed, 84 insertions(+) > > Index: libvirt/include/libvirt/libvirt.h.in > =================================================================== > --- libvirt.orig/include/libvirt/libvirt.h.in > +++ libvirt/include/libvirt/libvirt.h.in > @@ -1265,6 +1265,12 @@ int virDomainPinVcpu > int maplen, > unsigned int flags); > > +int virDomainGetVcpupinInfo (virDomainPtr domain, > + int maxinfo, > + unsigned char *cpumaps, > + int maplen, > + unsigned int flags); > + API looks fine to me [...] > --- libvirt.orig/src/libvirt.c > +++ libvirt/src/libvirt.c > @@ -7087,6 +7087,75 @@ error: > } > > /** > + * virDomainGetVcpupinInfo: > + * @domain: pointer to domain object, or NULL for Domain0 > + * @maxinfo: the number of cpumap > + * @cpumaps: pointer to a bit map of real CPUs for all vcpus of this > + * domain (in 8-bit bytes) (OUT) > + * It's assumed there is <maxinfo> cpumap in cpumaps array. > + * The memory allocated to cpumaps must be (maxinfo * maplen) bytes > + * (ie: calloc(maxinfo, maplen)). > + * One cpumap inside cpumaps has the format described in > + * virDomainPinVcpu() API. > + * Must not be NULL. > + * @maplen: the number of bytes in one cpumap, from 1 up to size of CPU map. > + * Must be positive. > + * @flags: an OR'ed set of virDomainModificationImpact > + * Must not be specified VIR_DOMAIN_AFFECT_LIVE and > + * VIR_DOMAIN_AFFECT_CONFIG concurrently! > + * > + * Query the CPU affinity setting of all virtual CPUs of domain, store it > + * in cpumaps. > + * > + * Returns the number of virtual CPUs in case of success, > + * -1 in case of failure. > + */ > +int > +virDomainGetVcpupinInfo (virDomainPtr domain, int maxinfo, > + unsigned char *cpumaps, int maplen, unsigned int flags) > +{ > + virConnectPtr conn; > + > + VIR_DOMAIN_DEBUG(domain, "maxinfo=%d, cpumaps=%p, maplen=%d, flags=%u", > + maxinfo, cpumaps, maplen, flags); > + > + virResetLastError(); > + > + if (!VIR_IS_CONNECTED_DOMAIN(domain)) { > + virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); > + virDispatchError(NULL); > + return -1; > + } > + > + if (maxinfo < 1) { > + virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__); > + goto error; > + } We don't check for read-only here, but the semantic is purely reading that's normal > + if ((cpumaps == NULL) || (cpumaps && maplen <= 0)) { > + virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__); > + goto error; > + } > + > + conn = domain->conn; > + > + if (conn->driver->domainGetVcpupinInfo) { > + int ret; > + ret = conn->driver->domainGetVcpupinInfo (domain, maxinfo, > + cpumaps, 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) Okay ACK on the API principle from me, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list