a fix for bluedrop multicore startup crash, where it seems that mmap unmap'ed some...
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 23 Feb 2011 00:08:28 +0000 (18:08 -0600)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 23 Feb 2011 00:08:28 +0000 (18:08 -0600)
Fixed so that isomalloc does not touch that lower region of memory.
This sems to only happen on bluedrop's compute node, not on the frontend node.

src/conv-core/isomalloc.c

index 93792e832616ff32d902fe458d18067b178ce4e2..fc7eab1d32eaefd6bcaf5640cc4a9a66fcbb9126 100644 (file)
@@ -57,7 +57,6 @@ static int read_randomflag(void)
 {
   FILE *fp;
   int random_flag;
-  CmiLock(_smp_mutex);
   fp = fopen("/proc/sys/kernel/randomize_va_space", "r");
   if (fp != NULL) {
     fscanf(fp, "%d", &random_flag);
@@ -74,7 +73,6 @@ static int read_randomflag(void)
   else {
     random_flag = -1;
   }
-  CmiUnlock(_smp_mutex);
   return random_flag;
 }
 
@@ -1670,7 +1668,7 @@ const static memRange_t gig=1024u*1024u*1024u; /*One gigabyte*/
 static int bad_location(char *loc) {
   void *addr;
   addr=call_mmap_fixed(loc,slotsize);
-  if (addr==NULL) {
+  if (addr==NULL || addr!=loc) {
 #if CMK_THREADS_DEBUG
     CmiPrintf("[%d] Skipping unmappable space at %p\n",CmiMyPe(),loc);
 #endif
@@ -1689,6 +1687,7 @@ static memRange_t divide_range(memRange_t len,int n) {
 static int partially_good(char *start,memRange_t len,int n) {
   int i;
   memRange_t quant=divide_range(len,n);
+  CmiAssert (quant > 0);
   for (i=0;i<n;i++)
     if (!bad_location(start+i*quant)) return 1; /* it's got some good parts */
   return 0; /* all locations are bad */
@@ -1699,6 +1698,7 @@ static int partially_good(char *start,memRange_t len,int n) {
 static int good_range(char *start,memRange_t len,int n) {
   int i;
   memRange_t quant=divide_range(len,n);
+  CmiAssert (quant > 0);
   for (i=0;i<n;i++)
     if (bad_location(start+i*quant)) return 0; /* it's got some bad parts */
   /* It's all good: */
@@ -1812,37 +1812,44 @@ static int find_largest_free_region(memRegion_t *destRegion) {
     size_t mmapAnyLen = 1*meg;
     char *mmapAny = (char*) call_mmap_anywhere(mmapAnyLen);
 
-    int i,nRegions=9;
+    int i,nRegions=0;
     memRegion_t regions[10]; /*used portions of address space*/
     memRegion_t freeRegion; /*Largest unused block of address space*/
 
+    /* printf("%p %p %p %p %p %p %p %p \n", staticData, code, threadData, codeDll, heapLil, heapBig, stack, mmapAny); */
+
 /*Mark off regions of virtual address space as ususable*/
-    regions[0].type="NULL";
-    regions[0].start=NULL; regions[0].len=16u*meg;
+    regions[nRegions].type="NULL";
+    regions[nRegions].start=NULL; 
+#if CMK_POWER7 && CMK_64BIT
+    regions[nRegions++].len=2u*gig;   /* on bluedrop, don't mess with the lower memory region */
+#else
+    regions[nRegions++].len=16u*meg;
+#endif
     
-    regions[1].type="Static program data";
-    regions[1].start=staticData; regions[1].len=256u*meg;
+    regions[nRegions].type="Static program data";
+    regions[nRegions].start=staticData; regions[nRegions++].len=256u*meg;
     
-    regions[2].type="Program executable code";
-    regions[2].start=code; regions[2].len=256u*meg;
+    regions[nRegions].type="Program executable code";
+    regions[nRegions].start=code; regions[nRegions++].len=256u*meg;
     
-    regions[3].type="Heap (small blocks)";
-    regions[3].start=heapLil; regions[3].len=1u*gig;
+    regions[nRegions].type="Heap (small blocks)";
+    regions[nRegions].start=heapLil; regions[nRegions++].len=1u*gig;
     
-    regions[4].type="Heap (large blocks)";
-    regions[4].start=heapBig; regions[4].len=1u*gig;
+    regions[nRegions].type="Heap (large blocks)";
+    regions[nRegions].start=heapBig; regions[nRegions++].len=1u*gig;
     
-    regions[5].type="Stack space";
-    regions[5].start=stack; regions[5].len=256u*meg;
+    regions[nRegions].type="Stack space";
+    regions[nRegions].start=stack; regions[nRegions++].len=256u*meg;
 
-    regions[6].type="Program dynamically linked code";
-    regions[6].start=codeDll; regions[6].len=256u*meg; 
+    regions[nRegions].type="Program dynamically linked code";
+    regions[nRegions].start=codeDll; regions[nRegions++].len=256u*meg; 
 
-    regions[7].type="Result of a non-fixed call to mmap";
-    regions[7].start=mmapAny; regions[7].len=1u*gig; 
+    regions[nRegions].type="Result of a non-fixed call to mmap";
+    regions[nRegions].start=mmapAny; regions[nRegions++].len=2u*gig; 
 
-    regions[8].type="Thread private data";
-    regions[8].start=threadData; regions[8].len=256u*meg; 
+    regions[nRegions].type="Thread private data";
+    regions[nRegions].start=threadData; regions[nRegions++].len=256u*meg; 
 
     _MEMCHECK(heapBig); free(heapBig);
     _MEMCHECK(heapLil); free(heapLil); 
@@ -2115,8 +2122,9 @@ static void init_ranges(char **argv)
   /*SMP Mode: wait here for rank 0 to initialize numslots before calculating myss*/
   CmiNodeAllBarrier(); 
   
+  CpvInitialize(slotset *, myss);
+  CpvAccess(myss) = NULL;
   if (isomallocStart!=NULL) {
-    CpvInitialize(slotset *, myss);
     CpvAccess(myss) = new_slotset(pe2slot(CmiMyPe()), numslots);
   }
 }
@@ -2362,13 +2370,11 @@ void CmiIsomallocInit(char **argv)
     disable_isomalloc("mmap() does not work");
   }
   else {
-    if (read_randomflag() == 1) {    /* randomization stack pointer */
-      if (CmiMyPe() == 0) {
-        if (_sync_iso == 1)
+    if (CmiMyPe() == 0 && read_randomflag() == 1) {    /* randomization stack pointer */
+      if (_sync_iso == 1)
           printf("Warning> Randomization of stack pointer is turned on in kernel.\n");
-        else
+      else
           printf("Warning> Randomization of stack pointer is turned on in kernel, thread migration may not work! Run 'echo 0 > /proc/sys/kernel/randomize_va_space' as root to disable it, or try run with '+isomalloc_sync'.  \n");
-      }
     }
     init_ranges(argv);
   }