aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Stancek <jstancek@redhat.com>2012-09-06 13:12:22 +0200
committerEric B Munson <emunson@mgebm.net>2012-09-06 21:39:54 -0400
commitcdd2fa336d9980eb268a775b7cf9c49e3b698cd7 (patch)
tree8f69b8e28775f59644fd7e6083c735fc4f563358
parent97a6efd9d0c660d4bdabdb579635c46c3f20e156 (diff)
downloadlibhugetlbfs-cdd2fa336d9980eb268a775b7cf9c49e3b698cd7.tar.gz
exhaust malloc arenas before malloc tests
First allocation in malloc tests is just 1024 bytes. If there is enough free mem in malloc arenas, this first allocation can be satisfied without call to MORECORE() and testcase will fail. LD_PRELOAD=libhugetlbfs.so HUGETLB_MORECORE=yes malloc (2M: 64): FAIL Address is not hugepage When looking at output from HUGETLB_DEBUG=1 it appears that hook to __morecore doesn't work as there is no trace from hugetlbfs_morecore. This patch will keep malloc-ing 1-byte chunks of memory as long as it comes from '[heap]' or maximum is reached. This will force glibc to call MORECORE() before actual malloc/malloc_manysmall test begins. Signed-off-by: Jan Stancek <jstancek@redhat.com> Signed-off-by: Eric B Munson <emunson@mgebm.net>
-rw-r--r--tests/hugetests.h1
-rw-r--r--tests/malloc.c3
-rw-r--r--tests/malloc_manysmall.c3
-rw-r--r--tests/testutils.c36
4 files changed, 43 insertions, 0 deletions
diff --git a/tests/hugetests.h b/tests/hugetests.h
index a5a54d6..cdcb41b 100644
--- a/tests/hugetests.h
+++ b/tests/hugetests.h
@@ -48,6 +48,7 @@ int test_addr_huge(void *p);
unsigned long long get_mapping_page_size(void *p);
long read_meminfo(const char *tag);
ino_t get_addr_inode(void *p);
+int consume_heap(long max);
#define ALIGN(x, a) (((x) + (a) - 1) & ~((a) - 1))
#define PALIGN(p, a) ((void *)ALIGN((unsigned long)(p), (a)))
diff --git a/tests/malloc.c b/tests/malloc.c
index a1af5e1..dbdd617 100644
--- a/tests/malloc.c
+++ b/tests/malloc.c
@@ -61,6 +61,9 @@ int main(int argc, char *argv[])
expect_hugepage = 1;
verbose_printf("expect_hugepage=%d\n", expect_hugepage);
+ if (expect_hugepage)
+ consume_heap(1024*1024);
+
for (i = 0; i < NUM_SIZES; i++) {
int size = block_sizes[i];
unsigned long long mapping_size;
diff --git a/tests/malloc_manysmall.c b/tests/malloc_manysmall.c
index 25086a8..15cf4f0 100644
--- a/tests/malloc_manysmall.c
+++ b/tests/malloc_manysmall.c
@@ -50,6 +50,9 @@ int main(int argc, char *argv[])
if (env)
expect_hugepage = 1;
+ if (expect_hugepage)
+ consume_heap(1024*1024);
+
for (i = 0; i < NUM_ALLOCS; i++) {
p = malloc(ALLOC_SIZE);
if (! p)
diff --git a/tests/testutils.c b/tests/testutils.c
index 68d8e62..2dc5d5d 100644
--- a/tests/testutils.c
+++ b/tests/testutils.c
@@ -162,6 +162,42 @@ static int read_maps(unsigned long addr, char *buf)
return 0;
}
+/* malloc memory one byte at a time until:
+ * - max limit is reached
+ * - malloc-ed memory is no longer on heap
+ */
+int consume_heap(long max)
+{
+ char aname[256];
+ int ret;
+ long consumed = 0;
+ void *p;
+
+ while (1) {
+ p = malloc(1);
+ if (p == NULL)
+ FAIL("Could not malloc memory");
+
+ ret = read_maps((unsigned long)p, aname);
+ if (ret <= 0)
+ FAIL("read_maps ret <= 0");
+
+ if (strstr(aname, "heap") == NULL) {
+ ret = 0;
+ break;
+ }
+
+ consumed++;
+ if (consumed > max) {
+ verbose_printf("Warning: heap unexpectedly large\n");
+ ret = 1;
+ break;
+ }
+ }
+ verbose_printf("malloc-ed %ld bytes from heap\n", consumed);
+ return ret;
+}
+
/*
* With the inclusion of MAP_HUGETLB it is now possible to have huge pages
* without using hugetlbfs, so not all huge page regions will show with the