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.114.orig/lib/mm/memlock.c 2014-11-29 00:07:42.000000000 +0100
+++ LVM2.2.02.114/lib/mm/memlock.c 2015-02-28 09:44:51.000000000 +0100
@@ -25,7 +25,6 @@
#include <sys/mman.h>
#include <sys/time.h>
#include <sys/resource.h>
-#include <malloc.h>
#ifndef DEVMAPPER_SUPPORT
@@ -134,10 +133,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) &&
@@ -146,50 +143,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
}
|