summaryrefslogtreecommitdiff
path: root/package/lvm/patches/patch-lib_mm_memlock_c
blob: bfbc8910df48ed7c57ca3cc790e840671096d370 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
--- LVM2.2.02.168.orig/lib/mm/memlock.c	2016-12-01 00:17:29.000000000 +0100
+++ LVM2.2.02.168/lib/mm/memlock.c	2017-03-26 19:05:36.000000000 +0200
@@ -25,7 +25,6 @@
 #include <sys/mman.h>
 #include <sys/time.h>
 #include <sys/resource.h>
-#include <malloc.h>
 
 #ifdef HAVE_VALGRIND
 #include <valgrind.h>
@@ -151,10 +150,8 @@ static void _touch_memory(void *mem, siz
 static void _allocate_memory(void)
 {
 #ifndef VALGRIND_POOL
-	void *stack_mem;
+	void *stack_mem, *temp_malloc_mem;
 	struct rlimit limit;
-	int i, area = 0, missing = _size_malloc_tmp, max_areas = 32, hblks;
-	char *areas[max_areas];
 
 	/* Check if we could preallocate requested stack */
 	if ((getrlimit (RLIMIT_STACK, &limit) == 0) &&
@@ -163,50 +160,13 @@ static void _allocate_memory(void)
 		_touch_memory(stack_mem, _size_stack);
 	/* FIXME else warn user setting got ignored */
 
-        /*
-         *  When a brk() fails due to fragmented address space (which sometimes
-         *  happens when we try to grab 8M or so), glibc will make a new
-         *  arena. In this arena, the rules for using “direct” mmap are relaxed,
-         *  circumventing the MAX_MMAPs and MMAP_THRESHOLD settings. We can,
-         *  however, detect when this happens with mallinfo() and try to co-opt
-         *  malloc into using MMAP as a MORECORE substitute instead of returning
-         *  MMAP'd memory directly. Since MMAP-as-MORECORE does not munmap the
-         *  memory on free(), this is good enough for our purposes.
-         */
-	while (missing > 0) {
-		struct mallinfo inf = mallinfo();
-		hblks = inf.hblks;
-
-		if ((areas[area] = malloc(_size_malloc_tmp)))
-			_touch_memory(areas[area], _size_malloc_tmp);
-
-		inf = mallinfo();
-
-		if (hblks < inf.hblks) {
-			/* malloc cheated and used mmap, even though we told it
-			   not to; we try with twice as many areas, each half
-			   the size, to circumvent the faulty logic in glibc */
-			free(areas[area]);
-			_size_malloc_tmp /= 2;
-		} else {
-			++ area;
-			missing -= _size_malloc_tmp;
-		}
-
-		if (area == max_areas && missing > 0) {
-			/* Too bad. Warn the user and proceed, as things are
-			 * most likely going to work out anyway. */
-			log_warn("WARNING: Failed to reserve memory, %d bytes missing.", missing);
-			break;
-		}
-	}
+	if ((temp_malloc_mem = malloc(_size_malloc_tmp)))
+		_touch_memory(temp_malloc_mem, _size_malloc_tmp);
 
 	if ((_malloc_mem = malloc(_size_malloc)))
 		_touch_memory(_malloc_mem, _size_malloc);
 
-	/* free up the reserves so subsequent malloc's can use that memory */
-	for (i = 0; i < area; ++i)
-		free(areas[i]);
+	free(temp_malloc_mem);
 #endif
 }