[pypy-commit] pypy stmgc-c7: import stmgc/31f9797a356c
arigo
noreply at buildbot.pypy.org
Fri May 9 19:43:09 CEST 2014
Author: Armin Rigo <arigo at 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"
More information about the pypy-commit
mailing list