Browse Source

Disable a malloc arena behavior that causes segfaults in openjdk

Chia-Che Tsai 8 years ago
parent
commit
2f872ab753

BIN
LibOS/.packed/glibc.tar.gz


+ 47 - 2
LibOS/glibc-2.19.patch

@@ -700,7 +700,7 @@ index eef2bfd..a21d2ac 100644
  #define OUT \
    for (map = MAPS; map != NULL; map = map->l_next)			      \
 diff --git a/malloc/arena.c b/malloc/arena.c
-index 5088a25..d12cf1e 100644
+index 5088a25..b3b0e1c 100644
 --- a/malloc/arena.c
 +++ b/malloc/arena.c
 @@ -21,6 +21,27 @@
@@ -720,7 +720,7 @@ index 5088a25..d12cf1e 100644
 +		if (!heap_max_size) {						\
 +			long int size = glibc_option("heap_size");		\
 +			if (size > 0)						\
-+				heap_max_size = size >> 1;			\
++				heap_max_size = size;				\
 +			else							\
 +				heap_max_size = DEFAULT_HEAP_MAX_SIZE;		\
 +		}								\
@@ -731,6 +731,51 @@ index 5088a25..d12cf1e 100644
  #define HEAP_MIN_SIZE (32 * 1024)
  #ifndef HEAP_MAX_SIZE
  # ifdef DEFAULT_MMAP_THRESHOLD_MAX
+@@ -545,33 +566,7 @@ new_heap (size_t size, size_t top_pad)
+      mapping (on Linux, this is the case for all non-writable mappings
+      anyway). */
+   p2 = MAP_FAILED;
+-  if (aligned_heap_area)
+-    {
+-      p2 = (char *) MMAP (aligned_heap_area, HEAP_MAX_SIZE, PROT_NONE,
+-                          MAP_NORESERVE);
+-      aligned_heap_area = NULL;
+-      if (p2 != MAP_FAILED && ((unsigned long) p2 & (HEAP_MAX_SIZE - 1)))
+-        {
+-          __munmap (p2, HEAP_MAX_SIZE);
+-          p2 = MAP_FAILED;
+-        }
+-    }
+-  if (p2 == MAP_FAILED)
+-    {
+-      p1 = (char *) MMAP (0, HEAP_MAX_SIZE << 1, PROT_NONE, MAP_NORESERVE);
+-      if (p1 != MAP_FAILED)
+-        {
+-          p2 = (char *) (((unsigned long) p1 + (HEAP_MAX_SIZE - 1))
+-                         & ~(HEAP_MAX_SIZE - 1));
+-          ul = p2 - p1;
+-          if (ul)
+-            __munmap (p1, ul);
+-          else
+-            aligned_heap_area = p2 + HEAP_MAX_SIZE;
+-          __munmap (p2 + HEAP_MAX_SIZE, HEAP_MAX_SIZE - ul);
+-        }
+-      else
+-        {
++
+           /* Try to take the chance that an allocation of only HEAP_MAX_SIZE
+              is already aligned. */
+           p2 = (char *) MMAP (0, HEAP_MAX_SIZE, PROT_NONE, MAP_NORESERVE);
+@@ -583,8 +578,7 @@ new_heap (size_t size, size_t top_pad)
+               __munmap (p2, HEAP_MAX_SIZE);
+               return 0;
+             }
+-        }
+-    }
++
+   if (__mprotect (p2, size, PROT_READ | PROT_WRITE) != 0)
+     {
+       __munmap (p2, HEAP_MAX_SIZE);
 diff --git a/nptl/Makefile b/nptl/Makefile
 index 57cc8c6..81f1bf4 100644
 --- a/nptl/Makefile

File diff suppressed because it is too large
+ 0 - 0
LibOS/shim/src/.packed/shim.sha384


BIN
LibOS/shim/src/.packed/shim.tar.gz


+ 3 - 3
LibOS/shim/src/shim_parser.c

@@ -85,11 +85,11 @@ struct parser_table {
     { .slow = 0, .parser = { NULL } }, /* lstat */
     { .slow = 1, .parser = { NULL } }, /* poll */
     { .slow = 0, .parser = { NULL, NULL, &parse_seek } }, /* lseek */
-    { .slow = 0,                       /* mmap */
+    { .slow = 1,                       /* mmap */
       .parser = { NULL, NULL, &parse_mmap_prot, &parse_mmap_flags } },
-    { .slow = 0,                       /* mprotect */
+    { .slow = 1,                       /* mprotect */
       .parser = { NULL, NULL, &parse_mmap_prot } },
-    { .slow = 0, .parser = { NULL } }, /* munmap */
+    { .slow = 1, .parser = { NULL } }, /* munmap */
     { .slow = 0, .parser = { NULL } }, /* brk */
     { .slow = 0, .parser = { &parse_signum } }, /* rt_sigaction */
     { .slow = 0,                       /* rt_sigprocmask */

+ 5 - 0
LibOS/shim/src/sys/shim_mmap.c

@@ -55,6 +55,11 @@ void * shim_do_mmap (void * addr, size_t length, int prot, int flags, int fd,
             reserved = true;
     }
 
+    if (addr) {
+        void * cur_stack = current_stack();
+        assert(cur_stack < addr || cur_stack > addr + length);
+    }
+
     void * mapped = ALIGN_DOWN((void *) addr);
     void * mapped_end = ALIGN_UP((void *) addr + length);
 

+ 3 - 1
LibOS/shim/test/apps/openjdk/Makefile

@@ -102,10 +102,12 @@ $(JRE_DIR)/bin/java $(JAVAC): $(JAVA_SRC)
 		EXTRA_CFLAGS="-fPIC" \
 		NO_DOCS="true" \
 		BUILD_HEADLESS_ONLY="true" \
+		BUILD_HOTSPOT="true" BUILD_JDK="true" \
+		BUILD_LANGTOOLS="false" \
 		BUILD_JAXP="false" BUILD_JAXWS="false" BUILD_CORBA="false" \
 		HOTSPOT_BUILD_JOBS="$(NPROCS)" \
 		TEST_IN_BUILD="false" \
-		hotspot-build jdk-build
+		product_build
 
 $(JAVA_HOME)/bin/java: $(JRE_DIR)/bin/java
 	rm -rf $(JAVA_HOME)

+ 1 - 1
LibOS/shim/test/apps/openjdk/run-java

@@ -1,6 +1,6 @@
 #!/bin/bash
 
-JAVA_FLAGS="-Xmx16m -Xss4m -XX:+UseSerialGC -XX:+DisableExplicitGC -XX:MaxPermSize=0"
+JAVA_FLAGS="-Xmx4m -Xms1m -XX:NewSize=256k -XX:MaxNewSize=1m -Xss1m -XX:+UseSerialGC -XX:-UsePerfData -XX:+DisableExplicitGC -XX:PermSize=1m -XX:MaxPermSize=4m -XX:MinHeapFreeRatio=0 -XX:MaxHeapFreeRatio=30"
 
 if [ "$1" = "-native" ]; then
 	shift

Some files were not shown because too many files changed in this diff