diff --git a/po/POTFILES.in b/po/POTFILES.in index 2002e68894..4cffb53506 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 efaa724139..23fc2120df 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 \ @@ -3168,7 +3166,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 875ee4ad5d..381cc0de37 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 380af39b0b..74cc5ab219 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 87e274c066..d798d5364c 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -23,19 +23,36 @@ #include +#include +#include #include +#include +#include +#include #include "capabilities.h" -#include "virbuffer.h" -#include "viralloc.h" -#include "viruuid.h" +#include "count-one-bits.h" #include "cpu_conf.h" -#include "virerror.h" -#include "virstring.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 "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 8634fda144..3cb305b50b 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 484f5fceb0..b88f9955f3 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 ec6deb8a5d..0365b62519 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; @@ -1133,11 +1135,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 538bbbe87d..e47b667f58 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 5dbd5a6c24..ecd5fbdd4d 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 f2ded025dc..0000000000 --- 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 - * . - * - * Author: Daniel P. Berrange - */ - -#include - -#include -#include -#include -#include -#include -#include -#include "conf/domain_conf.h" -#include -#include -#include - -#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 3c4dc46d95..0000000000 --- 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 - * . - * - * Author: Daniel P. Berrange - */ - -#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 e4d7634d2e..196fefb8de 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 01ad762845..647c8522dd 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 39fa0264cc..1803aa53b7 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 3d00debc52..60d2bbcb23 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" @@ -1124,7 +1123,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 35869d441c..3b33e37bb3 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 68044d8c4d..824b9a569e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -64,7 +64,6 @@ #include "virlog.h" #include "datatypes.h" #include "virbuffer.h" -#include "nodeinfo.h" #include "virhostcpu.h" #include "virhostmem.h" #include "virnetdevtap.h" @@ -18293,7 +18292,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 4663c7dee8..871653c5a6 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 18e62663ca..f03fdbf68f 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 a64d2e89a9..b71506ae5d 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 3ced61028e..bf4597c474 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 3536491c39..88f1960eb1 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 3fd17dbee4..c1a50fdc68 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 c88e7ea007..5a94ad79e6 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 7bf5447ad2..bfbf6a42f6 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"