[libvirt] [PATCH 04/10] nodeinfo: Add old kernel compatibility to nodeGetPresentCPUBitmap()
Peter Krempa
pkrempa at redhat.com
Mon Jul 20 13:13:52 UTC 2015
On Fri, Jul 17, 2015 at 18:13:23 +0200, Andrea Bolognani wrote:
> If the cpu/present file is not available, we assume that the kernel
> is too old to support non-consecutive CPU ids and return a bitmap
> with all the bits set to represent this fact. This assumption is
> already exploited in nodeGetCPUCount().
>
> This means users of this API can expect the information to always
> be available unless an error has occurred, and no longer need to
> treat the NULL return value as a special case.
>
> The error message has been updated as well.
> ---
> src/nodeinfo.c | 46 ++++++++++++++++++++++++++++++++--------------
> 1 file changed, 32 insertions(+), 14 deletions(-)
>
> diff --git a/src/nodeinfo.c b/src/nodeinfo.c
> index 52f5594..5aa0607 100644
> --- a/src/nodeinfo.c
> +++ b/src/nodeinfo.c
> @@ -441,6 +441,8 @@ virNodeParseNode(const char *sysfs_prefix,
> }
>
> present_cpumap = nodeGetPresentCPUBitmap(sysfs_prefix);
> + if (!present_cpumap)
> + goto cleanup;
>
> /* enumerate sockets in the node */
> CPU_ZERO(&sock_map);
> @@ -448,7 +450,7 @@ virNodeParseNode(const char *sysfs_prefix,
> if (sscanf(cpudirent->d_name, "cpu%u", &cpu) != 1)
> continue;
>
> - if (present_cpumap && !(virBitmapIsBitSet(present_cpumap, cpu)))
> + if (!virBitmapIsBitSet(present_cpumap, cpu))
> continue;
>
> if ((online = virNodeGetCpuValue(node, cpu, "online", 1)) < 0)
> @@ -484,7 +486,7 @@ virNodeParseNode(const char *sysfs_prefix,
> if (sscanf(cpudirent->d_name, "cpu%u", &cpu) != 1)
> continue;
>
> - if (present_cpumap && !(virBitmapIsBitSet(present_cpumap, cpu)))
> + if (!virBitmapIsBitSet(present_cpumap, cpu))
> continue;
>
> if ((online = virNodeGetCpuValue(node, cpu, "online", 1)) < 0)
> @@ -1278,27 +1280,43 @@ nodeGetCPUCount(const char *sysfs_prefix ATTRIBUTE_UNUSED)
> }
>
> virBitmapPtr
> -nodeGetPresentCPUBitmap(const char *sysfs_prefix)
> +nodeGetPresentCPUBitmap(const char *sysfs_prefix ATTRIBUTE_UNUSED)
> {
> - int max_present;
> #ifdef __linux__
> + virBitmapPtr present_cpus = NULL;
> char *present_path = NULL;
> - virBitmapPtr bitmap = NULL;
> -#endif
> + int npresent_cpus;
> + int cpu;
>
> - if ((max_present = nodeGetCPUCount(sysfs_prefix)) < 0)
> - return NULL;
> + if ((npresent_cpus = nodeGetCPUCount(sysfs_prefix)) < 0)
> + goto cleanup;
>
> -#ifdef __linux__
> if (!(present_path = linuxGetCPUPresentPath(sysfs_prefix)))
> - return NULL;
> - if (virFileExists(present_path))
> - bitmap = linuxParseCPUmap(max_present, present_path);
> + goto cleanup;
> +
> + /* If the cpu/present file is available, parse it and exit */
> + if (virFileExists(present_path)) {
> + present_cpus = linuxParseCPUmap(npresent_cpus, present_path);
> + goto cleanup;
> + }
> +
> + /* If the file is not available, we can assume that the kernel is
> + * too old to support non-consecutive CPU ids and just mark all
> + * possible CPUs as present */
> + if (!(present_cpus = virBitmapNew(npresent_cpus)))
> + goto cleanup;
> +
> + for (cpu = 0; cpu < npresent_cpus; cpu++)
> + if (virBitmapSetBit(present_cpus, cpu) < 0)
virBitmapSetAll();
> + goto cleanup;
> +
> + cleanup:
> VIR_FREE(present_path);
> - return bitmap;
> +
> + return present_cpus;
> #endif
> virReportError(VIR_ERR_NO_SUPPORT, "%s",
> - _("non-continuous host cpu numbers not implemented on this platform"));
> + _("node present CPU map not implemented on this platform"));
> return NULL;
> }
ACK with changing to virBitmapSetAll. It makes nodeGetPresentCPUBitmap a
little less horrible than it used to be.
Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150720/34739796/attachment-0001.sig>
More information about the libvir-list
mailing list