Open MPI logo

Open MPI Development Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Development mailing list

From: Gleb Natapov (glebn_at_[hidden])
Date: 2006-01-18 09:54:08


Hello,

 I found one more problem with ptmalloc and registration cache.
In arena.c:grow_heap() when heap is shrinking ptmalloc tries to be smart
and is using mmap() to change pages protection instead of mprotect() because
as a side effect mmap() drops underlying pages. In the case the area is
registered we cannot drop pages without notifying registration cache.

I see two solutions either change mmap() to mprotect() or call
opal_mem_hooks_release_hook() after mmap() to remove the area from
cache. I think first approach is better but both patch are included for
your consideration :)

Index: opal/mca/memory/ptmalloc2/arena.c
===================================================================
--- opal/mca/memory/ptmalloc2/arena.c (revision 8727)
+++ opal/mca/memory/ptmalloc2/arena.c (working copy)
@@ -614,10 +614,8 @@
     new_size = (long)h->size + diff;
     if(new_size < (long)sizeof(*h))
       return -1;
- /* Try to re-map the extra heap space freshly to save memory, and
- make it inaccessible. */
- if((char *)MMAP((char *)h + new_size, -diff, PROT_NONE,
- MAP_PRIVATE|MAP_FIXED) == (char *) MAP_FAILED)
+
+ if(mprotect((char *)h + new_size, -diff, PROT_NONE) != 0)
       return -2;
     /*fprintf(stderr, "shrink %p %08lx\n", h, new_size);*/
   }

Index: opal/mca/memory/ptmalloc2/arena.c
===================================================================
--- opal/mca/memory/ptmalloc2/arena.c (revision 8727)
+++ opal/mca/memory/ptmalloc2/arena.c (working copy)
@@ -619,6 +619,8 @@
     if((char *)MMAP((char *)h + new_size, -diff, PROT_NONE,
                     MAP_PRIVATE|MAP_FIXED) == (char *) MAP_FAILED)
       return -2;
+
+ opal_mem_hooks_release_hook ((char *)h + new_size, -diff, 1);
     /*fprintf(stderr, "shrink %p %08lx\n", h, new_size);*/
   }
   h->size = new_size;

--
			Gleb.