Author: Remi Meier <[email protected]>
Branch: c8-small-uniform
Changeset: r1506:4ce8b3189edc
Date: 2014-11-12 11:29 +0100
http://bitbucket.org/pypy/stmgc/changeset/4ce8b3189edc/

Log:    switch allocation to using file pages instead of segment 0

diff --git a/c8/stm/core.h b/c8/stm/core.h
--- a/c8/stm/core.h
+++ b/c8/stm/core.h
@@ -150,7 +150,10 @@
 static
 #endif
        char *stm_object_pages;
-static char *stm_file_pages;
+#ifndef STM_TESTS
+static
+#endif
+       char *stm_file_pages;
 static int stm_object_pages_fd;
 static stm_thread_local_t *stm_all_thread_locals = NULL;
 
diff --git a/c8/stm/gcpage.c b/c8/stm/gcpage.c
--- a/c8/stm/gcpage.c
+++ b/c8/stm/gcpage.c
@@ -6,8 +6,8 @@
 static void setup_gcpage(void)
 {
     /* XXXXXXX should use stm_file_pages, no? */
-    uninitialized_page_start = stm_object_pages + END_NURSERY_PAGE * 4096UL;
-    uninitialized_page_stop  = stm_object_pages + NB_PAGES * 4096UL;
+    uninitialized_page_start = stm_file_pages;
+    uninitialized_page_stop  = stm_file_pages + NB_SHARED_PAGES * 4096UL;
 }
 
 static void teardown_gcpage(void)
@@ -21,8 +21,10 @@
     for (i = 0; i < NB_SEGMENTS; i++) {
         acquire_privatization_lock(i);
     }
-    pages_initialize_shared_for(STM_SEGMENT->segment_num,
-                                (pages_addr - stm_object_pages) / 4096UL, num);
+    pages_initialize_shared_for(
+        STM_SEGMENT->segment_num,
+        get_page_of_file_page((pages_addr - stm_file_pages) / 4096UL),
+        num);
     for (i = NB_SEGMENTS-1; i >= 0; i--) {
         release_privatization_lock(i);
     }
@@ -31,7 +33,7 @@
 
 static int lock_growth_large = 0;
 
-static char *allocate_outside_nursery_large(uint64_t size)
+static stm_char *allocate_outside_nursery_large(uint64_t size)
 {
     /* XXX: real allocation */
     spinlock_acquire(lock_growth_large);
@@ -51,26 +53,27 @@
             stm_fatalerror("uninitialized_page_start changed?");
         }
     }
-    dprintf(("allocate_outside_nursery_large(%lu): %p, seg=%d, page=%lu\n",
-             size, addr, get_segment_of_linear_address(addr),
-             (addr - get_segment_base(get_segment_of_linear_address(addr))) / 
4096UL));
+
+    dprintf(("allocate_outside_nursery_large(%lu): %p, page=%lu\n",
+             size, addr,
+             (uintptr_t)addr / 4096UL + END_NURSERY_PAGE));
 
     spinlock_release(lock_growth_large);
-    return addr;
+    return (stm_char*)(addr - stm_file_pages + END_NURSERY_PAGE * 4096UL);
 }
 
 object_t *_stm_allocate_old(ssize_t size_rounded_up)
 {
     /* only for tests xxx but stm_setup_prebuilt() uses this now too */
-    char *p = allocate_outside_nursery_large(size_rounded_up);
-    memset(p, 0, size_rounded_up);
+    stm_char *p = allocate_outside_nursery_large(size_rounded_up);
+    memset(stm_object_pages + (uintptr_t)p, 0, size_rounded_up);
 
-    object_t *o = (object_t *)(p - stm_object_pages);
+    object_t *o = (object_t *)p;
     o->stm_flags = GCFLAG_WRITE_BARRIER;
 
     dprintf(("allocate_old(%lu): %p, seg=%d, page=%lu\n",
              size_rounded_up, p,
-             get_segment_of_linear_address(p),
-             (p - STM_SEGMENT->segment_base) / 4096UL));
+             get_segment_of_linear_address(stm_object_pages + (uintptr_t)p),
+             (uintptr_t)p / 4096UL));
     return o;
 }
diff --git a/c8/stm/gcpage.h b/c8/stm/gcpage.h
--- a/c8/stm/gcpage.h
+++ b/c8/stm/gcpage.h
@@ -8,4 +8,4 @@
 static void setup_gcpage(void);
 static void teardown_gcpage(void);
 static void setup_N_pages(char *pages_addr, uint64_t num);
-static char *allocate_outside_nursery_large(uint64_t size);
+static stm_char *allocate_outside_nursery_large(uint64_t size);
diff --git a/c8/stm/nursery.c b/c8/stm/nursery.c
--- a/c8/stm/nursery.c
+++ b/c8/stm/nursery.c
@@ -94,13 +94,11 @@
         if (size > GC_LAST_SMALL_SIZE) {
             /* case 1: object is not small enough.
                Ask gcpage.c for an allocation via largemalloc. */
-            char *allocated = allocate_outside_nursery_large(size);
-            nobj = (object_t *)(allocated - stm_object_pages);
+            nobj = (object_t *)allocate_outside_nursery_large(size);
         }
         else {
             /* case "small enough" */
-            char *allocated = allocate_outside_nursery_small(size);
-            nobj = (object_t *)(allocated - stm_object_pages);
+            nobj = (object_t *)allocate_outside_nursery_small(size);
         }
 
         /* copy the object */
@@ -334,8 +332,7 @@
     /*     stm_collect(0); */
     /* } */
 
-    char *result = allocate_outside_nursery_large(size_rounded_up);
-    object_t *o = (object_t *)(result - stm_object_pages);
+    object_t *o = (object_t *)allocate_outside_nursery_large(size_rounded_up);
 
     tree_insert(STM_PSEGMENT->young_outside_nursery, (uintptr_t)o, 0);
 
@@ -387,8 +384,7 @@
     size_t size = stmcb_size_rounded_up((struct object_s *)realobj);
 
     /* always gets outside as a large object for now */
-    char *allocated = allocate_outside_nursery_large(size);
-    object_t *nobj = (object_t *)(allocated - stm_object_pages);
+    object_t *nobj = (object_t *)allocate_outside_nursery_large(size);
 
     /* Initialize the shadow enough to be considered a valid gc object.
        If the original object stays alive at the next minor collection,
diff --git a/c8/stm/pages.h b/c8/stm/pages.h
--- a/c8/stm/pages.h
+++ b/c8/stm/pages.h
@@ -62,6 +62,10 @@
     return pagenum - PAGE_FLAG_START;
 }
 
+static inline uintptr_t get_page_of_file_page(uintptr_t file_page)
+{
+    return file_page + END_NURSERY_PAGE;
+}
 
 static inline uint8_t get_page_status_in(long segnum, uintptr_t pagenum)
 {
diff --git a/c8/stm/smallmalloc.c b/c8/stm/smallmalloc.c
--- a/c8/stm/smallmalloc.c
+++ b/c8/stm/smallmalloc.c
@@ -3,8 +3,8 @@
 #endif
 
 
-#define PAGE_SMSIZE_START   END_NURSERY_PAGE
-#define PAGE_SMSIZE_END     NB_PAGES
+#define PAGE_SMSIZE_START   0
+#define PAGE_SMSIZE_END     NB_SHARED_PAGES
 
 typedef struct {
     uint8_t sz;
@@ -21,7 +21,7 @@
 
 static fpsz_t *get_fpsz(char *smallpage)
 {
-    uintptr_t pagenum = (((char *)smallpage) - stm_object_pages) / 4096;
+    uintptr_t pagenum = (((char *)smallpage) - stm_file_pages) / 4096;
     assert(PAGE_SMSIZE_START <= pagenum && pagenum < PAGE_SMSIZE_END);
     return &full_pages_object_size[pagenum - PAGE_SMSIZE_START];
 }
@@ -46,6 +46,7 @@
 
 static void grab_more_free_pages_for_small_allocations(void)
 {
+    dprintf(("grab_more_free_pages_for_small_allocation()\n"));
     /* Grab GCPAGE_NUM_PAGES pages out of the top addresses.  Use the
        lock of pages.c to prevent any remapping from occurring under our
        feet.
@@ -59,7 +60,7 @@
             goto out_of_memory;
 
         uninitialized_page_stop -= decrease_by;
-        first_small_uniform_loc = uninitialized_page_stop - stm_object_pages;
+        first_small_uniform_loc = uninitialized_page_stop - stm_file_pages;
 
         /* XXX: */
         /* char *base = stm_object_pages + END_NURSERY_PAGE * 4096UL; */
@@ -150,7 +151,7 @@
 }
 
 __attribute__((always_inline))
-static inline char *allocate_outside_nursery_small(uint64_t size)
+static inline stm_char *allocate_outside_nursery_small(uint64_t size)
 {
     OPT_ASSERT((size & 7) == 0);
     OPT_ASSERT(16 <= size && size <= GC_LAST_SMALL_SIZE);
@@ -161,16 +162,28 @@
     struct small_free_loc_s *result = *fl;
 
     if (UNLIKELY(result == NULL))
-        return _allocate_small_slowpath(size);
+        return (stm_char*)
+            (_allocate_small_slowpath(size) - stm_file_pages + 
END_NURSERY_PAGE * 4096UL);
 
     *fl = result->next;
-    return (char *)result;
+    return (stm_char*)
+        ((char *)result - stm_file_pages + END_NURSERY_PAGE * 4096UL);
 }
 
 object_t *_stm_allocate_old_small(ssize_t size_rounded_up)
 {
-    char *p = allocate_outside_nursery_small(size_rounded_up);
-    return (object_t *)(p - stm_object_pages);
+    stm_char *p = allocate_outside_nursery_small(size_rounded_up);
+    memset(stm_object_pages + (uintptr_t)p, 0, size_rounded_up);
+
+    object_t *o = (object_t *)p;
+    o->stm_flags = GCFLAG_WRITE_BARRIER;
+
+    dprintf(("allocate_old_small(%lu): %p, seg=%d, page=%lu\n",
+             size_rounded_up, p,
+             get_segment_of_linear_address(stm_object_pages + (uintptr_t)p),
+             (uintptr_t)p / 4096UL));
+
+    return o;
 }
 
 /************************************************************/
@@ -178,8 +191,11 @@
 static inline bool _smallmalloc_sweep_keep(char *p)
 {
 #ifdef STM_TESTS
-    if (_stm_smallmalloc_keep != NULL)
-        return _stm_smallmalloc_keep(p);
+    if (_stm_smallmalloc_keep != NULL) {
+        // test wants a TLPREFIXd address
+        return _stm_smallmalloc_keep(
+            p - stm_file_pages + (char*)(END_NURSERY_PAGE * 4096UL));
+    }
 #endif
     abort();
     //return smallmalloc_keep_object_at(p);
diff --git a/c8/stm/smallmalloc.h b/c8/stm/smallmalloc.h
--- a/c8/stm/smallmalloc.h
+++ b/c8/stm/smallmalloc.h
@@ -54,7 +54,7 @@
 
 /* Functions
  */
-static inline char *allocate_outside_nursery_small(uint64_t size)
+static inline stm_char *allocate_outside_nursery_small(uint64_t size)
      __attribute__((always_inline));
 
 void _stm_smallmalloc_sweep(void);
diff --git a/c8/stmgc.h b/c8/stmgc.h
--- a/c8/stmgc.h
+++ b/c8/stmgc.h
@@ -80,6 +80,7 @@
 void _push_obj_to_other_segments(object_t *obj);
 
 char *stm_object_pages;
+char *stm_file_pages;
 object_t *_stm_allocate_old_small(ssize_t size_rounded_up);
 bool (*_stm_smallmalloc_keep)(char *data);
 void _stm_smallmalloc_sweep(void);
diff --git a/c8/test/support.py b/c8/test/support.py
--- a/c8/test/support.py
+++ b/c8/test/support.py
@@ -34,6 +34,7 @@
 } stm_thread_local_t;
 
 char *stm_object_pages;
+char *stm_file_pages;
 
 void stm_read(object_t *obj);
 /*void stm_write(object_t *obj); use _checked_stm_write() instead */
diff --git a/c8/test/test_smallmalloc.py b/c8/test/test_smallmalloc.py
--- a/c8/test/test_smallmalloc.py
+++ b/c8/test/test_smallmalloc.py
@@ -12,7 +12,7 @@
         BaseTest.setup_method(self, method)
         @ffi.callback("bool(char *)")
         def keep(data):
-            p = ffi.cast("object_t *", data - lib.stm_object_pages)
+            p = ffi.cast("object_t *", data)
             self.has_been_asked_for.append(p)
             return p in self.keep_me
         lib._stm_smallmalloc_keep = keep
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to