There is no "node driver" as there was before, drivers have to do their own ACL checking anyway, so they all specify their functions and nodeinfo is basically just extending conf/capablities. Hence moving the code to src/conf/ is the right way to go. Also that way we can de-duplicate some code that is in virsysfs and/or virhostcpu that got duplicated during the virhostcpu.c split. And Some cleanup is done throughout the changes, like adding the vir* prefix etc. Signed-off-by: Martin Kletzander <mkletzan@xxxxxxxxxx> --- po/POTFILES.in | 1 - src/Makefile.am | 3 - src/bhyve/bhyve_capabilities.c | 1 - src/bhyve/bhyve_driver.c | 5 +- src/conf/capabilities.c | 293 ++++++++++++++++++++++++++++- src/conf/capabilities.h | 4 + src/cpu/cpu.c | 4 +- src/libvirt_private.syms | 7 +- src/lxc/lxc_conf.c | 3 +- src/lxc/lxc_driver.c | 3 +- src/nodeinfo.c | 418 ----------------------------------------- src/nodeinfo.h | 32 ---- src/openvz/openvz_conf.c | 3 +- src/openvz/openvz_driver.c | 3 +- src/phyp/phyp_driver.c | 3 +- src/qemu/qemu_capabilities.c | 3 +- src/qemu/qemu_conf.c | 1 - src/qemu/qemu_driver.c | 3 +- src/uml/uml_conf.c | 3 +- src/uml/uml_driver.c | 3 +- src/vbox/vbox_common.c | 5 +- src/vmware/vmware_conf.c | 3 +- src/vz/vz_driver.c | 7 +- src/vz/vz_sdk.c | 1 - src/xen/xen_driver.c | 1 - tests/commandtest.c | 1 - 26 files changed, 314 insertions(+), 500 deletions(-) delete mode 100644 src/nodeinfo.c delete mode 100644 src/nodeinfo.h diff --git a/po/POTFILES.in b/po/POTFILES.in index 2002e6889413..4cffb535066b 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -117,7 +117,6 @@ src/network/leaseshelper.c src/node_device/node_device_driver.c src/node_device/node_device_hal.c src/node_device/node_device_udev.c -src/nodeinfo.c src/nwfilter/nwfilter_dhcpsnoop.c src/nwfilter/nwfilter_driver.c src/nwfilter/nwfilter_ebiptables_driver.c diff --git a/src/Makefile.am b/src/Makefile.am index 02db71b0f16e..a552fd42599b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -204,7 +204,6 @@ util/virkeymaps.h: $(srcdir)/util/keymaps.csv \ <$(srcdir)/util/keymaps.csv >util/virkeymaps.h # Internal generic driver infrastructure -NODE_INFO_SOURCES = nodeinfo.h nodeinfo.c DATATYPES_SOURCES = datatypes.h datatypes.c DRIVER_SOURCES = \ driver.c driver.h \ @@ -219,7 +218,6 @@ DRIVER_SOURCES = \ driver-stream.h \ internal.h \ $(DATATYPES_SOURCES) \ - $(NODE_INFO_SOURCES) \ libvirt.c libvirt_internal.h \ libvirt-domain.c \ libvirt-domain-snapshot.c \ @@ -3167,7 +3165,6 @@ libexec_PROGRAMS += libvirt_lxc libvirt_lxc_SOURCES = \ $(LXC_CONTROLLER_SOURCES) \ - $(NODE_INFO_SOURCES) \ $(DATATYPES_SOURCES) libvirt_lxc_LDFLAGS = \ $(AM_LDFLAGS) \ diff --git a/src/bhyve/bhyve_capabilities.c b/src/bhyve/bhyve_capabilities.c index 169f3644bcbc..29ccc2d97d8f 100644 --- a/src/bhyve/bhyve_capabilities.c +++ b/src/bhyve/bhyve_capabilities.c @@ -31,7 +31,6 @@ #include "virlog.h" #include "virstring.h" #include "cpu/cpu.h" -#include "nodeinfo.h" #include "domain_conf.h" #include "vircommand.h" #include "bhyve_capabilities.h" diff --git a/src/bhyve/bhyve_driver.c b/src/bhyve/bhyve_driver.c index 380af39b0b2a..74cc5ab219cc 100644 --- a/src/bhyve/bhyve_driver.c +++ b/src/bhyve/bhyve_driver.c @@ -50,7 +50,6 @@ #include "virstring.h" #include "cpu/cpu.h" #include "viraccessapicheck.h" -#include "nodeinfo.h" #include "virhostcpu.h" #include "virhostmem.h" #include "conf/domain_capabilities.h" @@ -1207,12 +1206,12 @@ bhyveNodeGetMemoryStats(virConnectPtr conn, static int bhyveNodeGetInfo(virConnectPtr conn, - virNodeInfoPtr nodeinfo) + virNodeInfoPtr nodeinfo) { if (virNodeGetInfoEnsureACL(conn) < 0) return -1; - return nodeGetInfo(nodeinfo); + return virCapabilitiesGetNodeInfo(nodeinfo); } static int diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 87e274c06675..d798d5364cc2 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -23,19 +23,36 @@ #include <config.h> +#include <stdio.h> +#include <string.h> #include <strings.h> +#include <stdlib.h> +#include <stdint.h> +#include <unistd.h> #include "capabilities.h" -#include "virbuffer.h" -#include "viralloc.h" -#include "viruuid.h" +#include "count-one-bits.h" #include "cpu_conf.h" +#include "domain_conf.h" +#include "physmem.h" +#include "viralloc.h" +#include "virarch.h" +#include "virbuffer.h" #include "virerror.h" +#include "virfile.h" +#include "virhostcpu.h" +#include "virhostmem.h" +#include "virlog.h" +#include "virnuma.h" #include "virstring.h" -#include "domain_conf.h" +#include "virsysfs.h" +#include "virtypedparam.h" +#include "viruuid.h" #define VIR_FROM_THIS VIR_FROM_CAPABILITIES +VIR_LOG_INIT("conf.capabilities") + VIR_ENUM_DECL(virCapsHostPMTarget) VIR_ENUM_IMPL(virCapsHostPMTarget, VIR_NODE_SUSPEND_TARGET_LAST, "suspend_mem", "suspend_disk", "suspend_hybrid"); @@ -1128,3 +1145,271 @@ virCapabilitiesGetCpusForNodemask(virCapsPtr caps, return ret; } + + +int +virCapabilitiesGetNodeInfo(virNodeInfoPtr nodeinfo) +{ + virArch hostarch = virArchFromHost(); + unsigned long long memorybytes; + + memset(nodeinfo, 0, sizeof(*nodeinfo)); + + if (virStrcpyStatic(nodeinfo->model, virArchToString(hostarch)) == NULL) + return -1; + + if (virHostMemGetInfo(&memorybytes, NULL) < 0) + return -1; + nodeinfo->memory = memorybytes / 1024; + + if (virHostCPUGetInfo(hostarch, + &nodeinfo->cpus, &nodeinfo->mhz, + &nodeinfo->nodes, &nodeinfo->sockets, + &nodeinfo->cores, &nodeinfo->threads) < 0) + return -1; + + return 0; +} + +/* returns 1 on success, 0 if the detection failed and -1 on hard error */ +static int +virCapabilitiesFillCPUInfo(int cpu_id ATTRIBUTE_UNUSED, + virCapsHostNUMACellCPUPtr cpu ATTRIBUTE_UNUSED) +{ +#ifdef __linux__ + cpu->id = cpu_id; + + if (virHostCPUGetSocket(cpu_id, &cpu->socket_id) < 0 || + virHostCPUGetCore(cpu_id, &cpu->core_id) < 0) + return -1; + + if (!(cpu->siblings = virHostCPUGetSiblingsList(cpu_id))) + return -1; + + return 0; +#else + virReportError(VIR_ERR_NO_SUPPORT, "%s", + _("node cpu info not implemented on this platform")); + return -1; +#endif +} + +static int +virCapabilitiesGetNUMASiblingInfo(int node, + virCapsHostNUMACellSiblingInfoPtr *siblings, + int *nsiblings) +{ + virCapsHostNUMACellSiblingInfoPtr tmp = NULL; + int tmp_size = 0; + int ret = -1; + int *distances = NULL; + int ndistances = 0; + size_t i; + + if (virNumaGetDistances(node, &distances, &ndistances) < 0) + goto cleanup; + + if (!distances) { + *siblings = NULL; + *nsiblings = 0; + return 0; + } + + if (VIR_ALLOC_N(tmp, ndistances) < 0) + goto cleanup; + + for (i = 0; i < ndistances; i++) { + if (!distances[i]) + continue; + + tmp[tmp_size].node = i; + tmp[tmp_size].distance = distances[i]; + tmp_size++; + } + + if (VIR_REALLOC_N(tmp, tmp_size) < 0) + goto cleanup; + + *siblings = tmp; + *nsiblings = tmp_size; + tmp = NULL; + tmp_size = 0; + ret = 0; + cleanup: + VIR_FREE(distances); + VIR_FREE(tmp); + return ret; +} + +static int +virCapabilitiesGetNUMAPagesInfo(int node, + virCapsHostNUMACellPageInfoPtr *pageinfo, + int *npageinfo) +{ + int ret = -1; + unsigned int *pages_size = NULL, *pages_avail = NULL; + size_t npages, i; + + if (virNumaGetPages(node, &pages_size, &pages_avail, NULL, &npages) < 0) + goto cleanup; + + if (VIR_ALLOC_N(*pageinfo, npages) < 0) + goto cleanup; + *npageinfo = npages; + + for (i = 0; i < npages; i++) { + (*pageinfo)[i].size = pages_size[i]; + (*pageinfo)[i].avail = pages_avail[i]; + } + + ret = 0; + + cleanup: + VIR_FREE(pages_avail); + VIR_FREE(pages_size); + return ret; +} + + +static int +virCapabilitiesInitNUMAFake(virCapsPtr caps) +{ + virNodeInfo nodeinfo; + virCapsHostNUMACellCPUPtr cpus; + int ncpus; + int s, c, t; + int id, cid; + int onlinecpus ATTRIBUTE_UNUSED; + bool tmp; + + if (virCapabilitiesGetNodeInfo(&nodeinfo) < 0) + return -1; + + ncpus = VIR_NODEINFO_MAXCPUS(nodeinfo); + onlinecpus = nodeinfo.cpus; + + if (VIR_ALLOC_N(cpus, ncpus) < 0) + return -1; + + id = cid = 0; + for (s = 0; s < nodeinfo.sockets; s++) { + for (c = 0; c < nodeinfo.cores; c++) { + for (t = 0; t < nodeinfo.threads; t++) { + if (virHostCPUGetOnline(id, &tmp) < 0) + goto error; + if (tmp) { + cpus[cid].id = id; + cpus[cid].socket_id = s; + cpus[cid].core_id = c; + if (!(cpus[cid].siblings = virBitmapNew(ncpus))) + goto error; + ignore_value(virBitmapSetBit(cpus[cid].siblings, id)); + cid++; + } + + id++; + } + } + } + + if (virCapabilitiesAddHostNUMACell(caps, 0, + nodeinfo.memory, +#ifdef __linux__ + onlinecpus, cpus, +#else + ncpus, cpus, +#endif + 0, NULL, + 0, NULL) < 0) + goto error; + + return 0; + + error: + for (; id >= 0; id--) + virBitmapFree(cpus[id].siblings); + VIR_FREE(cpus); + return -1; +} + +int +virCapabilitiesInitNUMA(virCapsPtr caps) +{ + int n; + unsigned long long memory; + virCapsHostNUMACellCPUPtr cpus = NULL; + virBitmapPtr cpumap = NULL; + virCapsHostNUMACellSiblingInfoPtr siblings = NULL; + int nsiblings = 0; + virCapsHostNUMACellPageInfoPtr pageinfo = NULL; + int npageinfo; + int ret = -1; + int ncpus = 0; + int cpu; + bool topology_failed = false; + int max_node; + + if (!virNumaIsAvailable()) + return virCapabilitiesInitNUMAFake(caps); + + if ((max_node = virNumaGetMaxNode()) < 0) + goto cleanup; + + for (n = 0; n <= max_node; n++) { + size_t i; + + if ((ncpus = virNumaGetNodeCPUs(n, &cpumap)) < 0) { + if (ncpus == -2) + continue; + + goto cleanup; + } + + if (VIR_ALLOC_N(cpus, ncpus) < 0) + goto cleanup; + cpu = 0; + + for (i = 0; i < virBitmapSize(cpumap); i++) { + if (virBitmapIsBitSet(cpumap, i)) { + if (virCapabilitiesFillCPUInfo(i, cpus + cpu++) < 0) { + topology_failed = true; + virResetLastError(); + } + } + } + + if (virCapabilitiesGetNUMASiblingInfo(n, &siblings, &nsiblings) < 0) + goto cleanup; + + if (virCapabilitiesGetNUMAPagesInfo(n, &pageinfo, &npageinfo) < 0) + goto cleanup; + + /* Detect the amount of memory in the numa cell in KiB */ + virNumaGetNodeMemory(n, &memory, NULL); + memory >>= 10; + + if (virCapabilitiesAddHostNUMACell(caps, n, memory, + ncpus, cpus, + nsiblings, siblings, + npageinfo, pageinfo) < 0) + goto cleanup; + + cpus = NULL; + siblings = NULL; + pageinfo = NULL; + virBitmapFree(cpumap); + cpumap = NULL; + } + + ret = 0; + + cleanup: + if ((topology_failed || ret < 0) && cpus) + virCapabilitiesClearHostNUMACellCPUTopology(cpus, ncpus); + + virBitmapFree(cpumap); + VIR_FREE(cpus); + VIR_FREE(siblings); + VIR_FREE(pageinfo); + return ret; +} diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index 8634fda14458..3cb305b50b4a 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -297,4 +297,8 @@ virCapabilitiesFormatXML(virCapsPtr caps); virBitmapPtr virCapabilitiesGetCpusForNodemask(virCapsPtr caps, virBitmapPtr nodemask); +int virCapabilitiesGetNodeInfo(virNodeInfoPtr nodeinfo); + +int virCapabilitiesInitNUMA(virCapsPtr caps); + #endif /* __VIR_CAPABILITIES_H */ diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 484f5fceb090..b88f9955f358 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -26,13 +26,13 @@ #include "virlog.h" #include "viralloc.h" #include "virxml.h" -#include "nodeinfo.h" #include "cpu.h" #include "cpu_map.h" #include "cpu_x86.h" #include "cpu_ppc64.h" #include "cpu_s390.h" #include "cpu_arm.h" +#include "capabilities.h" #include "virstring.h" @@ -468,7 +468,7 @@ virCPUProbeHost(virArch arch) { virNodeInfo nodeinfo; - if (nodeGetInfo(&nodeinfo)) + if (virCapabilitiesGetNodeInfo(&nodeinfo)) return NULL; return virCPUGetHost(arch, VIR_CPU_TYPE_HOST, &nodeinfo, NULL, 0); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 25773364f3bd..06de179554ab 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -57,7 +57,9 @@ virCapabilitiesFreeGuest; virCapabilitiesFreeMachines; virCapabilitiesFreeNUMAInfo; virCapabilitiesGetCpusForNodemask; +virCapabilitiesGetNodeInfo; virCapabilitiesHostSecModelAddBaseLabel; +virCapabilitiesInitNUMA; virCapabilitiesNew; virCapabilitiesSetHostCPU; virCapabilitiesSetNetPrefix; @@ -1131,11 +1133,6 @@ virLogManagerFree; virLogManagerNew; -# nodeinfo.h -nodeCapsInitNUMA; -nodeGetInfo; - - # secret/secret_util.h virSecretGetSecretString; diff --git a/src/lxc/lxc_conf.c b/src/lxc/lxc_conf.c index 538bbbe87d3f..e47b667f582a 100644 --- a/src/lxc/lxc_conf.c +++ b/src/lxc/lxc_conf.c @@ -28,7 +28,6 @@ #include "lxc_conf.h" #include "lxc_domain.h" -#include "nodeinfo.h" #include "virerror.h" #include "virconf.h" #include "viralloc.h" @@ -77,7 +76,7 @@ virCapsPtr virLXCDriverCapsInit(virLXCDriverPtr driver) * unexpected failures. We don't want to break the lxc * driver in this scenario, so log errors & carry on */ - if (nodeCapsInitNUMA(caps) < 0) { + if (virCapabilitiesInitNUMA(caps) < 0) { virCapabilitiesFreeNUMAInfo(caps); VIR_WARN("Failed to query host NUMA topology, disabling NUMA capabilities"); } diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 5dbd5a6c242c..ecd5fbdd4de1 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -57,7 +57,6 @@ #include "virnetdevbridge.h" #include "virnetdevveth.h" #include "virnetdevopenvswitch.h" -#include "nodeinfo.h" #include "virhostcpu.h" #include "virhostmem.h" #include "viruuid.h" @@ -5171,7 +5170,7 @@ lxcNodeGetInfo(virConnectPtr conn, if (virNodeGetInfoEnsureACL(conn) < 0) return -1; - return nodeGetInfo(nodeinfo); + return virCapabilitiesGetNodeInfo(nodeinfo); } diff --git a/src/nodeinfo.c b/src/nodeinfo.c deleted file mode 100644 index f2ded025dc0a..000000000000 --- a/src/nodeinfo.c +++ /dev/null @@ -1,418 +0,0 @@ -/* - * nodeinfo.c: Helper routines for OS specific node information - * - * Copyright (C) 2006-2008, 2010-2015 Red Hat, Inc. - * Copyright (C) 2006 Daniel P. Berrange - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see - * <http://www.gnu.org/licenses/>. - * - * Author: Daniel P. Berrange <berrange@xxxxxxxxxx> - */ - -#include <config.h> - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <stdint.h> -#include <errno.h> -#include <sys/utsname.h> -#include "conf/domain_conf.h" -#include <fcntl.h> -#include <sys/ioctl.h> -#include <unistd.h> - -#include "viralloc.h" -#include "nodeinfo.h" -#include "virhostcpu.h" -#include "virhostmem.h" -#include "physmem.h" -#include "virerror.h" -#include "count-one-bits.h" -#include "intprops.h" -#include "virarch.h" -#include "virfile.h" -#include "virtypedparam.h" -#include "virstring.h" -#include "virnuma.h" -#include "virlog.h" - -#define VIR_FROM_THIS VIR_FROM_NONE - -VIR_LOG_INIT("nodeinfo"); - - - -#ifdef __linux__ -# define SYSFS_SYSTEM_PATH "/sys/devices/system" -# define SYSFS_THREAD_SIBLINGS_LIST_LENGTH_MAX 8192 - - -/* Return the positive decimal contents of the given - * DIR/cpu%u/FILE, or -1 on error. If DEFAULT_VALUE is non-negative - * and the file could not be found, return that instead of an error; - * this is useful for machines that cannot hot-unplug cpu0, or where - * hot-unplugging is disabled, or where the kernel is too old - * to support NUMA cells, etc. */ -static int -virNodeGetCpuValue(const char *dir, unsigned int cpu, const char *file, - int default_value) -{ - char *path; - FILE *pathfp; - int value = -1; - char value_str[INT_BUFSIZE_BOUND(value)]; - char *tmp; - - if (virAsprintf(&path, "%s/cpu%u/%s", dir, cpu, file) < 0) - return -1; - - pathfp = fopen(path, "r"); - if (pathfp == NULL) { - if (default_value >= 0 && errno == ENOENT) - value = default_value; - else - virReportSystemError(errno, _("cannot open %s"), path); - goto cleanup; - } - - if (fgets(value_str, sizeof(value_str), pathfp) == NULL) { - virReportSystemError(errno, _("cannot read from %s"), path); - goto cleanup; - } - if (virStrToLong_i(value_str, &tmp, 10, &value) < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, - _("could not convert '%s' to an integer"), - value_str); - goto cleanup; - } - - cleanup: - VIR_FORCE_FCLOSE(pathfp); - VIR_FREE(path); - - return value; -} - - -static virBitmapPtr -virNodeGetSiblingsListLinux(const char *dir, int cpu_id) -{ - char *path = NULL; - char *buf = NULL; - virBitmapPtr ret = NULL; - - if (virAsprintf(&path, "%s/cpu%u/topology/thread_siblings_list", - dir, cpu_id) < 0) - goto cleanup; - - if (virFileReadAll(path, SYSFS_THREAD_SIBLINGS_LIST_LENGTH_MAX, &buf) < 0) - goto cleanup; - - if (virBitmapParse(buf, &ret, virNumaGetMaxCPUs()) < 0) - goto cleanup; - - cleanup: - VIR_FREE(buf); - VIR_FREE(path); - return ret; -} -#else -# define SYSFS_SYSTEM_PATH "fake" -#endif - - -int -nodeGetInfo(virNodeInfoPtr nodeinfo) -{ - virArch hostarch = virArchFromHost(); - unsigned long long memorybytes; - - memset(nodeinfo, 0, sizeof(*nodeinfo)); - - if (virStrcpyStatic(nodeinfo->model, virArchToString(hostarch)) == NULL) - return -1; - - if (virHostMemGetInfo(&memorybytes, NULL) < 0) - return -1; - nodeinfo->memory = memorybytes / 1024; - - if (virHostCPUGetInfo(hostarch, - &nodeinfo->cpus, &nodeinfo->mhz, - &nodeinfo->nodes, &nodeinfo->sockets, - &nodeinfo->cores, &nodeinfo->threads) < 0) - return -1; - - return 0; -} - - -static int -nodeCapsInitNUMAFake(const char *cpupath ATTRIBUTE_UNUSED, - virCapsPtr caps ATTRIBUTE_UNUSED) -{ - virNodeInfo nodeinfo; - virCapsHostNUMACellCPUPtr cpus; - int ncpus; - int s, c, t; - int id, cid; - int onlinecpus ATTRIBUTE_UNUSED; - - if (nodeGetInfo(&nodeinfo) < 0) - return -1; - - ncpus = VIR_NODEINFO_MAXCPUS(nodeinfo); - onlinecpus = nodeinfo.cpus; - - if (VIR_ALLOC_N(cpus, ncpus) < 0) - return -1; - - id = cid = 0; - for (s = 0; s < nodeinfo.sockets; s++) { - for (c = 0; c < nodeinfo.cores; c++) { - for (t = 0; t < nodeinfo.threads; t++) { -#ifdef __linux__ - if (virNodeGetCpuValue(cpupath, id, "online", 1)) { -#endif - cpus[cid].id = id; - cpus[cid].socket_id = s; - cpus[cid].core_id = c; - if (!(cpus[cid].siblings = virBitmapNew(ncpus))) - goto error; - ignore_value(virBitmapSetBit(cpus[cid].siblings, id)); - cid++; -#ifdef __linux__ - } -#endif - - id++; - } - } - } - - if (virCapabilitiesAddHostNUMACell(caps, 0, - nodeinfo.memory, -#ifdef __linux__ - onlinecpus, cpus, -#else - ncpus, cpus, -#endif - 0, NULL, - 0, NULL) < 0) - goto error; - - return 0; - - error: - for (; id >= 0; id--) - virBitmapFree(cpus[id].siblings); - VIR_FREE(cpus); - return -1; -} - - -/* returns 1 on success, 0 if the detection failed and -1 on hard error */ -static int -virNodeCapsFillCPUInfo(const char *cpupath ATTRIBUTE_UNUSED, - int cpu_id ATTRIBUTE_UNUSED, - virCapsHostNUMACellCPUPtr cpu ATTRIBUTE_UNUSED) -{ -#ifdef __linux__ - int tmp; - cpu->id = cpu_id; - - if ((tmp = virNodeGetCpuValue(cpupath, cpu_id, - "topology/physical_package_id", -1)) < 0) - return 0; - - cpu->socket_id = tmp; - - if ((tmp = virNodeGetCpuValue(cpupath, cpu_id, - "topology/core_id", -1)) < 0) - return 0; - - cpu->core_id = tmp; - - if (!(cpu->siblings = virNodeGetSiblingsListLinux(cpupath, cpu_id))) - return -1; - - return 0; -#else - virReportError(VIR_ERR_NO_SUPPORT, "%s", - _("node cpu info not implemented on this platform")); - return -1; -#endif -} - -static int -virNodeCapsGetSiblingInfo(int node, - virCapsHostNUMACellSiblingInfoPtr *siblings, - int *nsiblings) -{ - virCapsHostNUMACellSiblingInfoPtr tmp = NULL; - int tmp_size = 0; - int ret = -1; - int *distances = NULL; - int ndistances = 0; - size_t i; - - if (virNumaGetDistances(node, &distances, &ndistances) < 0) - goto cleanup; - - if (!distances) { - *siblings = NULL; - *nsiblings = 0; - return 0; - } - - if (VIR_ALLOC_N(tmp, ndistances) < 0) - goto cleanup; - - for (i = 0; i < ndistances; i++) { - if (!distances[i]) - continue; - - tmp[tmp_size].node = i; - tmp[tmp_size].distance = distances[i]; - tmp_size++; - } - - if (VIR_REALLOC_N(tmp, tmp_size) < 0) - goto cleanup; - - *siblings = tmp; - *nsiblings = tmp_size; - tmp = NULL; - tmp_size = 0; - ret = 0; - cleanup: - VIR_FREE(distances); - VIR_FREE(tmp); - return ret; -} - -static int -virNodeCapsGetPagesInfo(int node, - virCapsHostNUMACellPageInfoPtr *pageinfo, - int *npageinfo) -{ - int ret = -1; - unsigned int *pages_size = NULL, *pages_avail = NULL; - size_t npages, i; - - if (virNumaGetPages(node, &pages_size, &pages_avail, NULL, &npages) < 0) - goto cleanup; - - if (VIR_ALLOC_N(*pageinfo, npages) < 0) - goto cleanup; - *npageinfo = npages; - - for (i = 0; i < npages; i++) { - (*pageinfo)[i].size = pages_size[i]; - (*pageinfo)[i].avail = pages_avail[i]; - } - - ret = 0; - - cleanup: - VIR_FREE(pages_avail); - VIR_FREE(pages_size); - return ret; -} - -int -nodeCapsInitNUMA(virCapsPtr caps) -{ - int n; - unsigned long long memory; - virCapsHostNUMACellCPUPtr cpus = NULL; - virBitmapPtr cpumap = NULL; - virCapsHostNUMACellSiblingInfoPtr siblings = NULL; - int nsiblings = 0; - virCapsHostNUMACellPageInfoPtr pageinfo = NULL; - int npageinfo; - int ret = -1; - int ncpus = 0; - int cpu; - bool topology_failed = false; - int max_node; - - if (!virNumaIsAvailable()) { - ret = nodeCapsInitNUMAFake(SYSFS_SYSTEM_PATH "/cpu", caps); - goto cleanup; - } - - if ((max_node = virNumaGetMaxNode()) < 0) - goto cleanup; - - for (n = 0; n <= max_node; n++) { - size_t i; - - if ((ncpus = virNumaGetNodeCPUs(n, &cpumap)) < 0) { - if (ncpus == -2) - continue; - - goto cleanup; - } - - if (VIR_ALLOC_N(cpus, ncpus) < 0) - goto cleanup; - cpu = 0; - - for (i = 0; i < virBitmapSize(cpumap); i++) { - if (virBitmapIsBitSet(cpumap, i)) { - if (virNodeCapsFillCPUInfo(SYSFS_SYSTEM_PATH "/cpu", - i, cpus + cpu++) < 0) { - topology_failed = true; - virResetLastError(); - } - } - } - - if (virNodeCapsGetSiblingInfo(n, &siblings, &nsiblings) < 0) - goto cleanup; - - if (virNodeCapsGetPagesInfo(n, &pageinfo, &npageinfo) < 0) - goto cleanup; - - /* Detect the amount of memory in the numa cell in KiB */ - virNumaGetNodeMemory(n, &memory, NULL); - memory >>= 10; - - if (virCapabilitiesAddHostNUMACell(caps, n, memory, - ncpus, cpus, - nsiblings, siblings, - npageinfo, pageinfo) < 0) - goto cleanup; - - cpus = NULL; - siblings = NULL; - pageinfo = NULL; - virBitmapFree(cpumap); - cpumap = NULL; - } - - ret = 0; - - cleanup: - if ((topology_failed || ret < 0) && cpus) - virCapabilitiesClearHostNUMACellCPUTopology(cpus, ncpus); - - virBitmapFree(cpumap); - VIR_FREE(cpus); - VIR_FREE(siblings); - VIR_FREE(pageinfo); - return ret; -} diff --git a/src/nodeinfo.h b/src/nodeinfo.h deleted file mode 100644 index 3c4dc46d9553..000000000000 --- a/src/nodeinfo.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * nodeinfo.h: Helper routines for OS specific node information - * - * Copyright (C) 2006-2008, 2011-2012 Red Hat, Inc. - * Copyright (C) 2006 Daniel P. Berrange - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see - * <http://www.gnu.org/licenses/>. - * - * Author: Daniel P. Berrange <berrange@xxxxxxxxxx> - */ - -#ifndef __VIR_NODEINFO_H__ -# define __VIR_NODEINFO_H__ - -# include "capabilities.h" - -int nodeGetInfo(virNodeInfoPtr nodeinfo); -int nodeCapsInitNUMA(virCapsPtr caps); - -#endif /* __VIR_NODEINFO_H__*/ diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c index e4d7634d2eff..196fefb8de19 100644 --- a/src/openvz/openvz_conf.c +++ b/src/openvz/openvz_conf.c @@ -47,7 +47,6 @@ #include "viruuid.h" #include "virbuffer.h" #include "viralloc.h" -#include "nodeinfo.h" #include "virfile.h" #include "vircommand.h" #include "virstring.h" @@ -166,7 +165,7 @@ virCapsPtr openvzCapsInit(void) false, false)) == NULL) goto no_memory; - if (nodeCapsInitNUMA(caps) < 0) + if (virCapabilitiesInitNUMA(caps) < 0) goto no_memory; if ((guest = virCapabilitiesAddGuest(caps, diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c index 01ad7628455a..647c8522ddb5 100644 --- a/src/openvz/openvz_driver.c +++ b/src/openvz/openvz_driver.c @@ -48,7 +48,6 @@ #include "openvz_util.h" #include "virbuffer.h" #include "openvz_conf.h" -#include "nodeinfo.h" #include "virhostcpu.h" #include "virhostmem.h" #include "viralloc.h" @@ -2162,7 +2161,7 @@ static int openvzNodeGetInfo(virConnectPtr conn ATTRIBUTE_UNUSED, virNodeInfoPtr nodeinfo) { - return nodeGetInfo(nodeinfo); + return virCapabilitiesGetNodeInfo(nodeinfo); } diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c index 39fa0264ccf8..1803aa53b744 100644 --- a/src/phyp/phyp_driver.c +++ b/src/phyp/phyp_driver.c @@ -53,7 +53,6 @@ #include "viruuid.h" #include "domain_conf.h" #include "storage_conf.h" -#include "nodeinfo.h" #include "virfile.h" #include "interface_conf.h" #include "phyp_driver.h" @@ -335,7 +334,7 @@ phypCapsInit(void) * unexpected failures. We don't want to break the QEMU * driver in this scenario, so log errors & carry on */ - if (nodeCapsInitNUMA(caps) < 0) { + if (virCapabilitiesInitNUMA(caps) < 0) { virCapabilitiesFreeNUMAInfo(caps); VIR_WARN ("Failed to query host NUMA topology, disabling NUMA capabilities"); diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 8e7b20ba187c..7dafbbc61524 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -31,7 +31,6 @@ #include "virfile.h" #include "virpidfile.h" #include "virprocess.h" -#include "nodeinfo.h" #include "cpu/cpu.h" #include "cpu/cpu_x86.h" #include "domain_conf.h" @@ -1122,7 +1121,7 @@ virCapsPtr virQEMUCapsInit(virQEMUCapsCachePtr cache) * unexpected failures. We don't want to break the QEMU * driver in this scenario, so log errors & carry on */ - if (nodeCapsInitNUMA(caps) < 0) { + if (virCapabilitiesInitNUMA(caps) < 0) { virCapabilitiesFreeNUMAInfo(caps); VIR_WARN("Failed to query host NUMA topology, disabling NUMA capabilities"); } diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 0a338d72e75f..53e55df88fb0 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -45,7 +45,6 @@ #include "viralloc.h" #include "datatypes.h" #include "virxml.h" -#include "nodeinfo.h" #include "virlog.h" #include "cpu/cpu.h" #include "domain_nwfilter.h" diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b3137954ad80..98f0586ce26b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -63,7 +63,6 @@ #include "virlog.h" #include "datatypes.h" #include "virbuffer.h" -#include "nodeinfo.h" #include "virhostcpu.h" #include "virhostmem.h" #include "virnetdevtap.h" @@ -18295,7 +18294,7 @@ qemuNodeGetInfo(virConnectPtr conn, if (virNodeGetInfoEnsureACL(conn) < 0) return -1; - return nodeGetInfo(nodeinfo); + return virCapabilitiesGetNodeInfo(nodeinfo); } diff --git a/src/uml/uml_conf.c b/src/uml/uml_conf.c index 4663c7dee83a..871653c5a64c 100644 --- a/src/uml/uml_conf.c +++ b/src/uml/uml_conf.c @@ -39,7 +39,6 @@ #include "virbuffer.h" #include "virconf.h" #include "viralloc.h" -#include "nodeinfo.h" #include "virlog.h" #include "domain_nwfilter.h" #include "virfile.h" @@ -65,7 +64,7 @@ virCapsPtr umlCapsInit(void) * unexpected failures. We don't want to break the QEMU * driver in this scenario, so log errors & carry on */ - if (nodeCapsInitNUMA(caps) < 0) { + if (virCapabilitiesInitNUMA(caps) < 0) { virCapabilitiesFreeNUMAInfo(caps); VIR_WARN("Failed to query host NUMA topology, disabling NUMA capabilities"); } diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index 18e62663ca86..f03fdbf68fd6 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -45,7 +45,6 @@ #include "uml_driver.h" #include "uml_conf.h" #include "virbuffer.h" -#include "nodeinfo.h" #include "virhostcpu.h" #include "virhostmem.h" #include "capabilities.h" @@ -2770,7 +2769,7 @@ umlNodeGetInfo(virConnectPtr conn, if (virNodeGetInfoEnsureACL(conn) < 0) return -1; - return nodeGetInfo(nodeinfo); + return virCapabilitiesGetNodeInfo(nodeinfo); } diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index a64d2e89a9bd..b71506ae5dc3 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -29,7 +29,6 @@ #include "domain_event.h" #include "virlog.h" #include "viralloc.h" -#include "nodeinfo.h" #include "virhostmem.h" #include "virstring.h" #include "virfile.h" @@ -77,7 +76,7 @@ vboxCapsInit(void) false, false)) == NULL) goto no_memory; - if (nodeCapsInitNUMA(caps) < 0) + if (virCapabilitiesInitNUMA(caps) < 0) goto no_memory; if ((guest = virCapabilitiesAddGuest(caps, @@ -7438,7 +7437,7 @@ static int vboxNodeGetInfo(virConnectPtr conn ATTRIBUTE_UNUSED, virNodeInfoPtr nodeinfo) { - return nodeGetInfo(nodeinfo); + return virCapabilitiesGetNodeInfo(nodeinfo); } static int diff --git a/src/vmware/vmware_conf.c b/src/vmware/vmware_conf.c index 3ced61028e97..bf4597c4748a 100644 --- a/src/vmware/vmware_conf.c +++ b/src/vmware/vmware_conf.c @@ -27,7 +27,6 @@ #include "cpu/cpu.h" #include "dirname.h" #include "viralloc.h" -#include "nodeinfo.h" #include "virfile.h" #include "viruuid.h" #include "virerror.h" @@ -66,7 +65,7 @@ vmwareCapsInit(void) false, false)) == NULL) goto error; - if (nodeCapsInitNUMA(caps) < 0) + if (virCapabilitiesInitNUMA(caps) < 0) goto error; /* i686 guests are always supported */ diff --git a/src/vz/vz_driver.c b/src/vz/vz_driver.c index 3536491c3994..88f1960eb178 100644 --- a/src/vz/vz_driver.c +++ b/src/vz/vz_driver.c @@ -47,7 +47,6 @@ #include "configmake.h" #include "virfile.h" #include "virstoragefile.h" -#include "nodeinfo.h" #include "virstring.h" #include "cpu/cpu.h" #include "virtypedparam.h" @@ -116,7 +115,7 @@ vzBuildCapabilities(void) false, false)) == NULL) return NULL; - if (nodeCapsInitNUMA(caps) < 0) + if (virCapabilitiesInitNUMA(caps) < 0) goto error; @@ -129,7 +128,7 @@ vzBuildCapabilities(void) emulators[k], virt_types[k]) < 0) goto error; - if (nodeGetInfo(&nodeinfo)) + if (virCapabilitiesGetNodeInfo(&nodeinfo)) goto error; if (!(caps->host.cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST, @@ -925,7 +924,7 @@ vzNodeGetInfo(virConnectPtr conn, if (virNodeGetInfoEnsureACL(conn) < 0) return -1; - return nodeGetInfo(nodeinfo); + return virCapabilitiesGetNodeInfo(nodeinfo); } static int vzConnectIsEncrypted(virConnectPtr conn ATTRIBUTE_UNUSED) diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c index 3fd17dbee44a..c1a50fdc68c5 100644 --- a/src/vz/vz_sdk.c +++ b/src/vz/vz_sdk.c @@ -26,7 +26,6 @@ #include "virerror.h" #include "viralloc.h" #include "virstring.h" -#include "nodeinfo.h" #include "virlog.h" #include "datatypes.h" #include "domain_conf.h" diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index c88e7ea00751..5a94ad79e64c 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -64,7 +64,6 @@ #include "viruri.h" #include "vircommand.h" #include "virnodesuspend.h" -#include "nodeinfo.h" #include "virhostmem.h" #include "configmake.h" #include "virstring.h" diff --git a/tests/commandtest.c b/tests/commandtest.c index 7bf5447ad269..bfbf6a42f611 100644 --- a/tests/commandtest.c +++ b/tests/commandtest.c @@ -31,7 +31,6 @@ #include "testutils.h" #include "internal.h" -#include "nodeinfo.h" #include "viralloc.h" #include "vircommand.h" #include "virfile.h" -- 2.12.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list