From 42036650c6c9f115738c95fd6f0f47a27c066a17 Mon Sep 17 00:00:00 2001 From: Daniel Henrique Barboza Date: Fri, 26 Jun 2020 19:10:43 -0300 Subject: [PATCH] virhostcpu.c: introduce virHostCPUGetAvailableCPUsBitmap() The idea is to have a function that calls virHostCPUGetOnlineBitmap() but, instead of returning NULL if the host does not have CPU offlining capabilities, fall back to a bitmap containing all present CPUs. Next patch will use this helper in two other places. Signed-off-by: Daniel Henrique Barboza Reviewed-by: Michal Privoznik --- src/libvirt_private.syms | 1 + src/util/virhostcpu.c | 30 ++++++++++++++++++++++++++++++ src/util/virhostcpu.h | 2 ++ 3 files changed, 33 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index d6b87b72f4..5a342b9fd4 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2223,6 +2223,7 @@ virHookPresent; # util/virhostcpu.h +virHostCPUGetAvailableCPUsBitmap; virHostCPUGetCount; virHostCPUGetInfo; virHostCPUGetKVMMaxVCPUs; diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index 615250d05d..8ca67e357d 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c @@ -1099,6 +1099,36 @@ virHostCPUGetMap(unsigned char **cpumap, } +/* virHostCPUGetAvailableCPUsBitmap(): + * + * Returns a virBitmap object with all available host CPUs. + * + * This is a glorified wrapper of virHostCPUGetOnlineBitmap() + * that, instead of returning NULL when 'ifndef __linux__' and + * the caller having to handle it outside the function, returns + * a virBitmap with all the possible CPUs in the host, up to + * virHostCPUGetCount(). */ +virBitmapPtr +virHostCPUGetAvailableCPUsBitmap(void) +{ + g_autoptr(virBitmap) bitmap = NULL; + + if (!(bitmap = virHostCPUGetOnlineBitmap())) { + int hostcpus; + + if ((hostcpus = virHostCPUGetCount()) < 0) + return NULL; + + if (!(bitmap = virBitmapNew(hostcpus))) + return NULL; + + virBitmapSetAll(bitmap); + } + + return g_steal_pointer(&bitmap); +} + + #if HAVE_LINUX_KVM_H && defined(KVM_CAP_PPC_SMT) /* Get the number of threads per subcore. diff --git a/src/util/virhostcpu.h b/src/util/virhostcpu.h index 48b1431ca4..d07503857e 100644 --- a/src/util/virhostcpu.h +++ b/src/util/virhostcpu.h @@ -43,6 +43,8 @@ int virHostCPUGetStats(int cpuNum, bool virHostCPUHasBitmap(void); virBitmapPtr virHostCPUGetPresentBitmap(void); virBitmapPtr virHostCPUGetOnlineBitmap(void); +virBitmapPtr virHostCPUGetAvailableCPUsBitmap(void); + int virHostCPUGetCount(void); int virHostCPUGetThreadsPerSubcore(virArch arch) G_GNUC_NO_INLINE;