]> xenbits.xensource.com Git - libvirt.git/commitdiff
Make tests independant of system page size
authorDaniel P. Berrange <berrange@redhat.com>
Mon, 2 Feb 2015 10:26:49 +0000 (05:26 -0500)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 2 Feb 2015 20:27:43 +0000 (20:27 +0000)
Some code paths have special logic depending on the page size
reported by sysconf, which in turn affects the test results.
We must mock this so tests always have a consistent page size.

12 files changed:
cfg.mk
src/libvirt_private.syms
src/openvz/openvz_util.c
src/qemu/qemu_command.c
src/qemu/qemu_driver.c
src/util/virfile.c
src/util/virnuma.c
src/util/virutil.c
src/util/virutil.h
src/xen/xen_hypervisor.c
tests/qemuxml2argvmock.c
tests/qemuxml2argvtest.c

diff --git a/cfg.mk b/cfg.mk
index 70612f8e03abc7e631a93e4b2cf5074d1d6ecab2..d72b03995e2f924f68918fcbff36dca1244911dc 100644 (file)
--- a/cfg.mk
+++ b/cfg.mk
@@ -997,6 +997,11 @@ sc_prohibit_virXXXFree:
        halt='avoid using 'virXXXFree', use 'virObjectUnref' instead' \
          $(_sc_search_regexp)
 
+sc_prohibit_sysconf_pagesize:
+       @prohibit='sysconf\(_SC_PAGESIZE' \
+       halt='use virGetSystemPageSize[KB] instead of sysconf(_SC_PAGESIZE)' \
+         $(_sc_search_regexp)
+
 # We don't use this feature of maint.mk.
 prev_version_file = /dev/null
 
@@ -1187,3 +1192,6 @@ exclude_file_name_regexp--sc_prohibit_devname = \
 
 exclude_file_name_regexp--sc_prohibit_virXXXFree = \
   ^(docs/|tests/|examples/|tools/|cfg.mk|src/test/test_driver.c|src/libvirt_public.syms|include/libvirt/libvirt-(domain|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).h|src/libvirt-(domain|qemu|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).c$$)
+
+exclude_file_name_regexp--sc_prohibit_sysconf_pagesize = \
+  ^(cfg\.mk|src/util/virutil\.c)$$
index f7f8ea25c956ffdd522cddaa497f80b6c73a30ee..376c69ba529496bce673c282637f325390407570 100644 (file)
@@ -2228,6 +2228,8 @@ virGetListenFDs;
 virGetSCSIHostNameByParentaddr;
 virGetSCSIHostNumber;
 virGetSelfLastChanged;
+virGetSystemPageSize;
+virGetSystemPageSizeKB;
 virGetUnprivSGIOSysfsPath;
 virGetUserCacheDirectory;
 virGetUserConfigDirectory;
index 8032f6aa7324c8b94f273be3526e76dee1d7a830..3cdc1c2bdcbe18eea22e4be86b8b5ff714649773 100644 (file)
@@ -42,10 +42,7 @@ openvzKBPerPages(void)
     static long kb_per_pages;
 
     if (kb_per_pages == 0) {
-        kb_per_pages = sysconf(_SC_PAGESIZE);
-        if (kb_per_pages > 0) {
-            kb_per_pages /= 1024;
-        } else {
+        if ((kb_per_pages = virGetSystemPageSizeKB()) < 0) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("Can't determine page size"));
             kb_per_pages = 0;
index ec4f35b93f89493fb88bcab09d56bfbb151e9d36..3b6eddcd5c7da1a64eb4ebcaf727ecc1f209cc1f 100644 (file)
@@ -4540,7 +4540,7 @@ qemuBuildMemoryBackendStr(unsigned long long size,
     virDomainHugePagePtr master_hugepage = NULL;
     virDomainHugePagePtr hugepage = NULL;
     virDomainNumatuneMemMode mode;
-    const long system_page_size = sysconf(_SC_PAGESIZE) / 1024;
+    const long system_page_size = virGetSystemPageSizeKB();
     virMemAccess memAccess = def->cpu->cells[guestNode].memAccess;
     size_t i;
     char *mem_path = NULL;
@@ -7051,7 +7051,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg,
     bool needBackend = false;
     int rc;
     int ret = -1;
-    const long system_page_size = sysconf(_SC_PAGESIZE) / 1024;
+    const long system_page_size = virGetSystemPageSizeKB();
 
     if (virDomainNumatuneHasPerNodeBinding(def->numatune) &&
         !(virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) ||
@@ -8239,7 +8239,7 @@ qemuBuildCommandLine(virConnectPtr conn,
     def->mem.max_balloon = VIR_DIV_UP(def->mem.max_balloon, 1024) * 1024;
     virCommandAddArgFormat(cmd, "%llu", def->mem.max_balloon / 1024);
     if (def->mem.nhugepages && (!def->cpu || !def->cpu->ncells)) {
-        const long system_page_size = sysconf(_SC_PAGESIZE) / 1024;
+        const long system_page_size = virGetSystemPageSizeKB();
         char *mem_path = NULL;
 
         if (def->mem.hugepages[0].size == system_page_size) {
index 59a95938defb13701faca880d7d4966313c09fc0..cf351e686faa3bbe8266f8fb77399c3f6079b931 100644 (file)
@@ -1352,12 +1352,8 @@ qemuGetProcessInfo(unsigned long long *cpuTime, int *lastCpu, long *vm_rss,
     if (lastCpu)
         *lastCpu = cpu;
 
-    /* We got pages
-     * We want kiloBytes
-     * _SC_PAGESIZE is page size in Bytes
-     * So calculate, but first lower the pagesize so we don't get overflow */
     if (vm_rss)
-        *vm_rss = rss * (sysconf(_SC_PAGESIZE) >> 10);
+        *vm_rss = rss * virGetSystemPageSizeKB();
 
 
     VIR_DEBUG("Got status for %d/%d user=%llu sys=%llu cpu=%d rss=%ld",
index 4024f3da9d8ee644ed65143de04f78738f8fa05f..68ef6eba60c0ae471a8327ee2082ae280e62213c 100644 (file)
@@ -1086,7 +1086,7 @@ safezero_mmap(int fd, off_t offset, off_t len)
 
     /* align offset and length, rounding offset down and length up */
     if (pagemask == 0)
-        pagemask = ~(sysconf(_SC_PAGESIZE) - 1);
+        pagemask = ~(virGetSystemPageSize() - 1);
     map_skip = offset - (offset & pagemask);
 
     /* memset wants the mmap'ed file to be present on disk so create a
index 86564d4d41187a04b1cf2f09e844fb9bbe04c812..e986c713399b85a500ed6d4b93a53b6f05a85750 100644 (file)
@@ -639,7 +639,7 @@ virNumaGetPageInfo(int node,
                    unsigned int *page_free)
 {
     int ret = -1;
-    long system_page_size = sysconf(_SC_PAGESIZE);
+    long system_page_size = virGetSystemPageSize();
 
     /* sysconf() returns page size in bytes,
      * the @page_size is however in kibibytes */
@@ -717,7 +717,7 @@ virNumaGetPages(int node,
 
     /* sysconf() returns page size in bytes,
      * but we are storing the page size in kibibytes. */
-    system_page_size = sysconf(_SC_PAGESIZE) / 1024;
+    system_page_size = virGetSystemPageSizeKB();
 
     /* Query huge pages at first.
      * On Linux systems, the huge pages pool cuts off the available memory and
@@ -841,7 +841,7 @@ virNumaSetPagePoolSize(int node,
     char *end;
     unsigned long long nr_count;
 
-    if (page_size == sysconf(_SC_PAGESIZE) / 1024) {
+    if (page_size == virGetSystemPageSizeKB()) {
         /* Special case as kernel handles system pages
          * differently to huge pages. */
         virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
index 3037293ed58ecf92379dbaebd115102b464019e4..c9052093cdd425f44ddfcf990e9b82a5032d44c4 100644 (file)
@@ -2577,3 +2577,16 @@ virGetListenFDs(void)
 }
 
 #endif /* WIN32 */
+
+long virGetSystemPageSize(void)
+{
+    return sysconf(_SC_PAGESIZE);
+}
+
+long virGetSystemPageSizeKB(void)
+{
+    long val = virGetSystemPageSize();
+    if (val < 0)
+        return val;
+    return val / 1024;
+}
index f31bf8893658f4aabfed3f82f104983c3940744c..d1173c1a110e9d4a8911f0bb13a2886464b82e14 100644 (file)
@@ -244,4 +244,7 @@ VIR_ENUM_DECL(virTristateSwitch)
 
 unsigned int virGetListenFDs(void);
 
+long virGetSystemPageSize(void);
+long virGetSystemPageSizeKB(void);
+
 #endif /* __VIR_UTIL_H__ */
index 24735321e895312d09417e6b47aeed787d3b2018..31a2a1b6ad71ad4ac5fea52cc44a2bc534de18ca 100644 (file)
@@ -2736,7 +2736,7 @@ xenHypervisorGetMaxMemory(virConnectPtr conn,
     int ret;
 
     if (kb_per_pages == 0) {
-        kb_per_pages = sysconf(_SC_PAGESIZE) / 1024;
+        kb_per_pages = virGetSystemPageSizeKB();
         if (kb_per_pages <= 0)
             kb_per_pages = 4;
     }
@@ -2771,7 +2771,7 @@ xenHypervisorGetDomInfo(virConnectPtr conn, int id, virDomainInfoPtr info)
     uint32_t domain_flags, domain_state, domain_shutdown_cause;
 
     if (kb_per_pages == 0) {
-        kb_per_pages = sysconf(_SC_PAGESIZE) / 1024;
+        kb_per_pages = virGetSystemPageSizeKB();
         if (kb_per_pages <= 0)
             kb_per_pages = 4;
     }
index eccf4b0966eff28dcfa8d58e963524d69434d8a1..d24725ed3802b53e82b394014c952cf6da817976 100644 (file)
 
 #include "internal.h"
 #include "virnuma.h"
+#include "virmock.h"
+#include "virutil.h"
 #include <time.h>
+#include <unistd.h>
+
+long virGetSystemPageSize(void)
+{
+    return 4096;
+}
 
 time_t time(time_t *t)
 {
index 89afa81b7021d69cdd517a6696f74a20f6de98e1..77ee6307e56a254a4829138907877754350c4091 100644 (file)
@@ -22,6 +22,7 @@
 # include "cpu/cpu_map.h"
 # include "virstring.h"
 # include "storage/storage_driver.h"
+# include "virmock.h"
 
 # include "testutilsqemu.h"