Author: Armin Rigo <ar...@tunes.org> Branch: stmgc-c7 Changeset: r71433:1dde67e0368a Date: 2014-05-08 15:12 +0200 http://bitbucket.org/pypy/pypy/changeset/1dde67e0368a/
Log: import stmgc/31f9797a356c diff --git a/rpython/translator/stm/src_stm/revision b/rpython/translator/stm/src_stm/revision --- a/rpython/translator/stm/src_stm/revision +++ b/rpython/translator/stm/src_stm/revision @@ -1,1 +1,1 @@ -fb2bc9a3419a +31f9797a356c diff --git a/rpython/translator/stm/src_stm/stm/core.h b/rpython/translator/stm/src_stm/stm/core.h --- a/rpython/translator/stm/src_stm/stm/core.h +++ b/rpython/translator/stm/src_stm/stm/core.h @@ -210,6 +210,7 @@ }; static char *stm_object_pages; +static int stm_object_pages_fd; static stm_thread_local_t *stm_all_thread_locals = NULL; static uint8_t write_locks[WRITELOCK_END - WRITELOCK_START]; diff --git a/rpython/translator/stm/src_stm/stm/forksupport.c b/rpython/translator/stm/src_stm/stm/forksupport.c --- a/rpython/translator/stm/src_stm/stm/forksupport.c +++ b/rpython/translator/stm/src_stm/stm/forksupport.c @@ -9,14 +9,10 @@ static char *fork_big_copy = NULL; +static int fork_big_copy_fd; static stm_thread_local_t *fork_this_tl; static bool fork_was_in_transaction; -static char *setup_mmap(char *reason); /* forward, in setup.c */ -static void setup_protection_settings(void); /* forward, in setup.c */ -static pthread_t *_get_cpth(stm_thread_local_t *);/* forward, in setup.c */ - - static bool page_is_null(char *p) { long *q = (long *)p; @@ -75,7 +71,8 @@ /* Make a new mmap at some other address, but of the same size as the standard mmap at stm_object_pages */ - char *big_copy = setup_mmap("stmgc's fork support"); + int big_copy_fd; + char *big_copy = setup_mmap("stmgc's fork support", &big_copy_fd); /* Copy each of the segment infos into the new mmap, nurseries, and associated read markers @@ -140,6 +137,7 @@ assert(fork_big_copy == NULL); fork_big_copy = big_copy; + fork_big_copy_fd = big_copy_fd; fork_this_tl = this_tl; fork_was_in_transaction = was_in_transaction; @@ -164,6 +162,7 @@ assert(fork_big_copy != NULL); munmap(fork_big_copy, TOTAL_MEMORY); fork_big_copy = NULL; + close_fd_mmap(fork_big_copy_fd); bool was_in_transaction = fork_was_in_transaction; s_mutex_unlock(); @@ -215,6 +214,8 @@ if (res != stm_object_pages) stm_fatalerror("after fork: mremap failed: %m"); fork_big_copy = NULL; + close_fd_mmap(stm_object_pages_fd); + stm_object_pages_fd = fork_big_copy_fd; /* Unregister all other stm_thread_local_t, mostly as a way to free the memory used by the shadowstacks diff --git a/rpython/translator/stm/src_stm/stm/pages.c b/rpython/translator/stm/src_stm/stm/pages.c --- a/rpython/translator/stm/src_stm/stm/pages.c +++ b/rpython/translator/stm/src_stm/stm/pages.c @@ -82,9 +82,18 @@ can only be remapped to page N in another segment */ assert(((addr - stm_object_pages) / 4096UL - pgoff) % NB_PAGES == 0); +#ifdef USE_REMAP_FILE_PAGES int res = remap_file_pages(addr, size, 0, pgoff, 0); if (UNLIKELY(res < 0)) stm_fatalerror("remap_file_pages: %m"); +#else + char *res = mmap(addr, size, + PROT_READ | PROT_WRITE, + (MAP_PAGES_FLAGS & ~MAP_ANONYMOUS) | MAP_FIXED, + stm_object_pages_fd, pgoff * 4096UL); + if (UNLIKELY(res != addr)) + stm_fatalerror("mmap (remapping page): %m"); +#endif } static void pages_initialize_shared(uintptr_t pagenum, uintptr_t count) @@ -170,6 +179,7 @@ static void pages_setup_readmarkers_for_nursery(void) { +#ifdef USE_REMAP_FILE_PAGES /* 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. @@ -188,4 +198,5 @@ /* errors here ignored */ } } +#endif } diff --git a/rpython/translator/stm/src_stm/stm/pages.h b/rpython/translator/stm/src_stm/stm/pages.h --- a/rpython/translator/stm/src_stm/stm/pages.h +++ b/rpython/translator/stm/src_stm/stm/pages.h @@ -20,6 +20,8 @@ #define PAGE_FLAG_START END_NURSERY_PAGE #define PAGE_FLAG_END NB_PAGES +#define USE_REMAP_FILE_PAGES + struct page_shared_s { #if NB_SEGMENTS <= 8 uint8_t by_segment; diff --git a/rpython/translator/stm/src_stm/stm/setup.c b/rpython/translator/stm/src_stm/stm/setup.c --- a/rpython/translator/stm/src_stm/stm/setup.c +++ b/rpython/translator/stm/src_stm/stm/setup.c @@ -4,7 +4,8 @@ #endif -static char *setup_mmap(char *reason) +#ifdef USE_REMAP_FILE_PAGES +static char *setup_mmap(char *reason, int *ignored) { char *result = mmap(NULL, TOTAL_MEMORY, PROT_READ | PROT_WRITE, @@ -14,6 +15,45 @@ return result; } +static void close_fd_mmap(int ignored) +{ +} +#else +#include <fcntl.h> /* For O_* constants */ +static char *setup_mmap(char *reason, int *map_fd) +{ + char name[128]; + sprintf(name, "/stmgc-c7-bigmem-%ld-%.18e", + (long)getpid(), get_stm_time()); + + /* Create the big shared memory object, and immediately unlink it. + There is a small window where if this process is killed the + object is left around. It doesn't seem possible to do anything + about it... + */ + int fd = shm_open(name, O_RDWR | O_CREAT | O_EXCL, 0600); + shm_unlink(name); + + if (fd == -1) { + stm_fatalerror("%s failed (stm_open): %m", reason); + } + if (ftruncate(fd, TOTAL_MEMORY) != 0) { + stm_fatalerror("%s failed (ftruncate): %m", reason); + } + char *result = mmap(NULL, TOTAL_MEMORY, + PROT_READ | PROT_WRITE, + MAP_PAGES_FLAGS & ~MAP_ANONYMOUS, fd, 0); + if (result == MAP_FAILED) { + stm_fatalerror("%s failed (mmap): %m", reason); + } + *map_fd = fd; + return result; +} +static void close_fd_mmap(int map_fd) +{ + close(map_fd); +} +#endif static void setup_protection_settings(void) { @@ -57,7 +97,8 @@ (FIRST_READMARKER_PAGE * 4096UL)); assert(_STM_FAST_ALLOC <= NB_NURSERY_PAGES * 4096); - stm_object_pages = setup_mmap("initial stm_object_pages mmap()"); + stm_object_pages = setup_mmap("initial stm_object_pages mmap()", + &stm_object_pages_fd); setup_protection_settings(); long i; @@ -87,15 +128,16 @@ pr->callbacks_on_abort = tree_create(); pr->overflow_number = GCFLAG_OVERFLOW_NUMBER_bit0 * i; highest_overflow_number = pr->overflow_number; + pr->pub.transaction_read_version = 0xff; } /* The pages are shared lazily, as remap_file_pages() takes a relatively long time for each page. - The read markers are initially zero, which is correct: - STM_SEGMENT->transaction_read_version never contains zero, - so a null read marker means "not read" whatever the - current transaction_read_version is. + The read markers are initially zero, but we set anyway + transaction_read_version to 0xff in order to force the first + transaction to "clear" the read markers by mapping a different, + private range of addresses. */ setup_sync(); @@ -127,6 +169,7 @@ munmap(stm_object_pages, TOTAL_MEMORY); stm_object_pages = NULL; + close_fd_mmap(stm_object_pages_fd); teardown_core(); teardown_sync(); diff --git a/rpython/translator/stm/src_stm/stmgc.c b/rpython/translator/stm/src_stm/stmgc.c --- a/rpython/translator/stm/src_stm/stmgc.c +++ b/rpython/translator/stm/src_stm/stmgc.c @@ -8,6 +8,7 @@ #include "stm/pages.h" #include "stm/gcpage.h" #include "stm/sync.h" +#include "stm/setup.h" #include "stm/largemalloc.h" #include "stm/nursery.h" #include "stm/contention.h" _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit