12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- --- LVM2.2.02.177.orig/lib/mm/memlock.c 2017-12-18 21:44:35.000000000 +0100
- +++ LVM2.2.02.177/lib/mm/memlock.c 2018-06-07 03:09:58.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>
- @@ -152,10 +151,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) &&
- @@ -164,50 +161,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
- }
-
|