[libvirt] [PATCH 1/3] nodeinfo: Fix gathering of nodeinfo data structure

Peter Krempa pkrempa at redhat.com
Wed Jun 27 14:13:31 UTC 2012


This patch changes the way data to fill the nodeinfo structure are
gathered. We've gathere the test data by iterating processors an sockets
separately from nodes. The reported data was based solely on information
about core id. Problems arise when eg cores in mulit-processor machines
don't have same id's on both processors or maybe one physical processor
contains more NUMA nodes.

This patch changes the approach how we detect processors and nodes. Now
we start at enumerating nodes and for each node processors, sockets and
threads are enumerated separately. This approach provides acurate data
that comply to docs about the nodeinfo structure. This also enables to
get rid of hacks: see commits 10d9038b744a69c8d4bd29c2e8c012a097481586,
ac9dd4a676f21b5e3ca6dbe0526f2a6709072beb. (Those changes in nodeinfo.c
are efectively reverted by this patch).

This patch also fixes fallout from test caused by missing data in the
test set. Note that output of nodeinfo test 3 changed, as now the
correct node topology is used.
---
 src/nodeinfo.c                                     |  311 ++++++++++++--------
 .../linux-nodeinfo-sysfs-test-2/node/node0/cpu0    |    1 +
 .../linux-nodeinfo-sysfs-test-2/node/node0/cpu1    |    1 +
 .../linux-nodeinfo-sysfs-test-3-cpu-x86-output.txt |    2 +-
 .../linux-nodeinfo-sysfs-test-3/node/node0/cpu0    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node0/cpu12   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node0/cpu16   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node0/cpu20   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node0/cpu4    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node0/cpu8    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node0/meminfo |   38 ++--
 .../linux-nodeinfo-sysfs-test-3/node/node1/cpu24   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node1/cpu28   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node1/cpu32   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node1/cpu36   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node1/cpu40   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node1/cpu44   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node1/meminfo |   36 ++--
 .../linux-nodeinfo-sysfs-test-3/node/node2/cpu11   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node2/cpu15   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node2/cpu19   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node2/cpu23   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node2/cpu3    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node2/cpu7    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node2/meminfo |   38 ++--
 .../linux-nodeinfo-sysfs-test-3/node/node3/cpu27   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node3/cpu31   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node3/cpu35   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node3/cpu39   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node3/cpu43   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node3/cpu47   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node3/meminfo |   38 ++--
 .../linux-nodeinfo-sysfs-test-3/node/node4/cpu10   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node4/cpu14   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node4/cpu18   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node4/cpu2    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node4/cpu22   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node4/cpu6    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node4/meminfo |   38 ++--
 .../linux-nodeinfo-sysfs-test-3/node/node5/cpu26   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node5/cpu30   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node5/cpu34   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node5/cpu38   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node5/cpu42   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node5/cpu46   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node5/meminfo |   38 ++--
 .../linux-nodeinfo-sysfs-test-3/node/node6/cpu1    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node6/cpu13   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node6/cpu17   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node6/cpu21   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node6/cpu5    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node6/cpu9    |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node6/meminfo |   40 ++--
 .../linux-nodeinfo-sysfs-test-3/node/node7/cpu25   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node7/cpu29   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node7/cpu33   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node7/cpu37   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node7/cpu41   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node7/cpu45   |    1 +
 .../linux-nodeinfo-sysfs-test-3/node/node7/meminfo |   38 ++--
 .../linux-nodeinfo-sysfs-test-3/node/possible      |  Bin 4 -> 5 bytes
 61 files changed, 387 insertions(+), 280 deletions(-)
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu0
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu1
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu0
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu12
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu16
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu20
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu4
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu8
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu24
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu28
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu32
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu36
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu40
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu44
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu11
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu15
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu19
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu23
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu3
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu7
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu27
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu31
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu35
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu39
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu43
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu47
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu10
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu14
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu18
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu2
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu22
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu6
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu26
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu30
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu34
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu38
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu42
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu46
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu1
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu13
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu17
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu21
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu5
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu9
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu25
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu29
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu33
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu37
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu41
 create mode 120000 tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu45

diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index 819f954..ae713da 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -188,38 +188,131 @@ virNodeParseSocket(const char *dir, unsigned int cpu)
     return ret;
 }

+/* parses a node entry, returning number of processors in the node and
+ * filling arguments */
 static int
-virNodeParseNode(const char *sysfs_dir)
+virNodeParseNode(const char *node, int *sockets, int *cores, int *threads)
 {
-    char *file = NULL;
-    char *possible = NULL;
-    char *tmp;
     int ret = -1;
+    int processors = 0;
+    DIR *cpudir = NULL;
+    struct dirent *cpudirent = NULL;
+    int sock_max = 0;
+    cpu_set_t sock_map;
+    int sock;
+    cpu_set_t *core_maps = NULL;
+    int core;
+    int i;
+    int siblings;
+    unsigned int cpu;
+    int online;

-    if (virAsprintf(&file, "%s/node/possible", sysfs_dir) < 0) {
-        virReportOOMError();
+    *threads = 0;
+    *cores = 0;
+    *sockets = 0;
+
+    if (!(cpudir = opendir(node))) {
+        virReportSystemError(errno, _("cannot opendir %s"), node);
         goto cleanup;
     }
-    /* Assume that a missing node/possible file implies no NUMA
-     * support, and hence all cpus belong to the same node.  */
-    if (!virFileExists(file)) {
-        ret = 1;
+
+    /* enumerate sockets in the node */
+    CPU_ZERO(&sock_map);
+    while ((cpudirent = readdir(cpudir))) {
+        if (sscanf(cpudirent->d_name, "cpu%u", &cpu) != 1)
+            continue;
+
+        /* Parse socket */
+        sock = virNodeParseSocket(node, cpu);
+        CPU_SET(sock, &sock_map);
+
+        if (sock > sock_max)
+            sock_max = sock;
+    }
+
+    if (errno) {
+        virReportSystemError(errno, _("problem reading %s"), node);
         goto cleanup;
     }
-    if (virFileReadAll(file, 1024, &possible) < 0)
+
+    sock_max++;
+
+    /* allocate cpu maps for each socket */
+    if (VIR_ALLOC_N(core_maps, sock_max) < 0) {
+        virReportOOMError();
         goto cleanup;
-    if (virStrToLong_i(possible, &tmp, 10, &ret) < 0 ||
-        (*tmp == '-' && virStrToLong_i(tmp+1, &tmp, 10, &ret) < 0) ||
-        *tmp != '\n') {
-        nodeReportError(VIR_ERR_INTERNAL_ERROR,
-                        _("failed to parse possible nodes '%s'"), possible);
+    }
+
+    for (i = 0; i < sock_max; i++)
+        CPU_ZERO(&core_maps[i]);
+
+    /* iterate over all CPU's in the node */
+    rewinddir(cpudir);
+    while ((cpudirent = readdir(cpudir))) {
+        if (sscanf(cpudirent->d_name, "cpu%u", &cpu) != 1)
+            continue;
+
+        if ((online = virNodeGetCpuValue(node, cpu, "online", true)) < 0)
+            goto cleanup;
+
+        if (!online)
+            continue;
+
+        processors++;
+
+        /* Parse socket */
+        sock = virNodeParseSocket(node, cpu);
+        if (!CPU_ISSET(sock, &sock_map)) {
+            nodeReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                            _("CPU socket topology has changed"));
+            goto cleanup;
+        }
+
+        /* Parse core */
+# if defined(__s390__) || \
+    defined(__s390x__)
+    /* logical cpu is equivalent to a core on s390 */
+        core = cpu;
+# else
+        core = virNodeGetCpuValue(node, cpu, "topology/core_id", false);
+# endif
+
+        CPU_SET(core, &core_maps[sock]);
+
+        if (!(siblings = virNodeCountThreadSiblings(node, cpu)))
+            goto cleanup;
+
+        if (siblings > *threads)
+            *threads = siblings;
+    }
+
+    if (errno) {
+        virReportSystemError(errno, _("problem reading %s"), node);
         goto cleanup;
     }
-    ret++;
+
+    /* finalize the returned data */
+    *sockets = CPU_COUNT(&sock_map);
+
+    for (i = 0; i < sock_max; i++) {
+        if (!CPU_ISSET(i, &sock_map))
+            continue;
+
+        core = CPU_COUNT(&core_maps[i]);
+        if (core > *cores)
+            *cores = core;
+    }
+
+    ret = processors;

 cleanup:
-    VIR_FREE(file);
-    VIR_FREE(possible);
+    /* don't shadow a more serious error */
+    if (cpudir && closedir(cpudir) < 0 && ret >= 0) {
+        virReportSystemError(errno, _("problem closing %s"), node);
+        ret = -1;
+    }
+    VIR_FREE(core_maps);
+
     return ret;
 }

@@ -228,20 +321,18 @@ int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
                              virNodeInfoPtr nodeinfo)
 {
     char line[1024];
-    DIR *cpudir = NULL;
-    struct dirent *cpudirent = NULL;
-    unsigned int cpu;
-    unsigned long core, sock, cur_threads;
-    cpu_set_t core_mask;
-    cpu_set_t socket_mask;
-    int online;
+    DIR *nodedir = NULL;
+    struct dirent *nodedirent = NULL;
+    int cpus, cores, socks, threads;
+    unsigned int node;
     int ret = -1;
+    char *sysfs_nodedir = NULL;
     char *sysfs_cpudir = NULL;
-    unsigned int cpu_cores = 0;

     nodeinfo->cpus = 0;
     nodeinfo->mhz = 0;
     nodeinfo->cores = 0;
+    nodeinfo->nodes = 0;

     /* Start with parsing /proc/cpuinfo; although it tends to have
      * fewer details.  Hyperthreads are ignored at this stage.  */
@@ -254,40 +345,22 @@ int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
             char *p;
             unsigned int ui;

-            buf += 9;
+            buf += 7;
             while (*buf && c_isspace(*buf))
                 buf++;

             if (*buf != ':' || !buf[1]) {
-                nodeReportError(VIR_ERR_INTERNAL_ERROR,
-                                "%s", _("parsing cpu MHz from cpuinfo"));
+                nodeReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                _("parsing cpu MHz from cpuinfo"));
                 goto cleanup;
             }

-            if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0
+            if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0 &&
                 /* Accept trailing fractional part.  */
-                && (*p == '\0' || *p == '.' || c_isspace(*p)))
+                (*p == '\0' || *p == '.' || c_isspace(*p)))
                 nodeinfo->mhz = ui;
         }

-        if (STRPREFIX(buf, "cpu cores")) {
-            char *p;
-            unsigned int ui;
-
-            buf += 9;
-            while (*buf && c_isspace(*buf))
-                buf++;
-
-            if (*buf != ':' || !buf[1]) {
-                nodeReportError(VIR_ERR_INTERNAL_ERROR,
-                                "%s", _("parsing cpu cores from cpuinfo"));
-                return -1;
-            }
-
-            if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0
-                && (*p == '\0' || c_isspace(*p)))
-                cpu_cores = ui;
-         }
 # elif defined(__powerpc__) || \
       defined(__powerpc64__)
         char *buf = line;
@@ -300,14 +373,14 @@ int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
                 buf++;

             if (*buf != ':' || !buf[1]) {
-                nodeReportError(VIR_ERR_INTERNAL_ERROR,
-                                "%s", _("parsing cpu MHz from cpuinfo"));
+                nodeReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                                _("parsing cpu MHz from cpuinfo"));
                 goto cleanup;
             }

-            if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0
+            if (virStrToLong_ui(buf+1, &p, 10, &ui) == 0 &&
                 /* Accept trailing fractional part.  */
-                && (*p == '\0' || *p == '.' || c_isspace(*p)))
+                (*p == '\0' || *p == '.' || c_isspace(*p)))
                 nodeinfo->mhz = ui;
             /* No other interesting infos are available in /proc/cpuinfo.
              * However, there is a line identifying processor's version,
@@ -328,115 +401,99 @@ int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
     /* OK, we've parsed clock speed out of /proc/cpuinfo. Get the
      * core, node, socket, thread and topology information from /sys
      */
-    if (virAsprintf(&sysfs_cpudir, "%s/cpu", sysfs_dir) < 0) {
+    if (virAsprintf(&sysfs_nodedir, "%s/node", sysfs_dir) < 0) {
         virReportOOMError();
         goto cleanup;
     }
-    cpudir = opendir(sysfs_cpudir);
-    if (cpudir == NULL) {
-        virReportSystemError(errno, _("cannot opendir %s"), sysfs_cpudir);
-        goto cleanup;
+
+    if (!(nodedir = opendir(sysfs_nodedir))) {
+        /* the host isn't probably running a NUMA architecture */
+        goto fallback;
     }

-    CPU_ZERO(&core_mask);
-    CPU_ZERO(&socket_mask);

-    while ((cpudirent = readdir(cpudir))) {
-        if (sscanf(cpudirent->d_name, "cpu%u", &cpu) != 1)
+    while ((nodedirent = readdir(nodedir))) {
+        if (sscanf(nodedirent->d_name, "node%u", &node) != 1)
             continue;

-        online = virNodeGetCpuValue(sysfs_cpudir, cpu, "online", true);
-        if (online < 0) {
-            closedir(cpudir);
+        nodeinfo->nodes++;
+
+        if (virAsprintf(&sysfs_cpudir, "%s/node/%s",
+                        sysfs_dir, nodedirent->d_name) < 0) {
+            virReportOOMError();
             goto cleanup;
         }
-        if (!online)
-            continue;
-        nodeinfo->cpus++;

-        /* Parse core */
-# if defined(__s390__) || \
-    defined(__s390x__)
-    /* logical cpu is equivalent to a core on s390 */
-        core = cpu;
-# else
-        core = virNodeGetCpuValue(sysfs_cpudir, cpu, "topology/core_id", false);
-# endif
-        if (!CPU_ISSET(core, &core_mask)) {
-            CPU_SET(core, &core_mask);
-            nodeinfo->cores++;
-        }
+        if ((cpus = virNodeParseNode(sysfs_cpudir, &socks,
+                                     &cores, &threads)) < 0)
+            goto cleanup;

-        /* Parse socket */
-        sock = virNodeParseSocket(sysfs_cpudir, cpu);
-        if (!CPU_ISSET(sock, &socket_mask)) {
-            CPU_SET(sock, &socket_mask);
-            nodeinfo->sockets++;
-        }
+        VIR_FREE(sysfs_cpudir);

-        cur_threads = virNodeCountThreadSiblings(sysfs_cpudir, cpu);
-        if (cur_threads == 0) {
-            closedir(cpudir);
-            goto cleanup;
-        }
-        if (cur_threads > nodeinfo->threads)
-            nodeinfo->threads = cur_threads;
+        nodeinfo->cpus += cpus;
+
+        if (socks > nodeinfo->sockets)
+            nodeinfo->sockets = socks;
+
+        if (cores > nodeinfo->cores)
+            nodeinfo->cores = cores;
+
+        if (threads > nodeinfo->threads)
+            nodeinfo->threads = threads;
     }
+
     if (errno) {
-        virReportSystemError(errno,
-                             _("problem reading %s"), sysfs_cpudir);
-        closedir(cpudir);
+        virReportSystemError(errno, _("problem reading %s"), sysfs_nodedir);
         goto cleanup;
     }
-    if (closedir(cpudir) < 0) {
-        virReportSystemError(errno,
-                             _("problem closing %s"), sysfs_cpudir);
+
+    if (nodeinfo->cpus && nodeinfo->nodes)
+        goto done;
+
+fallback:
+    VIR_FREE(sysfs_cpudir);
+
+    if (virAsprintf(&sysfs_cpudir, "%s/cpu", sysfs_dir) < 0) {
+        virReportOOMError();
         goto cleanup;
     }

-    if ((nodeinfo->nodes = virNodeParseNode(sysfs_dir)) <= 0)
+    if ((cpus = virNodeParseNode(sysfs_cpudir, &socks, &cores, &threads)) < 0)
         goto cleanup;

+    nodeinfo->nodes = 1;
+    nodeinfo->cpus = cpus;
+    nodeinfo->sockets = socks;
+    nodeinfo->cores = cores;
+    nodeinfo->threads = threads;
+
+done:
     /* There should always be at least one cpu, socket, node, and thread. */
     if (nodeinfo->cpus == 0) {
-        nodeReportError(VIR_ERR_INTERNAL_ERROR,
-                        "%s", _("no CPUs found"));
+        nodeReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("no CPUs found"));
         goto cleanup;
     }
+
     if (nodeinfo->sockets == 0) {
-        nodeReportError(VIR_ERR_INTERNAL_ERROR,
-                        "%s", _("no sockets found"));
+        nodeReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("no sockets found"));
         goto cleanup;
     }
+
     if (nodeinfo->threads == 0) {
-        nodeReportError(VIR_ERR_INTERNAL_ERROR,
-                        "%s", _("no threads found"));
+        nodeReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("no threads found"));
         goto cleanup;
     }

-    /* Platform like AMD Magny Cours has two NUMA nodes each package, and
-     * the two nodes share the same core ID set, it results in the cores
-     * number calculated from sysfs is not the actual cores number. Use
-     * "cpu cores" in /proc/cpuinfo as the cores number instead in this case.
-     * More details about the problem:
-     * https://www.redhat.com/archives/libvir-list/2012-May/msg00607.html
-     */
-    if (cpu_cores && (cpu_cores > nodeinfo->cores))
-        nodeinfo->cores = cpu_cores;
-
-    /* nodeinfo->sockets is supposed to be a number of sockets per NUMA node,
-     * however if NUMA nodes are not composed of whole sockets, we just lie
-     * about the number of NUMA nodes and force apps to check capabilities XML
-     * for the actual NUMA topology.
-     */
-    if (nodeinfo->sockets % nodeinfo->nodes == 0)
-        nodeinfo->sockets /= nodeinfo->nodes;
-    else
-        nodeinfo->nodes = 1;
-
     ret = 0;

 cleanup:
+    /* don't shadow a more serious error */
+    if (nodedir && closedir(nodedir) < 0 && ret >= 0) {
+        virReportSystemError(errno, _("problem closing %s"), sysfs_nodedir);
+        ret = -1;
+    }
+
+    VIR_FREE(sysfs_nodedir);
     VIR_FREE(sysfs_cpudir);
     return ret;
 }
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu0 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu0
new file mode 120000
index 0000000..c841bea
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu0
@@ -0,0 +1 @@
+../../cpu/cpu0
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu1 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu1
new file mode 120000
index 0000000..5f45362
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-2/node/node0/cpu1
@@ -0,0 +1 @@
+../../cpu/cpu1
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3-cpu-x86-output.txt b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3-cpu-x86-output.txt
index 333187e..0306f86 100644
--- a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3-cpu-x86-output.txt
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3-cpu-x86-output.txt
@@ -1 +1 @@
-CPUs: 48/48, MHz: 2100, Nodes: 1, Sockets: 4, Cores: 12, Threads: 1
+CPUs: 48/48, MHz: 2100, Nodes: 8, Sockets: 1, Cores: 6, Threads: 1
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu0 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu0
new file mode 120000
index 0000000..c841bea
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu0
@@ -0,0 +1 @@
+../../cpu/cpu0
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu12 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu12
new file mode 120000
index 0000000..211519e
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu12
@@ -0,0 +1 @@
+../../cpu/cpu12
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu16 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu16
new file mode 120000
index 0000000..445de40
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu16
@@ -0,0 +1 @@
+../../cpu/cpu16
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu20 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu20
new file mode 120000
index 0000000..a37c370
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu20
@@ -0,0 +1 @@
+../../cpu/cpu20
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu4 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu4
new file mode 120000
index 0000000..9e77a64
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu4
@@ -0,0 +1 @@
+../../cpu/cpu4
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu8 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu8
new file mode 120000
index 0000000..bda10cc
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/cpu8
@@ -0,0 +1 @@
+../../cpu/cpu8
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/meminfo b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/meminfo
index ec2bf50..fa5c13d 100644
--- a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/meminfo
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node0/meminfo
@@ -1,29 +1,29 @@

 Node 0 MemTotal:       67098848 kB
-Node 0 MemFree:        64989968 kB
-Node 0 MemUsed:         2108880 kB
-Node 0 Active:           136532 kB
-Node 0 Inactive:         146228 kB
-Node 0 Active(anon):      28124 kB
-Node 0 Inactive(anon):      160 kB
-Node 0 Active(file):     108408 kB
-Node 0 Inactive(file):   146068 kB
-Node 0 Unevictable:           0 kB
-Node 0 Mlocked:               0 kB
+Node 0 MemFree:        63476428 kB
+Node 0 MemUsed:         3622420 kB
+Node 0 Active:          1796452 kB
+Node 0 Inactive:          22884 kB
+Node 0 Active(anon):    1790124 kB
+Node 0 Inactive(anon):     1048 kB
+Node 0 Active(file):       6328 kB
+Node 0 Inactive(file):    21836 kB
+Node 0 Unevictable:         196 kB
+Node 0 Mlocked:             196 kB
 Node 0 Dirty:                 0 kB
 Node 0 Writeback:             0 kB
-Node 0 FilePages:        254676 kB
-Node 0 Mapped:             7284 kB
-Node 0 AnonPages:         15816 kB
-Node 0 Shmem:               200 kB
-Node 0 KernelStack:        5904 kB
-Node 0 PageTables:         2328 kB
+Node 0 FilePages:         28444 kB
+Node 0 Mapped:             1728 kB
+Node 0 AnonPages:         19568 kB
+Node 0 Shmem:                84 kB
+Node 0 KernelStack:        5736 kB
+Node 0 PageTables:         5000 kB
 Node 0 NFS_Unstable:          0 kB
 Node 0 Bounce:                0 kB
 Node 0 WritebackTmp:          0 kB
-Node 0 Slab:              53304 kB
-Node 0 SReclaimable:      16580 kB
-Node 0 SUnreclaim:        36724 kB
+Node 0 Slab:              26352 kB
+Node 0 SReclaimable:       4404 kB
+Node 0 SUnreclaim:        21948 kB
 Node 0 HugePages_Total:     0
 Node 0 HugePages_Free:      0
 Node 0 HugePages_Surp:      0
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu24 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu24
new file mode 120000
index 0000000..ad0a618
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu24
@@ -0,0 +1 @@
+../../cpu/cpu24
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu28 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu28
new file mode 120000
index 0000000..83269be
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu28
@@ -0,0 +1 @@
+../../cpu/cpu28
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu32 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu32
new file mode 120000
index 0000000..bbca866
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu32
@@ -0,0 +1 @@
+../../cpu/cpu32
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu36 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu36
new file mode 120000
index 0000000..5e53f70
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu36
@@ -0,0 +1 @@
+../../cpu/cpu36
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu40 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu40
new file mode 120000
index 0000000..c727d46
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu40
@@ -0,0 +1 @@
+../../cpu/cpu40
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu44 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu44
new file mode 120000
index 0000000..859e4fc
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/cpu44
@@ -0,0 +1 @@
+../../cpu/cpu44
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/meminfo b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/meminfo
index f84bd4c..461c25a 100644
--- a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/meminfo
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node1/meminfo
@@ -1,29 +1,29 @@

 Node 1 MemTotal:       67108864 kB
-Node 1 MemFree:        65361692 kB
-Node 1 MemUsed:         1747172 kB
-Node 1 Active:            41004 kB
-Node 1 Inactive:         108288 kB
-Node 1 Active(anon):      14656 kB
-Node 1 Inactive(anon):      292 kB
-Node 1 Active(file):      26348 kB
-Node 1 Inactive(file):   107996 kB
+Node 1 MemFree:        58533044 kB
+Node 1 MemUsed:         8575820 kB
+Node 1 Active:          6950832 kB
+Node 1 Inactive:          49624 kB
+Node 1 Active(anon):    6922916 kB
+Node 1 Inactive(anon):       24 kB
+Node 1 Active(file):      27916 kB
+Node 1 Inactive(file):    49600 kB
 Node 1 Unevictable:           0 kB
 Node 1 Mlocked:               0 kB
-Node 1 Dirty:                 0 kB
+Node 1 Dirty:                 8 kB
 Node 1 Writeback:             0 kB
-Node 1 FilePages:        134664 kB
-Node 1 Mapped:             7012 kB
-Node 1 AnonPages:         14624 kB
-Node 1 Shmem:               324 kB
-Node 1 KernelStack:         176 kB
-Node 1 PageTables:         2488 kB
+Node 1 FilePages:         77584 kB
+Node 1 Mapped:             4024 kB
+Node 1 AnonPages:         12920 kB
+Node 1 Shmem:                68 kB
+Node 1 KernelStack:         192 kB
+Node 1 PageTables:        14256 kB
 Node 1 NFS_Unstable:          0 kB
 Node 1 Bounce:                0 kB
 Node 1 WritebackTmp:          0 kB
-Node 1 Slab:              47096 kB
-Node 1 SReclaimable:      13716 kB
-Node 1 SUnreclaim:        33380 kB
+Node 1 Slab:              11928 kB
+Node 1 SReclaimable:       5240 kB
+Node 1 SUnreclaim:         6688 kB
 Node 1 HugePages_Total:     0
 Node 1 HugePages_Free:      0
 Node 1 HugePages_Surp:      0
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu11 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu11
new file mode 120000
index 0000000..e29d898
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu11
@@ -0,0 +1 @@
+../../cpu/cpu11
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu15 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu15
new file mode 120000
index 0000000..e905d85
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu15
@@ -0,0 +1 @@
+../../cpu/cpu15
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu19 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu19
new file mode 120000
index 0000000..c671083
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu19
@@ -0,0 +1 @@
+../../cpu/cpu19
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu23 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu23
new file mode 120000
index 0000000..75c2f57
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu23
@@ -0,0 +1 @@
+../../cpu/cpu23
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu3 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu3
new file mode 120000
index 0000000..c7690e5
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu3
@@ -0,0 +1 @@
+../../cpu/cpu3
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu7 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu7
new file mode 120000
index 0000000..09e3f79
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/cpu7
@@ -0,0 +1 @@
+../../cpu/cpu7
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/meminfo b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/meminfo
index c755e48..1db62d0 100644
--- a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/meminfo
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node2/meminfo
@@ -1,29 +1,29 @@

 Node 2 MemTotal:       67108864 kB
-Node 2 MemFree:        64350240 kB
-Node 2 MemUsed:         2758624 kB
-Node 2 Active:          1049208 kB
-Node 2 Inactive:         121980 kB
-Node 2 Active(anon):     944424 kB
-Node 2 Inactive(anon):      668 kB
-Node 2 Active(file):     104784 kB
-Node 2 Inactive(file):   121312 kB
-Node 2 Unevictable:           0 kB
-Node 2 Mlocked:               0 kB
+Node 2 MemFree:        63106144 kB
+Node 2 MemUsed:         4002720 kB
+Node 2 Active:          2433572 kB
+Node 2 Inactive:           8140 kB
+Node 2 Active(anon):    2429364 kB
+Node 2 Inactive(anon):       24 kB
+Node 2 Active(file):       4208 kB
+Node 2 Inactive(file):     8116 kB
+Node 2 Unevictable:           4 kB
+Node 2 Mlocked:               4 kB
 Node 2 Dirty:                 0 kB
 Node 2 Writeback:             0 kB
-Node 2 FilePages:        226784 kB
-Node 2 Mapped:            10920 kB
-Node 2 AnonPages:         35148 kB
-Node 2 Shmem:               684 kB
-Node 2 KernelStack:        1400 kB
-Node 2 PageTables:         6228 kB
+Node 2 FilePages:         12424 kB
+Node 2 Mapped:             3100 kB
+Node 2 AnonPages:          4476 kB
+Node 2 Shmem:                84 kB
+Node 2 KernelStack:         112 kB
+Node 2 PageTables:         4980 kB
 Node 2 NFS_Unstable:          0 kB
 Node 2 Bounce:                0 kB
 Node 2 WritebackTmp:          0 kB
-Node 2 Slab:              24700 kB
-Node 2 SReclaimable:      15072 kB
-Node 2 SUnreclaim:         9628 kB
+Node 2 Slab:               8292 kB
+Node 2 SReclaimable:       2260 kB
+Node 2 SUnreclaim:         6032 kB
 Node 2 HugePages_Total:     0
 Node 2 HugePages_Free:      0
 Node 2 HugePages_Surp:      0
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu27 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu27
new file mode 120000
index 0000000..74ced19
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu27
@@ -0,0 +1 @@
+../../cpu/cpu27
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu31 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu31
new file mode 120000
index 0000000..6a9a569
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu31
@@ -0,0 +1 @@
+../../cpu/cpu31
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu35 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu35
new file mode 120000
index 0000000..47654d6
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu35
@@ -0,0 +1 @@
+../../cpu/cpu35
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu39 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu39
new file mode 120000
index 0000000..d465480
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu39
@@ -0,0 +1 @@
+../../cpu/cpu39
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu43 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu43
new file mode 120000
index 0000000..03b2d2d
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu43
@@ -0,0 +1 @@
+../../cpu/cpu43
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu47 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu47
new file mode 120000
index 0000000..19407d4
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/cpu47
@@ -0,0 +1 @@
+../../cpu/cpu47
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/meminfo b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/meminfo
index b580944..aa114db 100644
--- a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/meminfo
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node3/meminfo
@@ -1,29 +1,29 @@

 Node 3 MemTotal:       67108864 kB
-Node 3 MemFree:        65372380 kB
-Node 3 MemUsed:         1736484 kB
-Node 3 Active:            87008 kB
-Node 3 Inactive:          71908 kB
-Node 3 Active(anon):      25684 kB
-Node 3 Inactive(anon):      444 kB
-Node 3 Active(file):      61324 kB
-Node 3 Inactive(file):    71464 kB
-Node 3 Unevictable:           0 kB
-Node 3 Mlocked:               0 kB
+Node 3 MemFree:        57821716 kB
+Node 3 MemUsed:         9287148 kB
+Node 3 Active:          7526420 kB
+Node 3 Inactive:         156352 kB
+Node 3 Active(anon):    7510420 kB
+Node 3 Inactive(anon):       52 kB
+Node 3 Active(file):      16000 kB
+Node 3 Inactive(file):   156300 kB
+Node 3 Unevictable:        2244 kB
+Node 3 Mlocked:            2244 kB
 Node 3 Dirty:                 0 kB
 Node 3 Writeback:             0 kB
-Node 3 FilePages:        133260 kB
-Node 3 Mapped:            13668 kB
-Node 3 AnonPages:         21560 kB
-Node 3 Shmem:               472 kB
-Node 3 KernelStack:         680 kB
-Node 3 PageTables:         2392 kB
+Node 3 FilePages:        174648 kB
+Node 3 Mapped:             3260 kB
+Node 3 AnonPages:          2400 kB
+Node 3 Shmem:               104 kB
+Node 3 KernelStack:         104 kB
+Node 3 PageTables:        14812 kB
 Node 3 NFS_Unstable:          0 kB
 Node 3 Bounce:                0 kB
 Node 3 WritebackTmp:          0 kB
-Node 3 Slab:              26296 kB
-Node 3 SReclaimable:      18312 kB
-Node 3 SUnreclaim:         7984 kB
+Node 3 Slab:              39052 kB
+Node 3 SReclaimable:       7772 kB
+Node 3 SUnreclaim:        31280 kB
 Node 3 HugePages_Total:     0
 Node 3 HugePages_Free:      0
 Node 3 HugePages_Surp:      0
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu10 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu10
new file mode 120000
index 0000000..a6dc6bb
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu10
@@ -0,0 +1 @@
+../../cpu/cpu10
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu14 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu14
new file mode 120000
index 0000000..24cb3b4
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu14
@@ -0,0 +1 @@
+../../cpu/cpu14
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu18 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu18
new file mode 120000
index 0000000..3809adc
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu18
@@ -0,0 +1 @@
+../../cpu/cpu18
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu2 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu2
new file mode 120000
index 0000000..2dcca33
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu2
@@ -0,0 +1 @@
+../../cpu/cpu2
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu22 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu22
new file mode 120000
index 0000000..2c226ae
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu22
@@ -0,0 +1 @@
+../../cpu/cpu22
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu6 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu6
new file mode 120000
index 0000000..2e75763
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/cpu6
@@ -0,0 +1 @@
+../../cpu/cpu6
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/meminfo b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/meminfo
index 8ad9b86..99da2c2 100644
--- a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/meminfo
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node4/meminfo
@@ -1,29 +1,29 @@

 Node 4 MemTotal:       67108864 kB
-Node 4 MemFree:        64730416 kB
-Node 4 MemUsed:         2378448 kB
-Node 4 Active:           522732 kB
-Node 4 Inactive:         205384 kB
-Node 4 Active(anon):     411816 kB
-Node 4 Inactive(anon):      384 kB
-Node 4 Active(file):     110916 kB
-Node 4 Inactive(file):   205000 kB
-Node 4 Unevictable:           0 kB
-Node 4 Mlocked:               0 kB
+Node 4 MemFree:        60434724 kB
+Node 4 MemUsed:         6674140 kB
+Node 4 Active:          4945652 kB
+Node 4 Inactive:          93972 kB
+Node 4 Active(anon):    4942460 kB
+Node 4 Inactive(anon):    90756 kB
+Node 4 Active(file):       3192 kB
+Node 4 Inactive(file):     3216 kB
+Node 4 Unevictable:         488 kB
+Node 4 Mlocked:             488 kB
 Node 4 Dirty:                 0 kB
 Node 4 Writeback:             0 kB
-Node 4 FilePages:        316320 kB
-Node 4 Mapped:            10220 kB
-Node 4 AnonPages:        129184 kB
-Node 4 Shmem:               408 kB
-Node 4 KernelStack:         336 kB
-Node 4 PageTables:         2732 kB
+Node 4 FilePages:         97660 kB
+Node 4 Mapped:             1216 kB
+Node 4 AnonPages:          7008 kB
+Node 4 Shmem:             90964 kB
+Node 4 KernelStack:          80 kB
+Node 4 PageTables:        10284 kB
 Node 4 NFS_Unstable:          0 kB
 Node 4 Bounce:                0 kB
 Node 4 WritebackTmp:          0 kB
-Node 4 Slab:              54172 kB
-Node 4 SReclaimable:      41160 kB
-Node 4 SUnreclaim:        13012 kB
+Node 4 Slab:              71800 kB
+Node 4 SReclaimable:      35888 kB
+Node 4 SUnreclaim:        35912 kB
 Node 4 HugePages_Total:     0
 Node 4 HugePages_Free:      0
 Node 4 HugePages_Surp:      0
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu26 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu26
new file mode 120000
index 0000000..1dd180f
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu26
@@ -0,0 +1 @@
+../../cpu/cpu26
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu30 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu30
new file mode 120000
index 0000000..80226fa
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu30
@@ -0,0 +1 @@
+../../cpu/cpu30
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu34 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu34
new file mode 120000
index 0000000..0c0e738
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu34
@@ -0,0 +1 @@
+../../cpu/cpu34
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu38 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu38
new file mode 120000
index 0000000..7231eb4
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu38
@@ -0,0 +1 @@
+../../cpu/cpu38
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu42 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu42
new file mode 120000
index 0000000..8ebd18e
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu42
@@ -0,0 +1 @@
+../../cpu/cpu42
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu46 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu46
new file mode 120000
index 0000000..55223e0
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/cpu46
@@ -0,0 +1 @@
+../../cpu/cpu46
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/meminfo b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/meminfo
index fb93073..eabd9b1 100644
--- a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/meminfo
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node5/meminfo
@@ -1,29 +1,29 @@

 Node 5 MemTotal:       67108864 kB
-Node 5 MemFree:        65315792 kB
-Node 5 MemUsed:         1793072 kB
-Node 5 Active:            92864 kB
-Node 5 Inactive:         118500 kB
-Node 5 Active(anon):      17360 kB
-Node 5 Inactive(anon):      280 kB
-Node 5 Active(file):      75504 kB
-Node 5 Inactive(file):   118220 kB
-Node 5 Unevictable:           0 kB
-Node 5 Mlocked:               0 kB
+Node 5 MemFree:        63584868 kB
+Node 5 MemUsed:         3523996 kB
+Node 5 Active:          1955824 kB
+Node 5 Inactive:           3628 kB
+Node 5 Active(anon):    1949640 kB
+Node 5 Inactive(anon):        8 kB
+Node 5 Active(file):       6184 kB
+Node 5 Inactive(file):     3620 kB
+Node 5 Unevictable:         244 kB
+Node 5 Mlocked:             244 kB
 Node 5 Dirty:                 0 kB
 Node 5 Writeback:             0 kB
-Node 5 FilePages:        194028 kB
-Node 5 Mapped:             7680 kB
-Node 5 AnonPages:         13240 kB
-Node 5 Shmem:               304 kB
-Node 5 KernelStack:         160 kB
-Node 5 PageTables:         1756 kB
+Node 5 FilePages:         10112 kB
+Node 5 Mapped:             1612 kB
+Node 5 AnonPages:          1936 kB
+Node 5 Shmem:                64 kB
+Node 5 KernelStack:          80 kB
+Node 5 PageTables:         4136 kB
 Node 5 NFS_Unstable:          0 kB
 Node 5 Bounce:                0 kB
 Node 5 WritebackTmp:          0 kB
-Node 5 Slab:              30128 kB
-Node 5 SReclaimable:      21380 kB
-Node 5 SUnreclaim:         8748 kB
+Node 5 Slab:               9420 kB
+Node 5 SReclaimable:       1772 kB
+Node 5 SUnreclaim:         7648 kB
 Node 5 HugePages_Total:     0
 Node 5 HugePages_Free:      0
 Node 5 HugePages_Surp:      0
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu1 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu1
new file mode 120000
index 0000000..5f45362
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu1
@@ -0,0 +1 @@
+../../cpu/cpu1
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu13 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu13
new file mode 120000
index 0000000..52d3b69
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu13
@@ -0,0 +1 @@
+../../cpu/cpu13
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu17 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu17
new file mode 120000
index 0000000..13929db
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu17
@@ -0,0 +1 @@
+../../cpu/cpu17
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu21 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu21
new file mode 120000
index 0000000..68a7cad
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu21
@@ -0,0 +1 @@
+../../cpu/cpu21
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu5 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu5
new file mode 120000
index 0000000..cc07c3b
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu5
@@ -0,0 +1 @@
+../../cpu/cpu5
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu9 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu9
new file mode 120000
index 0000000..1ec1db2
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/cpu9
@@ -0,0 +1 @@
+../../cpu/cpu9
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/meminfo b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/meminfo
index d4fa1d0..c83c1bf 100644
--- a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/meminfo
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node6/meminfo
@@ -1,29 +1,29 @@

 Node 6 MemTotal:       67108864 kB
-Node 6 MemFree:        65259848 kB
-Node 6 MemUsed:         1849016 kB
-Node 6 Active:           105044 kB
-Node 6 Inactive:         164968 kB
-Node 6 Active(anon):      13332 kB
-Node 6 Inactive(anon):      368 kB
-Node 6 Active(file):      91712 kB
-Node 6 Inactive(file):   164600 kB
-Node 6 Unevictable:           0 kB
-Node 6 Mlocked:               0 kB
-Node 6 Dirty:                 0 kB
+Node 6 MemFree:        59956600 kB
+Node 6 MemUsed:         7152264 kB
+Node 6 Active:          5526616 kB
+Node 6 Inactive:          50148 kB
+Node 6 Active(anon):    5519092 kB
+Node 6 Inactive(anon):    18256 kB
+Node 6 Active(file):       7524 kB
+Node 6 Inactive(file):    31892 kB
+Node 6 Unevictable:        1248 kB
+Node 6 Mlocked:            1248 kB
+Node 6 Dirty:                 4 kB
 Node 6 Writeback:             0 kB
-Node 6 FilePages:        256704 kB
-Node 6 Mapped:             3704 kB
-Node 6 AnonPages:         13324 kB
-Node 6 Shmem:               392 kB
-Node 6 KernelStack:         216 kB
-Node 6 PageTables:         1964 kB
+Node 6 FilePages:         60336 kB
+Node 6 Mapped:             1452 kB
+Node 6 AnonPages:         29028 kB
+Node 6 Shmem:             20624 kB
+Node 6 KernelStack:        1928 kB
+Node 6 PageTables:        11172 kB
 Node 6 NFS_Unstable:          0 kB
 Node 6 Bounce:                0 kB
 Node 6 WritebackTmp:          0 kB
-Node 6 Slab:              28548 kB
-Node 6 SReclaimable:      19596 kB
-Node 6 SUnreclaim:         8952 kB
+Node 6 Slab:              12844 kB
+Node 6 SReclaimable:       3692 kB
+Node 6 SUnreclaim:         9152 kB
 Node 6 HugePages_Total:     0
 Node 6 HugePages_Free:      0
 Node 6 HugePages_Surp:      0
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu25 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu25
new file mode 120000
index 0000000..3145742
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu25
@@ -0,0 +1 @@
+../../cpu/cpu25
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu29 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu29
new file mode 120000
index 0000000..fa37dc6
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu29
@@ -0,0 +1 @@
+../../cpu/cpu29
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu33 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu33
new file mode 120000
index 0000000..b7a9f8d
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu33
@@ -0,0 +1 @@
+../../cpu/cpu33
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu37 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu37
new file mode 120000
index 0000000..41b4ce7
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu37
@@ -0,0 +1 @@
+../../cpu/cpu37
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu41 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu41
new file mode 120000
index 0000000..cc0b78c
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu41
@@ -0,0 +1 @@
+../../cpu/cpu41
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu45 b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu45
new file mode 120000
index 0000000..58c3ca3
--- /dev/null
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/cpu45
@@ -0,0 +1 @@
+../../cpu/cpu45
\ No newline at end of file
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/meminfo b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/meminfo
index 4f43eae..94566d6 100644
--- a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/meminfo
+++ b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/node7/meminfo
@@ -1,29 +1,29 @@

 Node 7 MemTotal:       67108864 kB
-Node 7 MemFree:        65303740 kB
-Node 7 MemUsed:         1805124 kB
-Node 7 Active:            60264 kB
-Node 7 Inactive:          77164 kB
-Node 7 Active(anon):      27672 kB
-Node 7 Inactive(anon):      632 kB
-Node 7 Active(file):      32592 kB
-Node 7 Inactive(file):    76532 kB
-Node 7 Unevictable:           0 kB
-Node 7 Mlocked:               0 kB
+Node 7 MemFree:        63509808 kB
+Node 7 MemUsed:         3599056 kB
+Node 7 Active:          1813772 kB
+Node 7 Inactive:         152964 kB
+Node 7 Active(anon):    1806008 kB
+Node 7 Inactive(anon):     4400 kB
+Node 7 Active(file):       7764 kB
+Node 7 Inactive(file):   148564 kB
+Node 7 Unevictable:          12 kB
+Node 7 Mlocked:              12 kB
 Node 7 Dirty:                 0 kB
 Node 7 Writeback:             0 kB
-Node 7 FilePages:        109772 kB
-Node 7 Mapped:             5508 kB
-Node 7 AnonPages:         27668 kB
-Node 7 Shmem:               648 kB
-Node 7 KernelStack:         208 kB
-Node 7 PageTables:         1820 kB
+Node 7 FilePages:        160820 kB
+Node 7 Mapped:             4208 kB
+Node 7 AnonPages:         34432 kB
+Node 7 Shmem:              4484 kB
+Node 7 KernelStack:         152 kB
+Node 7 PageTables:         3728 kB
 Node 7 NFS_Unstable:          0 kB
 Node 7 Bounce:                0 kB
 Node 7 WritebackTmp:          0 kB
-Node 7 Slab:              19372 kB
-Node 7 SReclaimable:      11024 kB
-Node 7 SUnreclaim:         8348 kB
+Node 7 Slab:              12760 kB
+Node 7 SReclaimable:       3636 kB
+Node 7 SUnreclaim:         9124 kB
 Node 7 HugePages_Total:     0
 Node 7 HugePages_Free:      0
 Node 7 HugePages_Surp:      0
diff --git a/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/possible b/tests/nodeinfodata/linux-nodeinfo-sysfs-test-3/node/possible
index 74fc2fb6b048c39d90b0c17de3824095162634f8..21408fdea85537c7277785de368c5cef105e30ed 100644
GIT binary patch
literal 5
McmXreHRoag00LqFp8x;=

literal 4
LcmXreHRl2V0mA^F

-- 
1.7.8.6




More information about the libvir-list mailing list