diff options
Diffstat (limited to 'package/lvm/patches/patch-lib_mm_memlock_c')
-rw-r--r-- | package/lvm/patches/patch-lib_mm_memlock_c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/package/lvm/patches/patch-lib_mm_memlock_c b/package/lvm/patches/patch-lib_mm_memlock_c new file mode 100644 index 000000000..8cc6d8514 --- /dev/null +++ b/package/lvm/patches/patch-lib_mm_memlock_c @@ -0,0 +1,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 + } + |