[pypy-commit] stmgc default: more progress

Raemi noreply at buildbot.pypy.org
Fri Sep 5 11:52:00 CEST 2014


Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: 
Changeset: r1355:3107d8e61582
Date: 2014-09-05 11:07 +0200
http://bitbucket.org/pypy/stmgc/changeset/3107d8e61582/

Log:	more progress

diff --git a/c8/stm/core.c b/c8/stm/core.c
--- a/c8/stm/core.c
+++ b/c8/stm/core.c
@@ -15,12 +15,14 @@
     int my_segnum = STM_SEGMENT->segment_num;
 
     assert(!is_readable_log_page_in(my_segnum, pagenum));
+    assert(!is_private_log_page_in(my_segnum, pagenum));
 
     /* make readable */
     assert(STM_PSEGMENT->privatization_lock); /* we hold it, nobody
                                                  will privatize a page,
                                                  necessary? */
     pages_set_protection(my_segnum, pagenum, 1, PROT_READ|PROT_WRITE);
+    page_privatize(pagenum);
 
     assert(!is_shared_log_page(pagenum));
 
@@ -34,12 +36,30 @@
         assert(is_readable_log_page_in(i, pagenum)); /* still... */
 
         /* copy the content from there to our segment */
+        dprintf(("pagecopy pagenum:%lu, src: %lu, dst:%lu\n", pagenum, i, my_segnum));
         pagecopy((char*)(get_virt_page_of(my_segnum, pagenum) * 4096UL),
                  (char*)(get_virt_page_of(i, pagenum) * 4096UL));
 
         /* get valid state from backup copies of written objs in
            the range of this page: */
         acquire_modified_objs_lock(i);
+        struct tree_s *tree = get_priv_segment(i)->modified_old_objects;
+        wlog_t *item;
+        TREE_LOOP_FORWARD(tree, item);
+        if (item->addr >= pagenum * 4096UL && item->addr < (pagenum + 1) * 4096UL) {
+            object_t *obj = (object_t*)item->addr;
+            struct object_s* bk_obj = (struct object_s *)item->val;
+            size_t obj_size;
+
+            obj_size = stmcb_size_rounded_up(bk_obj);
+            assert(obj_size < 4096); /* XXX */
+
+            assert(obj->stm_flags & GCFLAG_WRITE_BARRIER); /* not written here */
+            memcpy(REAL_ADDRESS(STM_SEGMENT->segment_base, obj),
+                   bk_obj, obj_size);
+            assert(obj->stm_flags & GCFLAG_WRITE_BARRIER); /* still not written */
+        }
+        TREE_LOOP_END;
 
         release_modified_objs_lock(i);
 
@@ -206,14 +226,21 @@
 
         if (i != my_segnum && i != 0)
             pages_set_protection(i, first_page, 1, PROT_NONE);
+        else                    /* both, seg0 and my_segnum: */
+            pages_set_protection(i, first_page, 1, PROT_READ|PROT_WRITE);
     }
 
     /* remap pages for my_segnum and copy the contents */
-    if (i != 0) {
+    set_page_private_in(0, first_page);
+    /* seg0 already up-to-date */
+    if (my_segnum != 0) {
         page_privatize(first_page);
         pagecopy((char*)(get_virt_page_of(my_segnum, first_page) * 4096UL),
                  (char*)(get_virt_page_of(0, first_page) * 4096UL));
     }
+
+    assert(is_private_log_page_in(my_segnum, first_page));
+    assert(is_readable_log_page_in(my_segnum, first_page));
 }
 
 void _stm_write_slowpath(object_t *obj)
diff --git a/c8/stm/pages.c b/c8/stm/pages.c
--- a/c8/stm/pages.c
+++ b/c8/stm/pages.c
@@ -77,15 +77,8 @@
             volatile struct page_shared_s *ps2 = (volatile struct page_shared_s *)
                 &pages_privatized[pagenum + amount - PAGE_FLAG_START];
 
-            if (i == 0) {
-                /* readable & private */
-                ps->by_segment |= bitmask;
-                ps2->by_segment |= bitmask;
-            } else {
-                /* not readable (ensured in setup.c), not private */
-                ps->by_segment &= ~bitmask;
-                ps2->by_segment &= ~bitmask;
-            }
+            ps->by_segment |= bitmask; /* readable */
+            ps2->by_segment = 0; /* not private */
         }
     }
 }
@@ -104,6 +97,8 @@
         return;
     }
 
+    dprintf(("page_privatize(%lu) in seg:%d\n", pagenum, STM_SEGMENT->segment_num));
+
     /* add this thread's 'pages_privatized' bit */
     ps->by_segment |= bitmask;
 
@@ -122,23 +117,23 @@
     /* we hopefully hold the privatization lock: */
     assert(get_priv_segment(segnum)->privatization_lock);
 
-    char *addr = get_segment_base(segnum) + pagenum * 4096UL;
+    char *addr = get_virt_page_of(segnum, pagenum);
     mprotect(addr, count * 4096UL, prot);
 
-    long i;
-    for (i = 0; i < NB_SEGMENTS; i++) {
-        uint64_t bitmask = 1UL << i;
-        uintptr_t amount = count;
-        while (amount-->0) {
-            volatile struct page_shared_s *ps = (volatile struct page_shared_s *)
-                &pages_readable[pagenum + amount - PAGE_FLAG_START];
-            if (prot == PROT_NONE) {
-                /* not readable */
-                ps->by_segment &= ~bitmask;
-            } else {
-                assert(prot == (PROT_READ|PROT_WRITE));
-                ps->by_segment |= bitmask;
-            }
+    dprintf(("pages_set_protection(%d, %lu, %lu, %d)\n",
+             segnum, pagenum, count, prot));
+
+    uint64_t bitmask = 1UL << segnum;
+    uintptr_t amount = count;
+    while (amount-->0) {
+        volatile struct page_shared_s *ps = (volatile struct page_shared_s *)
+            &pages_readable[pagenum + amount - PAGE_FLAG_START];
+        if (prot == PROT_NONE) {
+            /* not readable */
+            ps->by_segment &= ~bitmask;
+        } else {
+            assert(prot == (PROT_READ|PROT_WRITE));
+            ps->by_segment |= bitmask;
         }
     }
 }
diff --git a/c8/stm/pages.h b/c8/stm/pages.h
--- a/c8/stm/pages.h
+++ b/c8/stm/pages.h
@@ -58,6 +58,14 @@
     return pages_privatized[pagenum - PAGE_FLAG_START].by_segment == 0;
 }
 
+static inline void set_page_private_in(long segnum, uintptr_t pagenum)
+{
+    uint64_t bitmask = 1UL << segnum;
+    volatile struct page_shared_s *ps = (volatile struct page_shared_s *)
+        &pages_privatized[pagenum - PAGE_FLAG_START];
+    assert(!(ps->by_segment & bitmask));
+    ps->by_segment |= bitmask;
+}
 
 static inline bool is_private_log_page_in(long segnum, uintptr_t pagenum)
 {
diff --git a/c8/stm/setup.c b/c8/stm/setup.c
--- a/c8/stm/setup.c
+++ b/c8/stm/setup.c
@@ -68,16 +68,6 @@
             mprotect(segment_base + 8192,
                      (FIRST_READMARKER_PAGE - 2) * 4096UL,
                      PROT_NONE);
-
-        if (i != 0) {
-            /* let's give all pages to segment 0 at first, all others
-               need to trap and look for the backup copy */
-            mprotect(segment_base + END_NURSERY_PAGE * 4096,
-                     (NB_PAGES - END_NURSERY_PAGE) * 4096,
-                     PROT_NONE);
-            /* pages_initialize_shared() makes sure pages_readable
-               is initialized correctly */
-        }
     }
 }
 


More information about the pypy-commit mailing list