From deb8c66d448810ae5bc0d8211328fa0e976a037a Mon Sep 17 00:00:00 2001 From: Luyao Huang Date: Wed, 21 Oct 2015 12:13:39 +0800 Subject: [PATCH] util: split the virNumaGetHugePageInfoPath into separate function https://bugzilla.redhat.com/show_bug.cgi?id=1265114 Refactor helper virNumaGetHugePageInfoPath to handle returning a directory path when passed a page_size of 0 and suffix == NULL into a new helper virNumaGetHugePageInfoDir which will only be called when a directory path is expected to be returned. This solves the issue where the helper was called with page_size == 0 expecting a file path in return, but instead got a directory path and failed in virFileReadAll with: error : virFileReadAll:1358 : Failed to read file '/sys/devices/system/node/node0/hugepages/': Is a directory Since virNumaGetPages API expects to return a directory by passing page_size == 0 and suffix == NULL, it will now call the new helper. Callers to virNumaGetHugePageInfoPath expect to return a file path which could then be used in the call to virFileReadAll. Signed-off-by: Luyao Huang --- src/util/virnuma.c | 51 +++++++++++++++++----------------------------- 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/src/util/virnuma.c b/src/util/virnuma.c index 1a62d62d75..cb80972e6a 100644 --- a/src/util/virnuma.c +++ b/src/util/virnuma.c @@ -493,44 +493,31 @@ virNumaGetHugePageInfoPath(char **path, unsigned int page_size, const char *suffix) { - - int ret = -1; - if (node == -1) { /* We are aiming at overall system info */ - if (page_size) { - /* And even on specific huge page size */ - if (virAsprintf(path, - HUGEPAGES_SYSTEM_PREFIX HUGEPAGES_PREFIX "%ukB/%s", - page_size, suffix ? suffix : "") < 0) - goto cleanup; - } else { - if (VIR_STRDUP(*path, HUGEPAGES_SYSTEM_PREFIX) < 0) - goto cleanup; - } - + return virAsprintf(path, + HUGEPAGES_SYSTEM_PREFIX HUGEPAGES_PREFIX "%ukB/%s", + page_size, suffix ? suffix : ""); } else { /* We are aiming on specific NUMA node */ - if (page_size) { - /* And even on specific huge page size */ - if (virAsprintf(path, - HUGEPAGES_NUMA_PREFIX "node%d/hugepages/" - HUGEPAGES_PREFIX "%ukB/%s", - node, page_size, suffix ? suffix : "") < 0) - goto cleanup; - } else { - if (virAsprintf(path, - HUGEPAGES_NUMA_PREFIX "node%d/hugepages/", - node) < 0) - goto cleanup; - } + return virAsprintf(path, + HUGEPAGES_NUMA_PREFIX "node%d/hugepages/" + HUGEPAGES_PREFIX "%ukB/%s", + node, page_size, suffix ? suffix : ""); } - - ret = 0; - cleanup: - return ret; } +static int +virNumaGetHugePageInfoDir(char **path, int node) +{ + if (node == -1) { + return VIR_STRDUP(*path, HUGEPAGES_SYSTEM_PREFIX); + } else { + return virAsprintf(path, + HUGEPAGES_NUMA_PREFIX "node%d/hugepages/", + node); + } +} /** * virNumaGetHugePageInfo: @@ -724,7 +711,7 @@ virNumaGetPages(int node, * is always shown as used memory. Here, however, we want to report * slightly different information. So we take the total memory on a node * and subtract memory taken by the huge pages. */ - if (virNumaGetHugePageInfoPath(&path, node, 0, NULL) < 0) + if (virNumaGetHugePageInfoDir(&path, node) < 0) goto cleanup; if (!(dir = opendir(path))) {