Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r1103:785dafe38e34 Date: 2014-03-27 14:07 +0100 http://bitbucket.org/pypy/stmgc/changeset/785dafe38e34/
Log: The nursery page's read markers are never read, but must still be writeable. We'd like to map the pages to a general "trash page"; missing one, we remap all the pages over to the same one. We still keep one page *per segment* to avoid cross-CPU cache conflicts. diff --git a/c7/stm/core.h b/c7/stm/core.h --- a/c7/stm/core.h +++ b/c7/stm/core.h @@ -28,6 +28,8 @@ #define READMARKER_START ((FIRST_OBJECT_PAGE * 4096UL) >> 4) #define FIRST_READMARKER_PAGE (READMARKER_START / 4096UL) +#define OLD_RM_START ((END_NURSERY_PAGE * 4096UL) >> 4) +#define FIRST_OLD_RM_PAGE (OLD_RM_START / 4096UL) #define NB_READMARKER_PAGES (FIRST_OBJECT_PAGE - FIRST_READMARKER_PAGE) #define WRITELOCK_START ((END_NURSERY_PAGE * 4096UL) >> 4) diff --git a/c7/stm/pages.c b/c7/stm/pages.c --- a/c7/stm/pages.c +++ b/c7/stm/pages.c @@ -169,25 +169,22 @@ increment_total_allocated(total); } +static void pages_setup_readmarkers_for_nursery(void) +{ + /* The nursery page's read markers are never read, but must still + be writeable. We'd like to map the pages to a general "trash + page"; missing one, we remap all the pages over to the same one. + We still keep one page *per segment* to avoid cross-CPU cache + conflicts. + */ + long i, j; + for (i = 1; i <= NB_SEGMENTS; i++) { + char *segment_base = get_segment_base(i); -#if 0 -static bool is_fully_in_shared_pages(object_t *obj) -{ - uintptr_t first_page = ((uintptr_t)obj) / 4096UL; - - if ((obj->stm_flags & GCFLAG_SMALL_UNIFORM) != 0) - return (flag_page_private[first_page] == SHARED_PAGE); - - ssize_t obj_size = stmcb_size_rounded_up( - (struct object_s *)REAL_ADDRESS(stm_object_pages, obj)); - - uintptr_t last_page = (((uintptr_t)obj) + obj_size - 1) / 4096UL; - - do { - if (flag_page_private[first_page++] != SHARED_PAGE) - return false; - } while (first_page <= last_page); - - return true; + for (j = FIRST_READMARKER_PAGE + 1; j < FIRST_OLD_RM_PAGE; j++) { + remap_file_pages(segment_base + 4096 * j, 4096, 0, + i * NB_PAGES + FIRST_READMARKER_PAGE, 0); + /* errors here ignored */ + } + } } -#endif diff --git a/c7/stm/pages.h b/c7/stm/pages.h --- a/c7/stm/pages.h +++ b/c7/stm/pages.h @@ -39,6 +39,7 @@ static void page_privatize(uintptr_t pagenum); static void page_reshare(uintptr_t pagenum); static void _page_do_reshare(long segnum, uintptr_t pagenum); +static void pages_setup_readmarkers_for_nursery(void); /* Note: don't ever do "mutex_pages_lock(); mutex_lock()" in that order */ static void mutex_pages_lock(void); diff --git a/c7/stm/setup.c b/c7/stm/setup.c --- a/c7/stm/setup.c +++ b/c7/stm/setup.c @@ -36,6 +36,7 @@ (FIRST_READMARKER_PAGE - 2) * 4096UL, PROT_NONE); } + pages_setup_readmarkers_for_nursery(); } void stm_setup(void) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit