diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a9cae523d2..80bdf99b76 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -908,6 +908,7 @@ virNodeDeviceObjUnlock; # nodeinfo.h nodeCapsInitNUMA; nodeGetCPUBitmap; +nodeGetCPUMap; nodeGetCPUStats; nodeGetCellsFreeMemory; nodeGetFreeMemory; diff --git a/src/nodeinfo.c b/src/nodeinfo.c index 461b5dc638..8b494df524 100644 --- a/src/nodeinfo.c +++ b/src/nodeinfo.c @@ -1249,6 +1249,34 @@ nodeGetMemoryParameters(virConnectPtr conn ATTRIBUTE_UNUSED, #endif } +int nodeGetCPUMap(virConnectPtr conn, + unsigned char **cpumap, + unsigned int *online, + unsigned int flags) +{ + virBitmapPtr cpus = NULL; + int maxpresent; + int ret = -1; + int dummy; + + virCheckFlags(0, -1); + + if (!(cpus = nodeGetCPUBitmap(conn, &maxpresent))) + goto cleanup; + + if (cpumap && virBitmapToData(cpus, cpumap, &dummy) < 0) + goto cleanup; + if (online) + *online = virBitmapCountBits(cpus); + + ret = maxpresent; +cleanup: + if (ret < 0 && cpumap) + VIR_FREE(*cpumap); + virBitmapFree(cpus); + return ret; +} + #if HAVE_NUMACTL # if LIBNUMA_API_VERSION <= 1 # define NUMA_MAX_N_CPUS 4096 diff --git a/src/nodeinfo.h b/src/nodeinfo.h index 73c6f514c7..44aa55d289 100644 --- a/src/nodeinfo.h +++ b/src/nodeinfo.h @@ -58,4 +58,10 @@ int nodeSetMemoryParameters(virConnectPtr conn, virTypedParameterPtr params, int nparams, unsigned int flags); + +int nodeGetCPUMap(virConnectPtr conn, + unsigned char **cpumap, + unsigned int *online, + unsigned int flags); + #endif /* __VIR_NODEINFO_H__*/